粘包

基于TCP的socket编程

1.发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据包,合并成一个大的数据包发送(把发送端的缓冲区填满一次性发送)。

2接收端底层会把tcp段整理排序交给缓冲区,这样接收端应用程序从缓冲区取数据就只能得到整体数据而不知道怎么拆分

这两个原因是tcp是面向流的协议

 

比如发送端发送了一个由2个100字节组成的200字节的数据包到接受端的缓冲区,接受端从缓冲去一次取80字节的数据,那么第一次取的就是一个不完整的数据包,第二次取就会带上第一个数据包的尾部和下一个数据包的头

 

注:一次取多少数据通过socket.recv(80)定义

 

 

 

为什么udp不会粘包

1.TCP协议是面向流的协议,UDP是面向消息的协议

UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据

 

2.UDP具有保护消息边界,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样对于接收端来说就容易进行区分处理了。传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。接收端一次只能接收发送端发出的一个数据包,如果一次接受数据的大小小于发送端一次发送的数据大小,就会丢失一部分数据,即使丢失,接受端也不会分两次去接收

 

转自https://zhuanlan.zhihu.com/p/41709589

posted @ 2019-03-12 12:39  Operater  阅读(125)  评论(0编辑  收藏  举报