计算机网络⑨ —— 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则是⾯向消息传输的,是有保护消息边界的,接收⽅⼀次只接受⼀条独⽴的信息,所以不存在粘包问题。
相关推荐
wxdlfkj2 分钟前
微米级精度的光谱共焦位移传感器在多层透明极片涂层厚度测量中的应用
网络·人工智能·自动化
JY.yuyu3 分钟前
华为设备配置RIP,VLAN,MAC地址
网络·华为
Json____4 分钟前
springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
java·spring boot·后端·tcp/ip
HyperAI超神经6 分钟前
【TVM 教程】交叉编译与 RPC
网络·人工智能·网络协议·rpc·gpu·编程语言·tvm
专业开发者10 分钟前
技术说明:基于 Wi-Fi Aware™的 Miracast® 应用
linux·运维·网络
电商API_1800790524713 分钟前
主流电商平台 API 横向测评:淘宝、京东、拼多多接口能力与对接成本分析
大数据·开发语言·网络·数据库·人工智能
老蒋新思维12 小时前
创客匠人视角:智能体重构创始人 IP,知识变现从 “内容售卖” 到 “能力复制” 的革命
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现
老蒋新思维14 小时前
创客匠人:认知即资产 ——AI 时代创始人 IP 知识变现的底层逻辑
网络·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人
Neolnfra15 小时前
任意文件上传漏洞
计算机网络·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构
白驹过隙^^15 小时前
OB-USP-AGENT安装使用方法
数据库·经验分享·网络协议·tcp/ip·github·ssl