找回密码
 立即注册
查看: 24|回复: 0

TCP拆包和粘包的作用是什么

[复制链接]

9400

主题

0

回帖

2万

积分

论坛元老

积分
28208
发表于 2024-3-1 13:27:18 | 显示全部楼层 |阅读模式
首先我们思考一个问题,应用层的传输一个10M的文件是一次性传输完成,而对于传输层的协议来说,为什么不是一次性传输完成呢。
这个有很多原因,比如稳定性,一次发送的数据越多,失足 的概率越年夜 。再比如说为了效率,网络中有时候存在并行的路径,拆分数据包就就能更好的利用这些并行的路径。再有,比如发送和接收数据的时候,都存在缓冲区,缓冲区是在内存中开辟的一块空间,目的是缓冲年夜 量的应用频繁的通过网卡收发数据,这个时候,网卡只能一个一个处理应用的请求。当网卡忙不过来的时候,数据就需要排队了。也就是将数据放入缓冲区。如果每个应用都随意发送很年夜 的数据,可能导致其他应用的实时性遭到破坏。
所以,就是传输层的封装包不克不及 太年夜 。这种限制,一般是以缓冲区年夜 小为单位的,也就是TCP协议,会将数据拆分为不跨越 缓冲区年夜 小的一个个部分。每个部分叫做TCP段(TCP Segment)。
在接收数据的时候,一个个TCP段被重组成原来的数据。
像这样,数据经过拆分,然后传输,然后在目的地重组,就叫拆包。所以拆包就是将数据拆分为多个TCP段传输。有时候,如果发往一个目的地的多个数据太小了,为了防止多次发送占用资源,TCP协议有可能将它们归并 成一个TCP段发送,在目的地再还原成多个数据,这个进程 叫做粘包。所以粘包就是将多个数据归并 成一个TCP段发送。
TCP Segment,下面是一个TCP段的格局 :

1、Source Port 、Destination Port 描述的是发送端口号和目标端口号,代表发送数据的应用法度模范 和接收数据的应用法度模范
2、Sequence Number和Acknowledgment Number 是包管 稳定性的症结 因素,
3、Data Offset是一个偏移量,TCP Header部分的长度是可变的,因此需要一个数值描述数据是从哪个节点开始的。
4、Reserved是很多协议涉及都邑 保存 的一个区域,便利 后期的扩展。
5、URG/ACK/PSH/RST/SYN/FIN是标记 位,用于描述TCP段的行为,也就是TCP封包的具体作用是干啥的。
5.1URG,代表一个紧急的操作,比如是远程用户操作的Ctrl+C,
5.2ACK,代表响应,所有的消息都必须有ACK,这是确保稳定性的一环。
5.3PSH,代表发送数据
5.4SYN,代表发送同步请求,申请握手
5.5FIN,代表结束请求,也是挥手。
以上这个5个标识位,每个占一个比特,可以混合使用,比如ACK+SYN可以同时为1,代表,同步请求和响应请求被归并 了。
6、Window也是TCP包管 稳定性并进行流量控制的对象 ,
7、Checksum 是校验和,用于校验 TCP 段有没有损坏
8、Urgent Pointer 指向最后一个紧急数据的序号(Sequence Number)。它存在的原因是:有时候紧急数据是连续的很多个段,所以需要提前告诉接收方进行准备。
9、Options 中存储了一些可选字段
10、Padding 存在的意义是因为 Options 的长度不固定,需要 Pading 进行对齐。
对于传输数据,稳定性要求数据无损的传输,也就是说拆包获得数据,又需要恢复到原来的样子,所以就要包管 顺序行。这个主要是通过这两个值来包管 。

上图中,发送方发送了100个字节的数据,而接受说明到(Seq=100和Seq=0)两个封包,都是针对发送方(Seq=0)这个封包的。发送100个字节,所以接收到的ACK刚好是100,说明(Seq=0和Seq100)这两个封包是针对接收到第100个字节数据后,发送回来的。这样来确定顺序。对于字节数是200的数据,返回的ACK也是200,所以这个就排列到ACK=300,的前面。而对于字节数是500的字节的数据,返回的ACK应该也是500,所以他排在ACK=300的后面。
所以这个顺序的排列是依据 SequenceNumber 和AcknowledgementNumer 两个值配合 决定的。
SequenceNumber 和Acknowledgement Number
在TCP协议中的设计傍边 ,数据被拆分成很多个部分,部分增加了协议头。归并 成一个TCP段,进行传输,这个进程 ,叫做拆包。这些TCP段经过庞杂 的网络结构,由底层的IP协议,负责传输到目的地,然后进行重组。
总结,TCP拆包的作用是将任务拆分处理,降低整体任务失足 的概率,以及减小底层网络处理的压力。拆包进程 需要包管 数据经过网络的传输,又能恢复到原始的顺序。这中间,需要数学提供包管 顺序的理论依据。TCP利用(发送字节数和接收字节数)的唯一性来确定封包之间的顺序。粘包是为了防止数据量过小,导致年夜 量的传输,而将多个TCP段归并 成一个发送。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|货拉客微商论坛 |网站地图|网站地图

GMT+8, 2024-9-20 20:51 , Processed in 0.075792 second(s), 19 queries , Gzip On.

Powered by Huolake! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表