前言:
通常大多数认为三次握手、四次挥手是HTTP协议产生的。这是一个错误的认知,实际上HTTP协议并不参与握手以及挥手过程,三次握手四次挥手均是在TCP协议层上进行的,而HTTP协议只是在已建立 TCP连接的基础上,进行通信的。
握手过程:
【第一次握手】:
客户端向服务端发送一个带有SYN(同步序列编号)标致的数据包给服务器,表示客户端请求连接,此时客户端进入SYN_SENT状态。
SYN数据包中,seq表示初始序列号,SYN=1,表示客户端希望建立连接。
【第二次握手】:
服务端在收到客户端建立连接的SYN请求之后,会发送一个带有SYN/ACK(同步/确认序列编号)标致的数据包给客户端。此时服务端进入SYN_RECIVED状态。
SYN/ACK包中,seq代表服务器的初始序列号;ack代表的是确认号,具体值为客户端发送的SYN数据包的初始序列号加1,表示服务器已经成功接受到了客户端的SYN请求,并且准备好建立连接。SYN标志为1,表示服务端愿意建立连接。ACK标志为1,表示对客户端的 SYN请求进行确认。
【第三次握手】:
客户端在收到服务端发送的SYN/ACK(同步/确认序列编号)标致的数据包后,会发送一个带有ACK(确认序列编号)标志的数据包给服务器,表示客户端接受连接。服务器接收到客户端发送的ACK(确认序列编号)的包后,双方建立连接。服务器进入ESTABLISHED状态,客户端也进入ESTABLISHED状态。
ACK数据包中,seq代表序列号,表示客户端期望从该序列号发送数据;ack表示确认号,具体值为服务端发送的SYN/ACK数据包中的序列号+1;ACK标志为1,表示对服务器的SYN/ACK响应进行确认。
挥手过程:
【第一次挥手】:
客户端向服务器发送一个FIN(结束)标志数据包,表示客户端不再发送数据,但是仍可以接收数据。客户端进入“FIN_WAIT_1”状态。
FIN包中ACK标志为1,表示发送方不再发送数据,希望关闭连接,ACK标志为1表示希望接收方确认收到FIN包。seq表示发送方当前发送数据的最后一个字节的序列号。
【第二次挥手】:
服务器收到客户端发送的FIN结束包后,发送一个带有ACK(确认)标志的包给客户端,表示服务端已经收到了客户端要关闭连接的请求。服务端进入“CLOSE_WAIT”状态,客户端进入“FIN_WAIT_2”状态。
ACK包中seq,表示接收方当前发送数据的最后一个字节的序列号,ACK标志为1,表示确认收到了客户端发送的FIN包,ack表示确认号,具体值为FIN包的初始序列号+1
【第三次挥手】:
服务器决定关闭连接,会在发送一个FIN标志的数据包给客户端,表示服务器不在接收数据,进入“LAST_ACK”状态
FIN包中seq表示发送方当前发送数据的最后一个字节的序列号。ACK标志为1,表示确认收到了客户端发送的FIN包,FIN为1,表示不再发送数据,ack为确认号,为客户端发送的FIN包的初始序列号+1
【第四次挥手】:
客户端收到服务器的FIN包后,会发送一个ACK标志的数据包给服务器,表示客户端确认收到了服务器的关闭请求。客户端进入“TIME_WAIT”状态,等待服务器端收到ACK包之后,进入“CLOSED”状态,此时服务器端也进入“CLOSED”状态
ACK中seq表示序列号,接收方当前发送数据的最后一个字节的序列号。ACK标志为1,表示确认收到了服务端的FIN包,ack表示确认号,值为客户端的初始序列号+1
学海无涯