- 论坛徽章:
- 1
|
本帖最后由 jiufei19 于 2010-03-19 23:12 编辑
回复 4# eexplorer
非常感谢eexplorer的解释,你的如下说明的确是正确的
----------------------------------
考虑如下场景:
发送方发了[1-1024][1025-2048][2049-3072][3073-4096]四个包,如果第一个包收到了,但是第二个包掉了,同时第3,4个包也收到了。假设接收方发送了如下3个ACK:
ACK1: seq = 1, ack = 1025 ts1 (收到segment 1)
ACK2: seq = 1, ack = 1025 ts2 (收到segment 3)
ACK3: seq = 1, ack = 1025 ts3 (收到segment 4)
假如发送方收到的顺序是ACK1, ACK3, ACK2。在发送方收到ACK2的时候,因为ts2 < ts3,那么paws_check的时候就会被reject。但是ACK2有可能含有有用的信息(如sack option),tcp_disordered_check就是为了防止这种错误发生。
-----------------------------------
后半截的如下说明我进行下补充
------------------------------
这样做的一个漏洞就是,如果sender的sequence space正好发生了回绕,而如果ACK2是没回绕之前的ACK的话,照理是应该被丢弃
------------------------------
假定回绕发生后产生了一个ACK2_wrap,这个ACK2_wrap先到达local方,而ACK2后到达,显然ACK2_wrap的TS2_w比TS2要晚,因此按照普通PAWS的处理原则,应该丢弃ACK2,但是这个ACK2可能携带了有用信息,于是只要这个ACK2的时间戳和最近的时间戳记录值ts_recent相差不要太大,则仍然可以继续接受,否则这个ACK2就要被PAWS检查所丢弃(例如在HZ=1000下,也就是不要差过一个rto,其含义就是只要local方还没有启动重传前都可以接受,否则因为重传已经启动了,这个ACK2就可以被直接丢弃了,也即因为重传已经发生了,ACK2所携带的改进重传的信息如SACK已经失去了意义) |
|