TCP四次挥手相关面试题扩展
- 1. TCP四次挥手
- 2. 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手?
- 3. 如果第二次挥手时服务器的ACK没有送达客户端,会怎样?
- 4. 客户端TIME_WAIT状态的意义是什么?
1. TCP四次挥手
直接上图 TCP四次挥手
专业名称解释
解释 | |
---|---|
TCP | 传输控制协议(TCP,Transmission Control Protocol) |
SYN | 同步序列编号 |
SYN_SENT | Client请求连接 |
ESTABLISHED | 含义TCP:连接成功 |
ACK | (Acknowledge character)即是确认字符,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1; |
SYN_RCVD | SYN_RCVD是TCP三次握手的中间状态,是服务端口(监听端口,如应用服务器的80端口)收到SYN包并发送[SYN,ACK]包后所处的状态 |
RST | TCP首部中的6个标志比特之一,表示重置连接、复位连接。复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接; |
ISN | 初始序列号(Initial Sequence Number) |
FIN | 来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放; |
FIN_WAIT_1 | FIN_WAIT_1状态是在baiserver端主动要求关闭tcp连接,并且主du动发zhi送fin以后,等待client端回复daoack时候的状态。zhuan |
LAST_ACK | LAST_ACK是TCP建立链接过程中的等待原来的发向远程TCP的连接中断请求的确认状态; |
第一次挥手
- 客户端Client将FIN置为1,发送一个序列号seq给服务端Server。进入FIN_WAIT_1状态。
第二次挥手
- 服务端收到FIN之后,发送一个ACK-1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
第三次挥手
- 服务端Server将FIN置为1,发送一个序列号给Client;进入
LAST_ACK
状态;
第四次挥手
- Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。
2. 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手?
- 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。
3. 如果第二次挥手时服务器的ACK没有送达客户端,会怎样?
- 客户端没有收到ACK确认,客户端会重新发送FIN请求。
4. 客户端TIME_WAIT状态的意义是什么?
-
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server服务端没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。
-
MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。