- 1
- 0
- 约1.55千字
- 约 5页
- 2021-09-27 发布于山东
- 举报
Linux下的TCP的粘包问题和常用解决方案
Linux下的TCP的粘包问题和常用解决方案
PAGE / NUMPAGES
螂PAGE
蚇膅
肇芈
螂肃
螂螆
肈肈
薅膈
螅肀
袂肄
葿蚇
芆肈
薄芁
羂薆
羀芆
螄羈
莂蒃
肂袄
莀螆
蒆袈
莅螄
膂膃
蒇虿
蚆螈
蚂蚁
螀螅
莆芈
膄蚈
蒁羂
袀羃
螇袇
袆蚈
膀膃
罿薅
膈蒆
莄蕿
芃肀
聿袃
莅肅
肆葿
羂莁
聿莅
螆羈
蒄荿
螁薂
腿蚃
膇薈
膅艿
螄
Linux下的TCP的粘包问题和常用解决方案
Linux下的TCP的粘包问题和常用解决方案
Linux下的socket编程实践 TCP的粘包问题和常用解决
方案
TCP粘包问题的产生因为 TCP协议是鉴于字节流而且无边
界的传输协议,所以很有可能产生粘包问题。别的,发送方
惹起的粘包是由 TCP协议自己造成的, TCP为提升传输效
率,发送方常常要采集到足够多的数据后才发送一个 TCP
段。若连续几次需要 send的数据都极少,往常 TCP会依据
优化算法把这些数据合成一个 TCP段后一次发送出去,可是
接收方其实不知道要一次接收多少字节的数据,这样接收方就
收到了粘包数据。详细能够见下列图: 假定主机 Asend了两
条信息M1和M2各10k给主机B,因为主机B一次提取的
字节数是不确立的,接收方提取数据的状况可能是: 一次
性提取20k数据
分两次提取,第一次 5k,第二次 15k
分两次提取,第一次 15k,第二次5k
分两次提取,第一次 10k,第二次10k(仅仅正确)
分三次提取,第一次 6k,第二次 8k,第三次6k
其余任何可能
粘包问题产生的多种原由:1、SQ_SNDBUF套接字自己有缓冲区大小的限制(发送缓冲区、接受缓冲区)2、TCP传
送的端
MSS
大小限制
3、链路层也有
MTU
大小限制,假如
数据包大于
gt;MTU
要在
IP
层进行分片,致使数据切割。
4、
TCP
的流量控制和拥堵控制,也可能致使粘包
5、文章开始
提到的TCP延缓确认体制等注:对于MTU和MSSMSS指的是TCP中的一个观点。MTU是一个没有固定到特定OSI层的观点,不受其余特定协议限制。也就是说第二层会有
MTU,第三层会有MTU,像MPLS这样的第2.5层协议,也有自己的MTU值。而且不一样层之间存在关系关系。举个例子:假如你要迁居,需要把东西打包,用车运走。这样的
状况下,车的大小受路的宽度限制;箱子的大小受车限制;能够搬运的东西的大小受箱子的限制。这时能够将路的宽度
理解成第二层的MTU,车的大小理解成第三层的
MTU,箱
子的大小理解成第四层的
MTU,搬运的东西理解成
MSS。
粘包问题的解决方案(实质上是要在应用层保护信息和信息
之间的界限)(1)定长包该方式其实不适用
:假如所定义的长度
过长,则会浪费网络带宽
,增添网络负担;而又假如定义的长
度太短,则一条信息又会拆分红为多条
,仅在TCP的应用一
层就增添了归并的开支。
(2)包尾加\r\n(FTP使用方案)如
果信息自己含有\r\n字符,则也分不清信息的界限
;(3)报文长
度+报文内容,自定义包构造(4)更复杂的应用层协议注:简
单的使用setsockopt设置开启TCP_NODELAY禁用Nagle’
sAlgorithm能够解决上述第 5个问题(延缓确认体制)。
1234staticvoid_set_tcp_nodelay(intfd){ intenable=1;
setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,
(void*)amp;enable,sizeof(enable));}
原创力文档

文档评论(0)