【问题标题】:Inconsistent implementations of TCPTCP的不一致实现
【发布时间】:2013-10-12 15:16:44
【问题描述】:

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

澄清问题:

服务器 1: ACK 号已增加到 2

服务器 2: ACK 号仍为 1。 ACK number not increased http://img853.imageshack.us/img853/1248/zf70.png

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

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

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

【问题讨论】:

  • 你的目的是什么?您是在实现 TCP/IP 堆栈(通常是操作系统的一部分),还是在编写 TCP 客户端TCP 服务器(应用程序)?
  • 我正在实现 TCP/IP 堆栈,从创建 IP 标头到解析 TCP 数据包。
  • 如果您对 ACK 号码不满意,那么您应该使用 RST 中止。如图所示。
  • 记得Postel's Law

标签: c networking tcp


【解决方案1】:

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

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-01-08
  • 2020-07-14
  • 2013-05-06
  • 2019-08-09
  • 2016-02-09
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多