will 发表于 2015-10-8 09:55:03

TCP send和recv中有关buf和可靠传输的概念


因为和机智云云端通讯是建立在TCP协议基础上,有的开发工程师提出了一个担忧:我的通讯模组上内存和处理速度有限,会不会网络来的数据我接收不及时,导致数据溢出丢失的情况。
其实,这种情况是不会出现的,这就要从TCP buf和可靠传输角度说起,下面简单说明一下:


每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否调用recv()读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。recv()所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,并返回,仅此而已。进程调用send()发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send()返回之时,数据不一定会发送到对端去(和write写文件有点类似),send()仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中,发送是TCP的事情,和send其实没有太大关系。接收缓冲区被TCP用来缓存网络上来的数据,一直保存到应用进程读走为止。对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后,发生的动作是:收端通知发端,接收窗口关闭。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。

ShanYe 发表于 2015-10-8 10:24:01

学习啦!谢谢楼主!

alex.lin 发表于 2016-2-15 18:49:45

学习了学习了。
页: [1]
查看完整版本: TCP send和recv中有关buf和可靠传输的概念