收藏官网首页
查看: 10733|回复: 2

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

52

主题

66

帖子

528

积分

版主

Rank: 7Rank: 7Rank: 7

积分
528
跳转到指定楼层
楼主
发表于 2015-10-8 09:55:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发

因为和机智云云端通讯是建立在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将丢弃它。

17

主题

57

帖子

426

积分

版主

Rank: 7Rank: 7Rank: 7

积分
426
沙发
发表于 2015-10-8 10:24:01 | 只看该作者
学习啦!谢谢楼主!

56

主题

144

帖子

1066

积分

金牌会员

Rank: 6Rank: 6

积分
1066
QQ
板凳
发表于 2016-2-15 18:49:45 | 只看该作者
学习了学习了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表