TCP 三次握手和四次挥手(使用Wireshark进行抓包查看)

首先介绍一些专业术语的意思:
Source Port:源端口,16位。
Destination Port:目的端口,16位。
Acknowledgment Number:确认序列号,32位。
Sequence Number:发送数据包中的第一个字节的序列号,32位。
ACK:表示Acknowledgment Number字段有意义
SYN:表示SYN报文(在建立TCP连接的时候使用)
FIN:表示没有数据需要发送了(在关闭TCP连接的时候使用)


三次握手的过程:
这里写图片描述
(1)第一次握手:建立连接,客户端发送SYN报文(SYN = 0,seq=0)给服务器端,进入SYN_SEND状态。
         SYN为0,表示SYN被置位,是有效的。
         seq(Sequence Number)就是发送的数据包中第一个字节的序列号。它是一个相对值。也就是说”基础值+发送的内容的字节数”
         与“基础值”的一个差值。由于第一次握手的时候,是不能进行数据传输的,发送的字节数是0,因此seq也就是0。
(2)第二次握手:服务器端收到客户端发来的SYN报文,并回应一个SYN (SYN = 0,seq = y)和 ACK ( ACK = 1)报文;客户端和服务器都进入SYN_RECV状态。
         这个y是随机产生的。seq(Sequence Number)就是发送的数据包中第一个字节的序列号。
         ACK,确认序号,它的值是收到的序列号+1,表示ACK之前的所有报文我都已经收到了。
(3)第三次握手:客户端收到服务器端的SYN报文,检查确认序号(ACK)是否正确,即第一次客户端向服务器发送的序号seq+1、
         回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

注意 :
(1)如果接收到的ACK是有值的,那么发送的SYN就等于ACK的值 。
(2)序列号是一个相对值。在三次握手的时候是不允许进行数据传递的,因此len是为0,ACK确认序号的值=seq+1。
     但是如果当三次握手以后,开始传递数据的时候,确认序号的值 = seq + len。确认序号的意义就是告诉对方,这个确认序号之前的所有报文我都接受到了,保证TCP协议的稳定可靠的传输。


四次挥手:当建立了TCP连接以后,数据传送完毕后,要断开TCP连接,这个时候就有了四次挥手。
(1)第一次挥手:
         客户端向服务器发送FIN报文,用来关闭客户端到服务器的传送。此时客户端进入FIN_WAIT_1状态。
(2)第二次挥手:
服务器收到客户端发送过来的FIN报文,它会返回一个ACK给客户端,确认序号 = 接收到的序号+1,服务器进入CLOSE_WAIT状态。
(3)第三次挥手:
服务器发送一个FIN报文给客户端,用来关闭服务器到客户端的数据传送。服务器进入LAST_ACK状态
(4)第四次挥手:
客户端收到服务器发送过来的FIN报文之后,像服务器端发送确认序号(=收到的序号+1)。此时客户端进入CLOSED状态。完成四次挥手。

猜你喜欢

转载自blog.csdn.net/qq_36748278/article/details/78321840