ACK和SEQs背后的基本原理?

时间:2010-03-01 19:45:51

标签: networking network-programming tcp network-protocols

我不确定人们是否觉得这很明显,但我有两个问题:

  1. 在3次握手期间,为什么ACK = SEQ + 1,即为什么我要为发件人期待的下一个字节进行确认?
  2. 握手后,我的ACK = SEQ + len。为什么这与握手有所不同?为什么不只是确认我期待的下一个字节(与握手期间相同)?
  3. 我知道我一定错过了一个基本点。有人可以澄清一下吗?

3 个答案:

答案 0 :(得分:6)

这是因为序列号空间的第一个字节对应于SYN标志,而不是数据字节。 (最后的FIN标志也会消耗一个字节的序列号空间。)

答案 1 :(得分:3)

在握手期间,您正在进行同步。序列号是已知数据。一旦同步,数据长度就是已知数据以及有用的伪随机验证器。发件人知道他发送了多少,如果你回复,他认为你得到了它。这比回复更简单,例如数据的校验和或散列,通常就足够了。

答案 2 :(得分:0)

SYN和FIN标志都会导致流的序列号递增1。因此

SYN (seq x) -------------->
                           <--- SYNACK (ack x+1, seq y)
ACK (seq x+1, ack y+1) --->

是你的三方握手吗?这样做是因为SYN和FIN需要确认收据。这样,在连接的生命周期中,每个人都可以在同一页面上。

理论上,部分TWHS中的任何数据包都可能有有效载荷,但如果设置了SYN标志的数据包中的任何一个都有有效载荷,则相反的一方需要确认数据和标志。