TCP 接続とは? 信頼できるバイトストリーム
TCP 接続は、handshake で確立される 2 つのエンドポイント間の信頼できる順序付きチャネルで、バイトが無傷かつ順序どおりに到着することを保証するか、さもなくば接続が失敗します。
HTTP や gRPC を含むほとんどのアプリケーションプロトコルは、TCP の上で動作します。TCP は、データの確認応答、損失の再送信、すべての正しい順序付けを行うことで、信頼できないパケットネットワークを信頼できるバイトストリームに変えます。CI の job が connection reset や timeout を報告するとき、それは使用していたプロトコルの下層にある TCP レベルの障害です。
three-way handshake
TCP 接続は、データが流れる前に双方を同期する SYN、SYN-ACK、ACK の交換で開きます。handshake が完了してはじめて、アプリケーションはバイトを送信できます。
信頼できて順序付き
TCP はバイトに番号を付け、受信を確認応答し、失われたものを再送信するため、アプリケーションはきれいで順序どおりのストリームを見ます。この信頼性が、TCP が非常に多くのトラフィックを支える理由です。
ポートがエンドポイントを識別する
接続は、送信元と宛先の IP に加えてポートで識別されます。クライアントは、HTTPS 用の 443 のような well-known なサーバーポートに対して、一時的なローカルポートを開きます。
TCP エラーが CI でどう現れるか
- Connection refused:そのポートで何もリッスンしていません。
- Connection reset:peer がストリームの途中で接続を切断しました。
- Connection timed out:期限内に応答がありませんでした。
接続とデプロイ
デプロイ中、再起動しているバックエンドは、再びリッスンするまで接続を拒否または reset します。health check とリトライがこの短い期間をならすため、caller はハードな障害を目にしません。
パイプラインでの一時的な reset
一瞬の不具合による reset や timeout は、idempotent なリクエストでは通常リトライして安全です。Latchkey の runner は、一般的なエンドポイントへのこうした一時的な TCP レベルの障害を自動的にリトライするため、1 回の接続切断が job を失敗させることはありません。
重要なポイント
- TCP は、three-way handshake で確立される、信頼できる順序付きのバイトストリームを提供します。
- reset、拒否、timeout は、多くの CI 障害の背後にある TCP レベルのエラーです。
- idempotent なリクエストでの一時的な reset は、一般にリトライして安全です。