HTTP的三次握手和四次挥手
学过网络的都知道,http的传输是基于TCP协议的,建立连接需要三次握手,结束连接需要四次挥手,那么具体过程是什么样子呢? 中间经历哪些状态呢?
TCP报文的头结构
概念说明:
SYN: 同步字段,等待确认;
ACK: 确认字段,建立连接后ACK=1;
seq: 请求序号;
ack: 确认序号,等于SYN发送的 seq+1;
FIN:终止字段,FIN=1表示释放一个连接;
1.三次握手;
连接状态:
CLOSED: 表示初始状态;
LISEN:服务端的某个SOCKET处于监听状态,可以接受连接了;
SYN_SEND:表示客户端已发送SYN报文;(第一次握手,客户端)
SYN_RCVD:表服务端接受到了SYN报文;(第二次握手,服务端)
ESTABLISHED:表示连接已经建立起来了;(第三次握手,客户端)
2.四次挥手
连接状态:
ESTABLISHED:表示正常的连接状态;
FIN_WAIT_1:这个时候客户端已经发送了关闭请求,等待服务端确认;(第一次挥手,客户端)
CLOSE_WAIT:服务端发送确认报文后,服务端进入该状态; (第二次挥手,服务端)
FIN_WAIT_2:客户端收到确认后,进入该状态,此时客户端已经进入半连接状态,即客户端已经不会再向服务端发送数据了;
LAST_WAIT:服务端向客户端发送关闭请求,此时服务端,进入该状态;(第三次挥手,服务端)
TIME_WAIT:客户端收到关闭请求后,客户端进入TIME_WAIT状态,此时客户端向服务端发送确认消息;(第四次挥手,客户端)
CLOSED:服务端收到确认消息后,服务端进入CLOSED状态; 此时客户端还没有释放,经过2MS后(报文的最大生存周期,RFC 793中规定是2Min,实际场景在30s-2min之间);