2011-02-23 113 views
2

因此,客户端通过向seq服务器发送SYN数据包来启动TCP连接。 #X.服务器然后用X + 1的SYN + ACK作出响应。关闭连接协议制定时,FIN数据包也是如此。TCP三次握手问题

所以我的问题是为什么服务器确认X + 1而不是X?我认为SYN和FIN数据包没有捎带任何数据。有没有其他原因呢?我很困惑,为什么服务器将确认X + 1而不是X.

+0

文献[由雷蒙德S.汤姆林森选择序列号(http://ccr.sigcomm.org/archive/1995/jan95/ccr-9501-tomlin75.ps)讨论了用于选择的序列号的技术。 – 2015-12-23 15:14:25

回答

3

正在发送的序列号是下一个预期的序列号。如果没有增加,则回复表示数据包未被接受,请重新发送。这将以无限循环结束。

SYN是一种特殊情况,它自身传输信息。 (它初始化接收到的目标计数。)ACK将用于下一个期望的字节(SYN + 1)。

ACK计数并不总是增加,并且可能增加超过1.请考虑这种交换,其中数据包2被延迟并到达顺序无序。

Received ACK 
    1   2 
    3   2 
    4   2 
    2   5
+0

对于任何N,如果确认号码被指定为(序列号)+ N,则协议将工作得很好。毕竟,接收ACK号码的一方可以可逆地撤消对序列号添加任何常数号码。我认为问题是为什么N是1。如果N = 1,TCP实现中是否存在一些微观优化? – 2012-07-30 09:37:26

+0

@AmbrozBizjak N或N + 1可能已被选中。我相信N + 1使得缓冲区地址位置计算更简单。 – BillThor 2012-07-31 00:22:48