计算机网络⑨ —— TCP粘包与拆包

1. 什么是TCP粘包与拆包

  • TCP作为传输层协议并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进⾏数据包的划分,所以在业务上认为是⼀个完整的包,可能会被TCP拆分成多个包进⾏发送,也有可能把多个⼩的包封装成⼀个⼤的数据包发送,这就是所谓的TCP粘包和拆包问题。
  • 产生原因:
    • TCP是以流的⽅式传输数据的,传输的最⼩单位为⼀个报⽂段(Segment)。报文段header中有个options标识位,里面有个标识MSS(Maximum Segment Size),他的大小是传输数据的最大限制MTU(Maximum Transmission Unit)减去TCP报文段header的大小,一般为1460bit,也就是180多字节,超过这个大小就要分成多个报⽂段传输。
    • TCP为提⾼性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了以后,再将缓冲中的数据发送到接收⽅。同理,接收⽅也有缓冲区这样的机制来接受数据。
      • 若应⽤程序写⼊数据⼤于套接字缓冲区⼤⼩,会发⽣拆包
      • 若应⽤程序写⼊数据⼩于套接字缓冲区⼤⼩,⽹卡会将应⽤多次写⼊的数据一起发送到⽹络上,这将会发送粘包
      • 若TCP报文长度-TCP header长度 > MSS时,会发送拆包
      • 若接收⽅不及时读取套接字缓冲区数据,这将发⽣粘包

2. 如何处理粘包和拆包

2.1 TCP Negal算法

  • 通信双方会发送很多小的数据包,每次传输数据都要经历TCP确认、校验等各种流程,这样会造成网络资源的浪费,Negal算法会让多个小包组合成一个大包一起发送,这样就可以提高网络传输的效率
  • 但是会出现问题,比如分属两个不同页面的包被合并在一起了,那么如何区分?这就是粘包问题

2.2 处理方法

  • 处理粘包的方法:
    • 发送⽅对于发送⽅造成的粘包问题,可以通过关闭Nagle算法来解决,可以使⽤TCP_NODELAY选项来关闭算法
    • 接收⽅没有办法来处理粘包现象,只能将问题交给应⽤层来处理。
      • 解决办法:循环处理,应⽤程序从接收缓存中读取分组时,读完⼀条数据,就应该循环读取下⼀条数据,直到所有数据都被处理完成,判断每条数据的⻓度的⽅法有两种:
        • 格式化数据:每条数据有固定的格式(开始符,结束符),这种⽅法简单易⾏,但是选择开始符和结束符时⼀定要确保每条数据的内部不包含开始符和结束符。
        • 发送长度:发送每条数据时,将数据的⻓度⼀并发送,例如规定数据的前4位是数据的⻓度,应⽤层在处理时可以根据⻓度来判断每个分组的开始和结束位置。
  • 处理拆包的方法:
    • 通过包头+包⻓+包体的协议形式,当服务器端获取到指定的包⻓时才说明获取完整
    • 指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整

3. UDP会不会产生粘包问题?

  • TCP为了保证可靠传输并减少额外的开销,采⽤了基于流的传输,基于流的传输不认为消息是⼀条⼀条的,是⽆保护消息边界的
    • 保护消息边界:指传输协议把数据当做⼀条独⽴的消息在⽹上传输,接收端⼀次只能接受⼀条独⽴的消息。
  • UDP则是⾯向消息传输的,是有保护消息边界的,接收⽅⼀次只接受⼀条独⽴的信息,所以不存在粘包问题。
相关推荐
碧海银沙音频科技研究院3 小时前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
EasyDSS7 小时前
连锁扩张管控难?一套视频会议/直播/点播/集群对讲EasyDSS音视频云平台打通门店全流程数字化
网络·音视频·easydss
比兔代理9 小时前
游戏、直播、远程办公遇到动态IP怎么办?
网络
Lzg_na9 小时前
ARP 地址解析协议详解
网络·网络协议
北京盛世宏博10 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
上海广测检测科技有限公司10 小时前
消费类智能联网设备安全分级国标征求意见要点解析:三级五维框架与跨境对标逻辑
网络·经验分享
QZ1665609515911 小时前
金融数据流转监测排行:从看见到拦截的距离
网络·安全·网络安全·金融
zxanz113 小时前
SSL 证书申请下来快吗?
网络·网络协议·ssl
false_or_true13 小时前
一次由 tcp_tw_recycle 引发的“灵异”故障排查:基于双网闸架构的踩坑记
网络·tcp/ip·架构
爱写代码的倒霉蛋14 小时前
我用book-to-skill把尹圣雨的《TCP/IP网络编程》做成了知识库(适合快速入门网络编程)
网络·网络编程·知识库