计算机网络⑨ —— 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则是⾯向消息传输的,是有保护消息边界的,接收⽅⼀次只接受⼀条独⽴的信息,所以不存在粘包问题。
相关推荐
星夜夏空992 小时前
网络编程(1)
服务器·网络
上海云盾-小余2 小时前
中小站点防护避坑:低价高防服务存在的各类安全短板剖析
网络·爬虫·安全·ddos
数据知道5 小时前
邮件安全实战:SPF/DKIM/DMARC 配置与钓鱼绕过
网络·安全·web安全·网络安全·邮件安全
玩转4G物联网5 小时前
FS800DTU 新品上线|免费使用 DMP 设备管理平台,支持远程批量配置 & OTA 升级
物联网·网络协议·tcp/ip·云平台·核心板·fs800dtu·iot管理平台
王莎莎-MinerU5 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
Chloeis Syntax5 小时前
JAVAEE初阶 --- 构造HTTP请求
网络·网络协议·http·postman
砚凝霜6 小时前
软考网络工程师|第 1 章 计算机网络基础 完整备考笔记
网络·笔记·计算机网络
rcms152702692186 小时前
NIKON 4S019-394 接口模块
网络
某不知名網友6 小时前
Linux Socket 编程完整讲解
网络
ICT系统集成阿祥6 小时前
不用复杂命令,快速定位二层 / 三层网络故障
网络·网络排查·二层故障·三层故障