大家好,我是林译川,今天我们来聊聊网络编程中那些让人头疼的小细节。你知道在三次握手过程中,为什么会有两个类似的ACK值吗?一个大写,一个小写?别急,今天我们就来揭开这个谜团。
首先,不管是ACK还是ack,都只是代号,叫什么都行,不影响实际操作。关键是要搞清楚它们各自的作用。
确认值(Acknowledgement)
确认值,顾名思义,就是用来确认连接的。当它的值为1时,表示连接已经建立成功。
确认编号(Acknowledgement Number)
确认编号,它记录了接收到的上一次远端主机传来的seq值,然后加1,再发送给远端主机。这样做的目的是告诉远端主机,我们已经成功接收了上一次的所有数据。
接下来,我们通过wireshark抓包来看一下这个过程。
第一次握手时,请求端发送的seq值为0。第二次握手时,服务端发送的seq值为0,ack值为第一次握手的seq值加1,即1。第三次握手时,请求端发送的seq值为1,ack值为第二次握手的seq值加1,即1。
那么,那个起确认连接作用的确认值ACK在哪呢?答案就在这里:
对照网上找到的关于第二次握手的标志位图,我们可以看到确认位ACK为1,表示确认进行连接。
第一次握手时,标志位中只有同步位SYN为1,表示进行请求。第二次握手时,标志位中既有确认位ACK,也有同步位SYN,表示进行应答。第三次握手时,标志位中只有确认位ACK,表示再次确认。
好了,今天的内容就到这里。希望这篇文章能帮助你更好地理解三次握手过程中的ACK和ack。如果你还有其他问题,欢迎在评论区留言讨论。
我是林译川,来自「新派编程网」(www.xjpbg.com),一个注重编程思维培养的技术导师。如果你对编程有更多疑问,欢迎关注我们的网站,获取更多精彩内容。
