您的位置:首页 > 理论基础 > 计算机网络

[TCP/IP] TCP与UDP不同的包处理方式

2017-09-08 18:26 274 查看

TCP与UDP不同的包处理方式

声明:本文转载自博客

UDP发包的问题

举个例子:udp发送两次数据,第一次发送100字节, 第二字发送200字节,接收方一次recvfrom(1000),收到是100,还是200,还是300?

UDP是数据报文协议,是以数据包形式,所以每次可以接收100,200,在理想情况下,第一次是无论recvfrom多少都是接收到100,当然可能由于网络原因,第二个包先到的话,有可能是200了。对可能由于网络原因乱序,所以可能先收到200,所以自定义的udp协议包头里都要加上一个序列号,标识发送与收包对应。

TCP发包问题

举个例子:如果换成tcp, 第一次发送 100字节 ,第二次发送200字节,recv( 1000 )会接收到多少?

tcp是流协议,所以recv( 1000 ),会收到300 tcp自己处理好了重传,保证数据包的完整性

有分片的情况

举个例子:如果MTU是1500,使用UDP发送 2000,那么recvfrom(2000)是收到1500,还是2000?

还是接收2000,数据分片由ip层处理了,放到udp还是一个完整的包。接收到的包是由路由路径上最少的MTU来分片,注意转到UDP已经在是组装好的(组装出错的包会经crc校验出错而丢弃),是一个完整的数据包

TCP粘包

举个例子:由于TCP是流协议,对于一个socket的包,如发送 10AAAAABBBBB两次,由于网络原因第一次又分成两次发送, 10AAAAAB和BBBB,如果接包的时候先读取10(包长度)再读入后续数据,当接收得快,发送的慢时,就会出现先接收了 10AAAAAB,会解释错误 ,再接到到BBBB10AAAAABBBBB,也解释错误的情况。这就是TCP的粘包。

解决的办法TLV方式,先接收包头,在包头里指定包体长度来接收。设置包头包尾的检查位(如群空间0x2开头,0x3结束来检查一个包是否完整)。对于TCP来说:1)不存在丢包,错包,所以不会出现数据出错 2)如果包头检测错误,即为非法或者请求,直接重置即可

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tcp udp 包处理