コネクション確立
- 3 way handshake
- まず先にサーバ側(サービスを提供する側)がListen状態に入ってクライアントからのオープン要求を待ち、クライアント側が接続要求を送信することによって、TCP接続が確立される
コネクション状態遷移
- 接続種別
- オープン(確立)
- Active Open:自分から相手方に先にオープン要求を送信すること
- Passive Open:相手からのオープン要求を待ち受けしてオープンすること
- クローズ
- Active Close:先にクローズ処理を開始すること。Active Close完了後は送信はできないが、受信はできる
- Passive Close:Active Close処理開始後に、Active Closeの逆側()がクローズ処理を開始すること。Passive Close処理の完了をもって、接続が完全に切れる。
- オープン(確立)
- 状態一覧
- LISTEN
- Passive Openで、待ち受け状態。
- SYN_RECEIVED
- Active OpenのSYNに対してACKとSYNで応答し、それに対するACKを待っている状態。
- SYN_SENT
- Active Openで、SYNを送信した状態。
- ESTABLISHED
- TCP接続が確立した状態。データの送受信を行うことができる。
- FIN_WAIT_1
- Active Closeの最初の段階。FINを送信して、それに対する応答を待っている状態。
- FIN_WAIT_2
- 送信したFINに対するACKを受け取った状態。送信側のクローズ処理が終了し、相手からのFINを受信するのを待っている状態。
- CLOSING
- Active CloseでFINを送信した後、ACKが戻ってくるよりも先に、相手からもFINを受けた状態。
- TIME_WAIT
- CLOSING状態でACKを受けた状態。Active Close後のタイムアウト待ち状態。同じシーケンス番号やポート番号などを再利用しないように、パケットが受信しきるのを待つ。
- CLOSE_WAIT
- Passive Closeの状態。送信側にFINを送信したあとの状態。
- LAST_ACK
- CLOSE_WAITで送信したFINに対するACKを待つ状態。
- CLOSED
- 未使用もしくは使用済みでTCB(Transmission Control Block)の状態。netstatで表示されない。
- 状態遷移図
TCPの性能を実現する特徴
- シーケンス番号
- シーケンス番号によって、分割されたパケットのどの部分(パケット)まで受信したかを指し示している。
- 再送機能
- 送信に対するACKが返ってこない場合に、送信側が再度同じパケットを送信する機能。全く同じパケットを再送することによってどこでパケットが消失してもデータの整合性を担保できる
- フロー制御/ウィンドウ制御
- スライディングウィンドウ方式:パケット送信に対するACKの受信を待つことなく、連続してパケットを送信し、待ち時間を短縮する技術。
GoogleのBBRについて
https://cloudplatform.googleblog.com/2017/07/TCP-BBR-congestion-control-comes-to-GCP-your-Internet-just-got-faster.html
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0ahUKEwiCs5mqqvjVAhVFjpQKHSZ7B_gQFggvMAE&url=http%3A%2F%2Fwww.publickey1.jp%2Fblog%2F17%2Fgoogletcptcp_bbrgoogle_cloud.html&usg=AFQjCNE03mObETnRbVJQD_YzVXtzBoa1IQ