计算机网络⑨ —— 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则是⾯向消息传输的,是有保护消息边界的,接收⽅⼀次只接受⼀条独⽴的信息,所以不存在粘包问题。
相关推荐
Ciderw22 分钟前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
lihuhelihu30 分钟前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
幸运超级加倍~37 分钟前
软件设计师-上午题-15 计算机网络(5分)
笔记·计算机网络
Tony聊跨境1 小时前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
2403_875736872 小时前
道品科技智慧农业中的自动气象检测站
网络·人工智能·智慧城市
Tassel_YUE4 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
Diamond技术流4 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
Spring_java_gg4 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
方方怪5 小时前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
weixin_442643426 小时前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统