之前学习tcp三次握手总记不住,感觉很抽象,后来通过捉包工具Wireshark进行实操后,印象更深刻了。
三次握手捉包情况如下图:

第一次握手:客户端发送报文段给服务端。SYN=1,表示客户端想与服务端建立连接,序列号seq=x,实际捉包得到seq=0。Wireshark的第一次捉包情况如下图。

SYN的状态设置如下图。

第二次握手:服务端收到客户端连接请求,发送给客户端一个报文段,内容有:SYN=1,表示服务端想与客户端建立连接,建立连接是双向的,客户端要与服务端通过设置SYN=1建立连接,服务端也要与客户端通过设置SYN=1建立连接。ack=x+1,表示客户端发的前x条数据服务端已经成功收到,期待客户端下一次发过来的数据起始序号为x+1,因为客户端实际发来的序列号seq=x=0,因此ack=1,只有ACK=1,ack的值才有效,因此报文段中ACK=1,服务端同样也发送序列号seq=y,实际发送seq=0。Wireshark的第二次捉包情况如下图。

SYN和ACK的状态设置如下图。

第三次握手:客户端收到服务端连接请求,向服务端发送确认包,内容有:ack=y+1,表示服务端发的前y条数据已经成功收到,期待服务端下一次发过来的包的起始序号为y+1,因实际seq=y=0,因此得到ack=1,同样,只有ACK=1,ack的值才有效,因此报文段中ACK设置为1。第二次握手服务端期待客户端下一次发过来的包的起始序号seq为1,因此seq=1。Wireshark的第三次捉包情况如下图。

ACK的状态设置如下图。

03-05 21:41