Linux下TCP粘包问题和常用解决方案.docVIP

  • 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)

1亿VIP精品文档

相关文档