【トラブルシューティング】TCP状態遷移の解説

 TCPは信頼性のあるコネクション指向型のプロトコルです。TCPはデータ転送が行われる前に、コネクションを確立し、データ転送後はコネクションをクローズします。

 例えば、netstatコマンドでTCPセッションが今どのような状態(state) であるかわかります。

netstatの出力例

Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.3.5.53254      server-143-204-8.https SYN_SENT   
tcp4       0    517  192.168.3.5.53253      server-143-204-8.https ESTABLISHED  
tcp4       0    596  192.168.3.5.53252      nrt20s20-in-f2.1.https ESTABLISHED  
tcp4       0      0  192.168.3.5.53189      23.96.112.38.https     FIN_WAIT_1   
tcp4       0    517  192.168.3.5.53250      182.22.24.124.https    ESTABLISHED  
tcp4      31      0  192.168.3.5.52276      162.125.80.17.https    CLOSE_WAIT  
tcp4       0      0  192.168.3.5.53195      23.96.112.38.https     TIME_WAIT     

 TCP接続でトラブルシューティングする場合、TCPの状態の理解が必要な場面があります。
 全体の流れは以下の通りです。一つずつ見ていきます。

スポンサーリンク

SYN-SENT状態

 サーバはTCP待ち受け状態(LISTEN)であるとします。クライアントは、アプリケーション(ソケット)からの接続要求に対して、TCPはサーバにSYNを送信し、SYN-Sent状態に移行します。

スポンサーリンク

SYN-RECV状態

 サーバはクライアントのSYNを受信したので、SYN+ACKをクライアントに送り返し、SYN-RECV状態に移行します。このようなクライアント、サーバの状態をハーフオープンと呼ばれることもあります。

スポンサーリンク

Established状態

 クライアントは、サーバからSYN + ACKを受信し、ACKをサーバへ送り返すと、Established状態になります。サーバはクライアントからのACKを受信するとEstablished状態になります。これで、データを双方向に送受信する準備ができました。

データ送受信

 クライアント、サーバ間でデータが送受信されます。

FIN-WAIT1状態

 クライアント側で送信するデータがなくなった場合、サーバへFINを送信し、FIN-WAIT1状態になります。

CLOSE-WAIT状態

 クライアントからのFINを受信し、クライアントにACKを送信した後、CLOSE-WAIT状態に推移します。このようなクライアント、サーバの状態をハーフクローズと呼ばれることもあります。

FIN-WAIT2状態

 サーバから送信されたACKを受信すると、クライアントはFIN-WAIT-2状態に遷移します。

LAST-ACK状態

 サーバはFINを送信し、LAST-ACKに移行します。それは、それに対するACKを受信するまでこの状態になり、ACKを受信するとCLOSED状態に遷移します。

TIME-WAIT状態

 クライアントは、サーバからFINを受信し、応答としてACKを送信すると、TIME-WAIT状態になります。RFC793では、Maximum Segment Lifetime (MSL:最大セグメント生存時間)を2分とし、TIME-WAITの待機時間はMSLの2倍としています。TIME-WAITの待機時間経過後、CLOSED状態になります。

 参考までにWindows2016では、以下のサイトの通り、既定で4分のようで、RFCに準拠しているようです。

TCP/IP ポート枯渇のトラブルシューティング - Windows Client
ポート枯渇の問題のトラブルシューティングを行う方法について説明します。 マシン上のすべてのポートが使用されると、ポートの枯渇が発生します。

コメント