- Seq:用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号
- ACK:为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段
- SYN:同步序号,为1表示连接请求,用于建立连接和使序列号同步
- FIN:用于释放连接,为1表示发送方没有数据发送了,关闭本方数据流
三次握手:
1. 第一次握手:客户端给服务器发送一个SYN报文
客户端的发送能力正常
客户端:SYN_Sent 服务端:LISTEN
2. 第二次握手:服务端收到SYN报文,回复SYN + ACK报文
服务端接收、发送能力正常、客户端发送正常
客户端:SYN_Sent 服务端:SYN_RCVD
3. 第三次握手:客户端收到SYN + ACK报文之后,回应ACK报文
客户端的接收、发送能力正常,服务器的发送、接收能力正常
客户端:establised 服务端:establised
半连接队列:服务器处于SYN_RCVD状态,双方还未完全建立连接,服务器会把这种状态下的请求放到半连接队列。完成三次握手的连接所在的队列为全连接队列,如果队列满了可能会发生丢包现象。
四次挥手:
1. 第一次挥手:客户端发送一个FIN报文,报文中包括一个序号
客户端:FIN_WAIT1[等待远程TCP中断请求] 服务端:ESTABLISHED
2. 第二次挥手:服务端收到FIN后,发送ACK报文,序号+1[表明已经收到报文了]
客户端:FIN_WAIT1[等待远程TCP中断请求] 服务端:CLOSE_WAIT
3. 第三次挥手:发送FIN报文,指定一个序号
客户端:FIN_WAIT2[从远程TCP等待连接中断请求] 服务端:LAST_ACK[等待中断请求的确认]
4. 第四次挥手:发送ACK报文,序号+1
确保服务器收到ACK报文,如果没有收到,服务器会再发送FIN报文给客户端,客户端收到ACK之后就知道之前的ACK发送失败了,并再次发送ACK报文。
客户端:等待2MSL(TIME_WAIT)-->CLOSED 服务端:CLOSED[没有任何连接]