2024-04-18  阅读(210)
原文作者:小小工匠 原文地址: https://artisan.blog.csdn.net/article/details/134963753

202404182041298061.png


Pre

计网 - 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?


导图

202404182041301052.png


过程分析

202404182041306603.png

202404182041311914.png

第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 Sequence Number 字段(简称 seq)中填入一个随机值 J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。


202404182041319135.png

第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连接,服务器端将应答报文标志位 SYN 和 ACK 都置为 1,应答报文的 Acknowledgment Number字段(简称 ack)中填入 ack=J+1,应答报文的 seq 中填入一个随机值 K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。


202404182041324916.png

第三次握手:客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

第三次握手是可以携带数据的,前两次握手是不可以携带数据的

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了


抓包实战

按照 tcp 三次握手的规则,三次握手包含一个 SYN 包、 一个 SYN/ACK 包和 一个 ACK包

202404182041329757.png

我们用wireshark 抓一下

202404182041333228.png

第一次握手

【数据链路层 】

202404182041336719.png
从这里我们可以看出,这是数据链路层相关的信息,source 部分的地址和机器上的mac 地址一模一样

2024041820413401910.png


【IP层】

接下来,就是 IP 层的相关信息,其中表明了它的上一层协议是 TCP,同时本地和远程服务器的 IP 地址:

2024041820413457911.png


【TCP】

接下来,就是 TCP 层的相关信息,其中包括了本地端口和远程服务端口,既然是 syn 包,里面当然会带上 seq 值,本次通信是 1979849485,tcp 报文格式中的 syn 字段被设置为 1,用来表明这是一个 syn 包

2024041820413520912.png


第二次握手

数据链路层和 IP 层的报文我们不再查阅,直接看 TCP 层的报文,很明显,这是服务器给客户端的 ACK 报文,其中依然包括了远程服务端口和本地端口

  • 同时服务器要把自己端的 seq 值告诉客户端,我们看到实际值是 3366556883。
  • 同时服务器要把客户端传给自己的seq 值做个应答确认,所以我们看见 Acknowledgment number 字段值是 1979849486,刚好是第一次握手中,客户端传递给服务端的 seq 值 1979849485 加 1。
  • 同时 tcp 报文格式中的syn 字段被设置为 1,Acknowledgment 字段被设置为 1,用来表明这是一个 syn/ack 包

2024041820413576613.png


第三次握手

客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

2024041820413634214.png

2024041820413695115.png

阅读全文
  • 点赞