TCP的实现不一致

时间:2013-10-12 15:16:44

标签: c networking tcp

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

澄清问题:

服务器1: ACK号码已增加到2 Working TCP-Teardown

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 处理代码中的两种情况 - 当ACK递增时和不成功时 - 并正确关闭连接的结束,或
  • 使用RST废弃不正确的ACK(请参阅RFC以获取正确的行为),但仍然可以正常关闭连接结束

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

我经常不得不添加额外的代码来处理特定情况,因为某个RFC的实现在Linux中可以很好地工作,并且无法在Windows上进行最基本的测试。