本文分两部分,第一部分适用于监控场景,第二部分适用于协议栈内部。
第一部分:
说明:
1.基于FLAGS标志位的TCP重组算法都是不可靠的、不准确的
2.TCP重组算法紧密相关的字段是序列号SN(sequence number)、确认号AN(Acknowledgement number)、承载数据长PL(payload segment data length)
3.在某些时候,发送方连续发多个包,可能使用同一个SN与AN
下面的过程,以发送方作为分片方为例
开始
1.开始是突然的,没有和接收者打招呼
2.分片的第一个包与一般包无异常
3.SN、AN初始化为一随机量,计算时作为起始点0
中间
1.AN不变,还是开始那个
2.本次SN = 上次SN + 上次的PL
结束
1.AN不变,还是开始那个
2.本次SN = 上次SN + 上次的PL
问题:
1.什么都不变,怎么知道分片过程结束了呢?
答:在结束之后,由发送方发出的下一个包,AN变化了,这就说明发送方此次之前的包为分片包。
2.作为接收方,总要等到结束后的下一个包,才知道分片结束了,是不是慢了些些呢?
答:如果TCP分片承载的是HTTP,则接收方,可以把HTTP里面的Content-Length预读出来;Content-Length与http协议头长度之和就是前面那些分片包的PL和(忽略了重传包,下面探讨)。
3.重传包怎么办?
答:重传包的SN与被重传包的SN相同,有N条一样的话,就只要一条就OK了。
第二部分:
1.协议栈内部有没快捷的算法加速重组过程?
a).PUSH(与有无分组无关)作为一次会话结束标志,向协议栈上层提交还要等会话的全部包到达。此步可算出会话总长度。
b). reassembly timer(超时晚到的分组片)。
c).结合第一部分的算法。
PS:在移动GPRS环境中,MMS2.0底层的TCP很经常发生分组。
TCP重组算法
最新推荐文章于 2020-12-21 06:37:48 发布