为什么TCP三次握手的时候ACK=Seq+1

从Telnet协议讲起

在这里插入图片描述
这个例子来自《计算机网络自顶向下方法》第6版 3.5.2小节。
在这里插入图片描述
上图中,因为主机A发送了一个字符C给主机B,所以作为接收方B的反馈的ACK为42+1。
在这里插入图片描述
上图中,因为主机B发送了一个字符C给主机A,所以作为接收方A的反馈的ACK为79+1。
在这里插入图片描述
而在最后一次发送中,由于没有携带任何数据,实际上Seq = 43是没有意义。但由于这个固定字段总得放个值进去,所以放个Next Sequence Number到这里是最合适的。也就是说这次发送没有消耗掉序号。
有意义的只有ACK = 80,这样就告诉了主机B:我这边已经成功接受到了 起码序号为79且长度为1 的数据。

下一次的可能发送情况

在这里插入图片描述

如果下一次是主机A再发送数据,数据包的Seq还会是43,因为上一次主机A的发送并没有消耗掉序号(即Len = 0),所以主机A发送的数据包序号还是应该从43开始。
在这里插入图片描述
如果下一次是主机B再发送数据,数据包的ACK还会是43,因为上一次主机A的发送并没有消耗掉序号(即Len = 0),所以主机B还是期待对方从43开始的序号。

三次握手时的ACK

在这里插入图片描述这是本机与百度之间的三次握手。
在这里插入图片描述
首先看前两个数据包,第一个数据包的Len = 0,但第二个数据包的ACK还是在Seq = 0的基础上加1了。这就很奇怪,因为按照上一章的逻辑,没有携带数据,那么ACK应该等于Seq的。
在这里插入图片描述
再看后两个数据包,同样的,第一个数据包的Len = 0,但第二个数据包的ACK还是在Seq = 0的基础上加1了。

解释

The server responds to the client with a sequence number of zero, as this is its first packet in this TCP session, and a relative acknowledgement number of 1. The acknowledgement number is set to 1 to indicate the receipt of the client’s SYN flag in packet #1.
Notice that the acknowledgement number has been increased by 1 although no payload data has yet been sent by the client. This is because the presence of the SYN or FIN flag in a received packet triggers an increase of 1 in the sequence. (This does not interfere with the accounting of payload data, because packets with the SYN or FIN flag set do not carry a payload.)

简而言之,接收方反馈的ACK之所以加1,是因为发送方包含了SYN标志位或FIN标志位。

也就是说,只要发送方包含了 SYN标志位或FIN标志位,即使没有包含数据,接收方也得认为 发送方消耗掉了一个序号。

另外,带有 SYN标志位或FIN标志位的报文段(在三次握手和四次挥手中),也是不允许携带数据的。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值