Python—TCP的黏包问题以及UDP的分片问题,


TCP协议与UDP协议

TCP与UDP的不同接包处理方式

1.TCP的发包问题

问:tcp 发送两次数据,第一次发送100字节 ,第二次发送200字节, 接包方一次recv( 1000 )会接收到多少?收到是 100,还是200,还是300?

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

2.UDP的发包问题

问:udp 发送两次数据,第一次发送100字节 ,第二次发送200字节, 接包方一次recvfrom( 1000 )会接收到多少?收到是 100,还是200,还是300?

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

3.有分片的情况下如下处理

问:如果MTU是1500,Client发送一个8000字节大小的UDP包,那么Server端阻塞模式下接包,在不丢包的情况下,recvfrom(9000)是收到1500,还是8000。如果某个IP分片丢失了,recvfrom(9000),又返回什么呢?

答:根据UDP通信的有界性,在buf足够大的情况下,接收到的一定是一个完整的数据包,UDP数据在下层的分片和组片问题由IP层来处理,提交到UDP传输层一定是一个完整的UDP包,那么recvfrom(9000)将返回8000。如果某个IP分片丢失,udp里有个CRC检验,如果包不完整就会丢弃,也不会通知是否接收成功,所以UDP是不可靠的传输协议,那么recvfrom(9000)将阻塞。

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

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

http://www.360doc.com/content/20/0226/20/68763366_895040549.shtml

http://www.360doc.com/content/17/0707/14/33093582_669586885.shtml

http://www.360doc.com/content/17/0724/11/33093582_673722332.shtml

https://blog.csdn.net/caoshangpa/article/details/51530685

https://www.cnblogs.com/x_wukong/p/5995525.html

https://www.cnblogs.com/zsychanpin/p/6795524.html

https://www.cnblogs.com/xiao-apple36/p/9276777.html

https://www.cnblogs.com/weihengblog/p/8618372.html

相关内容

    暂无相关文章

评论关闭