加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之socket(五) tcp流协议产生的粘包问题和解决方案

发布时间:2013-09-14 20:38:48 所属栏目:Linux 来源:站长网
导读:我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一 次提走3K或6K数据,或者一次只提走几个字节的数
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一 次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流 (stream),在底层通讯中这些数据可能被拆成很多数据包来发送,但是一个数据包有多少字节对应用程序是不可见的,因 此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程 序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。

一、粘包问题可以用下图 来表示:

假设主机A发送了两个数据包M1和M2给主机B,由于主机B一次接收的字节数是不确定的,故可能存在上图的4种情 况,

1、分两次接收两个数据包,一次一个,没有粘包问题;

2、一次接收了两个数据包,存在粘包问题;

3、第一个接收了M1和M2的一部分,第二次接收M2的另一部分,存在粘包问题;

4、第一次接收了M1的一部分 ,第二次接收M1的另一部分和M2,存在粘包问题;

当然实际的情况可能不止以上4种,可以得知的是在互联网上通信 很容易造成粘包问题。

 

二、粘包问题产生的原因

如下图所示,产生的原因主要有3个,当应用程序 write 写入的大小大于套接口发送缓冲区大小时;当进行MSS大小的tcp分段时;当以太网帧的payload大于MTU进行ip分片时 ;都很容易产生粘包问题。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读