面试题答案
一键面试- 客户端状态及转换:
- SYN - SENT:
- 状态描述:客户端调用
connect
函数主动发起连接,发送SYN包后进入此状态。 - 转换条件:收到服务器的SYN + ACK包后,发送ACK包确认,并进入
ESTABLISHED
状态。
- 状态描述:客户端调用
- ESTABLISHED:
- 状态描述:连接已建立,客户端和服务器可以进行数据传输。
- 转换条件:客户端主动调用
close
函数关闭连接,发送FIN包,进入FIN - WAIT - 1
状态;或者接收到服务器的FIN包,进入CLOSE - WAIT
状态。
- FIN - WAIT - 1:
- 状态描述:客户端已发送FIN包,等待服务器的ACK确认。
- 转换条件:接收到服务器的ACK确认包,进入
FIN - WAIT - 2
状态;若同时接收到服务器的FIN + ACK包,则直接进入TIME - WAIT
状态。
- FIN - WAIT - 2:
- 状态描述:客户端已收到服务器对FIN包的ACK确认,等待服务器的FIN包。
- 转换条件:接收到服务器的FIN包,发送ACK确认,进入
TIME - WAIT
状态。
- TIME - WAIT:
- 状态描述:客户端已发送对服务器FIN包的ACK确认,等待2MSL(Maximum Segment Lifetime,最长报文段寿命)时间确保所有相关报文都从网络中消失。
- 转换条件:2MSL时间过去后,进入
CLOSED
状态。
- CLOSED:
- 状态描述:连接完全关闭,资源已释放。
- SYN - SENT:
- 服务器状态及转换:
- LISTEN:
- 状态描述:服务器调用
listen
函数后,处于监听状态,等待客户端连接。 - 转换条件:收到客户端的SYN包后,发送SYN + ACK包,进入
SYN - RCVD
状态。
- 状态描述:服务器调用
- SYN - RCVD:
- 状态描述:服务器收到客户端的SYN包并发送了SYN + ACK包进行响应,等待客户端的ACK确认。
- 转换条件:收到客户端的ACK确认包,进入
ESTABLISHED
状态。
- ESTABLISHED:
- 状态描述:同客户端,连接已建立,可进行数据传输。
- 转换条件:服务器调用
close
函数关闭连接,发送FIN包,进入CLOSE - WAIT
状态;或者接收到客户端的FIN包,发送ACK确认,进入LAST - ACK
状态。
- CLOSE - WAIT:
- 状态描述:服务器收到客户端的FIN包,等待应用层调用
close
函数关闭连接。 - 转换条件:应用层调用
close
函数,发送FIN包,进入LAST - ACK
状态。
- 状态描述:服务器收到客户端的FIN包,等待应用层调用
- LAST - ACK:
- 状态描述:服务器已发送FIN包,等待客户端的ACK确认。
- 转换条件:收到客户端的ACK确认包,进入
CLOSED
状态。
- LISTEN: