代码之家  ›  专栏  ›  技术社区  ›  zero_dev

当TCP序列号不是预期的到达时会发生什么?

  •  5
  • zero_dev  · 技术社区  · 13 年前

    我正在编写一个使用libpcap捕获数据包并重新组装TCP流的程序。我的程序只是监控流量,所以我无法控制数据包的接收和传输。我的程序忽略所有非TCP/IP流量。

    我从ISN计算下一个预期序列号,然后计算连续的SEQ编号。我设置了它,以便每个TCP连接都由一个由源IP、源端口、dest IP和dest端口组成的元组唯一标识。一切都很顺利,直到我收到一个序列号与预期不同的数据包。我上传了屏幕截图,以帮助说明我所描述的内容 here

    我的问题是: 1.“丢失”数据包中的数据在哪里? 2.SEQ编号顺序如何从这种情况中恢复? 3.我能做些什么来处理这些事件。

    请记住;然而,我并不是在编写一个遵循TCP的程序。我正在编写一个程序,该程序被动地监控TCP流的网络流量,并试图将原始数据保存到磁盘,我对为什么会出现上述状态以及如何编程来处理它感到困惑。

    非常感谢。

    2 回复  |  直到 13 年前
        1
  •  13
  •   Community CDub    3 年前

    “丢失”数据包中的数据在哪里?

    • 它被人扔了
    • 它得到了 lost 在路上(绕行错误),稍后到达

    SEQ编号顺序如何从这种情况中恢复

    接收器注意到该段不符合顺序 不将其发送到应用程序 ,从而履行其契约:按顺序可靠的字节流。现在,得到缺失部分的实际情况非常复杂,而且随着堆栈的不同而有所不同。简而言之,堆栈等待丢失的部分到达。

    • 接收器可以丢弃序列外的段,也可以将它们排入重新组装队列
    • 接收器可以等待丢失的分段到达,或者可以立即发送之前已经发送的ACK。重复的ACK将提醒对等方出现问题(查找 Fast Retransmit )
    • 发送确认时,TCP可以通知对等方 一些 片段成功到达-它们只是顺序不对( SACK )

    我能做些什么来处理这些事件

    你不能做任何事情,因为你只是在监视。如果你也捕捉到了响应流量,你可能会对实际发生的事情有更多的了解。

        2
  •  1
  •   Community CDub    3 年前

    根据当前TCP连接的窗口大小,如果新数据包适合接收窗口(多数据包缓冲区),则它将被输入接收队列(并重新排序,以便按顺序传递到协议客户端)。

    如果序列号大于当前窗口的最大值,则数据包将被拒绝。

    另请参见 RFC 675

    推荐文章