【问题标题】:TCP sequence number tricks on split-TCP拆分 TCP 上的 TCP 序列号技巧
【发布时间】:2013-03-20 17:05:32
【问题描述】:

我想搭建这样一个系统,有3个节点,A,B和C A和B建立TCP连接,然后A告诉C端口,序列号(seq_no)和确认序列号(ack_seq_no)。然后 C 向 B 发送数据包(C 和 A 共享同一个 IP 但彼此相距较远,例如 C 欺骗 A 的 IP)

如果 B 从不向 IP(A) 发送数据包(仅 ACK),C 可以向 B 发送具有正确 seq_no 和 ack_seq_no 的数据包,但有时如果 B 向 IP(A) 发送数据包 P1,

1 A 立即向 B 发送数据包 P1 的 ACK,A 告诉 C 新的 ack_seq_no。但是 A 和 C 之间有一个延迟,所以在 C 知道新的 ack_seq_no 之前,C 可能会发送一些数据包(带有欺骗 IP(A))到 B 带有过时的 ack_seq_no。

我的第一个问题是:当 C 收到一个带有过时 ack_seq_no 的数据包时,它的行为是什么

2 如果我将 p1 的 ACK 从 A 延迟到 B,我让 A 先告诉 C,然后发送 p1 的 ACK。有2个问题:

1) 由于B在等待A的p1的ACK,它可能会重传p1的数据包,如何增加重传超时时间?如果每次 A 回复 ACK 都有这样的延迟,那么超时时间自然会增加,那不是问题吗?

2) 如果 C 在 A 到 B 的 ACK(for p1) 之前向 B(IP 为 A) 发送数据包。这意味着数据包具有更新的 ack_seq_no,但 B 不知道其新的 ack_seq_no A是否知道(因为ACK尚未到达),所以它可能认为ACK是在数据包上捎带的?那么 B 将如何处理迟到的 ACK 呢?

【问题讨论】:

    标签: networking tcp network-programming


    【解决方案1】:
    1. 如果收到过时的 ACK,则 ACK 将被忽略(假定它是延迟的旧数据包)。每个 ACK​​ 都会确认导致它的所有内容(我假设您没有发送选择性 ACK)。

    2. 发送方应根据确认响应时间调整其重传超时时间。

    3. B 无法区分来自 A 或 C 的 ACK。就它而言,这与问题 #1 相同——迟到的 ACK 将被忽略。

      李>

    【讨论】:

    • for 1) 不是过时的ACK,是带有过时的ack_seq_no的数据包,所以你的意思是数据包会被忽略?
    • for 2),你的意思是如果我把 p1 的 ACK 从 A 延迟到 B,那么 B 会调整它的重传超时时间,重传只发生在开始,不会发生从稍后的。这意味着我的延迟策略可以正常工作!
    • 如果数据包中的数据序列号高于已经收到的数据,则处理该数据包中的数据。如果确认低于先前收到的确认,则将忽略该确认。
    • for 3)B从C收到的数据包是数据包,不是ACK,但是数据包带有更新的ack_seq_no,所以你的意思是B会认为数据包来自C 作为 ACK 捎带数据(或者换句话说,一个数据包捎带 ACK)
    • 所有数据包(除了最初的SYN)都是ACK,有些还包含数据。接收方独立处理确认号和数据。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2011-02-09
    • 1970-01-01
    • 2016-01-18
    • 2017-08-21
    相关资源
    最近更新 更多