3

我在 C/Obj-C 中实现 TCP。
我注意到不同的服务器在某些情况下会增加序列号,而另一些则不会。即在服务器发送 FIN/ACK 的拆卸过程中,一些服务器将 ACK 编号增加 1,而其他服务器则不增加。

为了澄清问题:

服务器 1: ACK 数量已增加到 2 工作 TCP-Teardown

服务器2: ACK号还是 1。ACK号没有增加http://img853.imageshack.us/img853/1248/zf70.png

我的程序关于第二台服务器的输出:

    FIN(/ACK)# was 18238 but should have been 18239

我应该如何在我的代码中处理这些服务器端实现的变体?

4

1 回答 1

1

您是否为您的实现参考了一些 RFC(s)?我不知道在发送 FIN+ACK 时哪个 RFC 包含正确的行为(是否增加 ACK 号),但我的猜测是 ACK 号确实应该增加。

也就是说,我们都知道“符合 RFC”的实现如何......(而不仅仅是 TCP 实现)!同样,对于破坏连接的消息交换,那些编写软件的人一定是特别粗心的。所以现在你有两个选择:

  • 在您的代码中处理这两种情况 - 当 ACK 增加和不增加时 - 并正确关闭您的连接端,或者
  • 使用 RST 处理不正确的 ACK(请参阅 RFC 以了解正确的行为),但仍会正确关闭连接端

在处理同一标准的不同实现时,这是一个相当普遍的问题(这首先违背了标准的全部目的)。因此请注意,这可能只是您可能遇到的第一个此类问题。

当给定 RFC 的实现在 Linux 中运行良好,但在 Windows 上最基本的测试失败时,我经常不得不添加额外的代码来处理特定情况。

于 2013-10-12T19:44:10.030 回答