TCP状态转移过程:
TCP连接的建立和断开过程中客户端和服务器的状态变化:
服务器状态转移过程:
服务器通过listen系统调用进入LISTEN状态,被动等待客户端连接,listen系统调用创建了一个监听队列,用来存放待处理的客户连接。
服务器一旦监听到某个客户端连接请求(即收到同步报文段(SYN)),就把该客户端连接放入内核监听队列中,并向客户端发送带SYN标志的确认报文段(ACK)。此时服务器端的连接状态处于SYN_RCVD状态。
如果服务器成功地连接收到客户端发送的确认报文段(ACK),则服务器连接状态转移到ESTABLISHED状态。ESTABLISHED状态是连接双方能够进行双向数据传输的状态。
当客户端主动关闭连接时(通过close或shutdown系统调用向服务器发送结束报文段(FIN)),服务器通过返回客户端确认报文段(ACK)使连接进入CLOSE_WAIT状态。CLOSE_WAIT状态:等待服务器应用程序关闭连接。
当服务器检测到客户端关闭连接后,也会立即发送发送一个结束报文段(FIN)来关闭连接,这是服务器连接状态转移LAST_ACK状态,以等待客户端对结束报文段的最后一次确认(即客户端发送一个确认报文段(ACK)),一旦确认完成,连接就彻底关闭掉。
客户端状态转移过程:
客户端通过connect系统调用主动与服务器建立连接。connect系统调用首先给服务器发送一个同步报文段(SYN),是客户端的连接状态转移到SYN_SENT状态。此后,connect系统调用可能因为如下两个原因失败返回:
(1)如果connect连接的目标端口不存在(未被任何进程监听),(即命名socket的bind系统调用中的端口不存在),或则该端口仍被处于TMIE_WAIT状态的连接所占用着,则服务器讲给客户端发送一个复位报文段(RST),connect调用失败。
(2)如果端口存在,但connect在超时时间内未收到服务器的确认报文段(ACK),则connect调用失败。connect调用失败将使连接立即返回当初的CLOSED状态。
如果客户端成功收到服务器的同步报文段(SYN)和确认报文段(ACK),connect调用成功返回。此时客户端连接状态转移到ESTABLISHED状态。
然后客户端向服务器发送一个确认报文段(ACK)。服务器收到这个确认报文段(ACK)后,则服务器连接状态转移ESTABLISHED状态。
当客户端执行主动关闭时,它将向服务器发送一个结束报文段(FIN),同时客户端连接进入FIN_WAIT_1状态。
若此时客户端收到服务器专门用于确认目的的确认报文段(ACK),则连接转移至FIN_WAIT_2状态。
当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是有可能发生半关闭的状态。
此时服务器也关闭连接发送结束报文段(FIN)给客户端,则客户端将给予确认发送一个确认报文段给服务器,则客户端进入TIME_WAIT状态。
假如服务器直接收到客户端发送来的带有确认信息(ACK)的结束报文段(FIN),那么客户端可以直接从FIN_WAIT_1状态转移到TIME_WAIT状态。