(3) TCP スリーウェイ ハンドシェイクと接続キュー - ネットワーク プログラミング

1) 予備知識:

1.1) コンピュータネットワークアーキテクチャ

        原則としてシステムネットワーク:

        1) 物理層: ビットの送信にどの信号を使用するかの問題を解決します。

        2) データリンク層: ネットワーク (または一方の端のリンク) 上のパケット伝送の問題を解決します。

        3) ネットワーク層: 複数のネットワーク上でのパケット伝送(ルーティング)の問題を解決します。

        4) トランスポート層: プロセス間のネットワークベースの通信の問題を解決します。

        5) アプリケーション層: アプリケーション プロセスの相互作用を通じて、特定のネットワーク アプリケーションを実装する問題を解決します。

 1.2) トランスポート層

        コンピュータネットワークアーキテクチャでは、物理層、データリンク層、ネットワーク層が連携してホストからホストへの通信を実現しますが、実際にコンピュータネットワーク内で通信を行う実体は両端のホストにあるプロセスです。コミュニケーションの。トランスポート層は、アプリケーション プロセス間の論理通信のためのサービスを直接提供します。

        トランスポート層は、基礎となるネットワーク コアの詳細から高レベルのユーザーを保護し、アプリケーション プロセスには 2 つのトランスポート層エンティティ間にエンドツーエンドの論理通信チャネルがあるように見せます。

        さまざまなアプリケーション要件に応じて、インターネットのトランスポート層は、コネクション型 TCP とコネクションレス型 UDP という 2 つの異なるトランスポート プロトコルを提供します。

  1.3)TPC/UDP      

        UDP (ユーザー データグラム プロトコル) は、ユニキャスト、マルチキャスト、ブロードキャストをサポートし、コネクションレスで信頼性の低い伝送サービスを上位層に提供し、IP 電話やビデオ会議などのリアルタイム アプリケーションに適しています。

        TCP(Transmission Control Protocol)伝送制御プロトコルは、ユニキャストのみをサポートし、コネクション型の信頼性の高い伝送サービスを上位層に提供し、ファイル伝送など、信頼性の高い伝送が必要なアプリケーションに適しています。

        TCP/IP システムのアプリケーション層の共通プロトコルで使用されるトランスポート層の既知のポート番号。

         

2) TCP スリーウェイ ハンドシェイク

2.1) 簡単なプロセス:

        1) クライアントは、SYN フラグを含む接続要求データグラムをサーバーに送信します。

        2) サーバーは、SYN+ACK フラグを含む接続要求と応答データグラムをクライアントに送信します。

        3) クライアントは、ACK フラグを含む応答データグラムをサーバーに送信します (データを送信できます)。

2.2) 詳細なプロセス:

        1) サービス プロセスは特定のポートをリッスンし、リッスン状態になります。

        2) クライアントプロセスは、TCP 接続要求セグメントをサービスプロセスに送信し、同期送信状態になります。TCP 接続要求セグメントのヘッダーの同期ビット SYN=1 は、これが TCP 接続要求セグメントであることを示します。シーケンス番号フィールド seq は、初期値 x を初期シーケンス番号 (client_isn) としてランダムに設定します。TCP では、SYN=1 と規定されています。 1 セグメントはデータを伝送できませんが、シーケンス番号を消費します。

        3) サービスプロセスは、TCP 接続要求セグメントを受信後、接続の確立に同意した場合、TCP クライアントプロセスに TCP 接続要求確認セグメントを送信し、同期受付状態に移行します。SYN=1、ACK=1 と設定すると、これが SYN ハンドシェイクおよび ACK 確認応答メッセージであることを示します。ランダムな初期シーケンス番号 (server_isn) seq=y、ack=x+1 は、クライアントによって送信された TCP 接続要求メッセージ セグメントです。 seq=x の。

        4) TCP 接続要求確認メッセージセグメントを受信したクライアントプロセスは、通常の TCP 確認メッセージセグメントを TCP サービスプロセスに送信し、接続確立状態に入ります。ACK=1 は、これが応答メッセージであることを意味し、ack=y+1 は、サーバーによって送信された seq=y メッセージの確認です。TCP 接続要求メッセージ セグメントの最初のシーケンス番号は seq=x であり、シーケンス番号が 1 つ消費されるため、このメッセージは seq=x+1 になります。このメッセージはデータを運ぶことができますが、データを運ばない場合、シーケンス番号は消費されません。

        5) サービスプロセスも確認セグメントを受信した後、接続確立状態に入ります。

2.3) スリーウェイ ハンドシェイクが行われる理由:

        主な理由: 歴史的なつながりを防ぐ

        ネットワークが輻輳している場合、クライアント プロセスの最初のハンドシェイクの SYN メッセージがサービス プロセスに到達しておらず、クライアント プロセスがサービス プロセスの SYN+AKC メッセージを受信して​​いないため、タイムアウト再送信がトリガーされ、その後 SYN が送信されます。メッセージは先に送信された SYN メッセージよりも早くサーバーに到着し、この時点でサービス プロセスはクライアント プロセスに SYN+ACK メッセージを送信します。

        1) 2 メッセージ接続の場合、現在の接続が履歴接続であるかどうかを判断できず、エラーが発生し、リソースが無駄に消費されます。サービス プロセスが先に送信された SYN メッセージを受信した場合、サービス プロセスは SYN+ACK メッセージを送信した後、直接接続確立状態に入ります。この時点で、クライアント プロセスは最後の TCP 接続を完了し、クローズ状態になっている可能性があります 2 つのメッセージある

 

        2) 3 メッセージ接続の場合、クライアント プロセスがまだ開いている場合、クライアント プロセスは独自のコンテキストに従ってこれが履歴接続 (シリアル番号またはタイムアウト) であると判断し、サービス プロセスに RST メッセージを送信します。この接続を終了します。クライアントプロセスが閉じられ、サービスプロセスが長時間ACKメッセージを受信しない場合、接続は解放されます。

 3) 接続キュー

        カーネルは、待機状態のソケットに対して 2 つのキューを維持します。1 つは不完全な接続要求キュー (SYN_RECV 状態)、もう 1 つはソケットを確立するための受け入れを待機するキュー (ESTABLISHED 状態) です。

        listen() 関数は次のように宣言されます。

int listen(int socket, int backlog);

        2 番目のパラメーター backlog は、完全に確立されたソケット (ESTABLISHED 状態) の受け入れを待機しているキューの長さを指します。

        未完了接続要求キューの長さは、次のファイルに設定されます (デフォルト値は 128)。

/proc/sys/net/ipv4/tcp_max_syn_backlog

4) 補足

4.1) SYN攻撃

        SYN 攻撃とは、DoS (Denial of Service サービス妨害) 攻撃の一種で、送信元 IP を偽装したファースト ハンドシェイク SYN パケットを大量に送信することで、不完全な接続要求キューがいっぱいになり、正常な接続要求が失敗します。

        解決:

        1) IP 接続の数を制限する

        2) 不完全な接続状態のキュー容量を増やします。メモリ リソースの使用量が増加します。推奨されません。

        3) 接続リソースの割り当ての遅延。従来、対応するリソースは不完全な接続キュー内の各接続に割り当てられ、完全な接続キューではリソースの割り当てが遅れる可能性があります。SYN は大量の SYN リクエストを送信しますが、サーバーが対応するリソースを割り当てない限り、深刻な損傷を受けることはありません。

4.2) 初期シリアル番号がランダムに生成されるのはなぜですか

        ネットワーク通信のセキュリティを確保しないと、ハッカーがあなたと他のホスト間の通信の最初のシリアル番号を簡単に入手して、シリアル番号を偽造して攻撃することができます。

4.3) SYN がデータを伝送せずにシリアル番号を消費するのはなぜですか

        SYNセグメントは相手側の確認が必要なため、確認が曖昧にならないようにシリアル番号のみを使用します。

4.4) それぞれのハンドシェイクの重要性

        最初のハンドシェイク: クライアントは何も情報を持っていませんが、サーバーは相手が正常に送信したことを確認し、正常に受け入れます。

        2 回目のハンドシェイク: クライアントは自分の送受信が正常であり、相手の送受信も正常であることを確認します。

        3 回目のハンドシェイク: サーバーは送信が正常であることを確認し、相手はそれを正常に受け入れます。

4.5) TCP 接続プロセス中にクライアントが途中でダウンし、クライアントが回復した後、接続を再確立するためにサーバーに SYN パケットを送信します。このときサーバーは何をしますか?

        TCP 接続は、主にクライアント IP、サーバー IP、およびポート番号によって決まります。

        1) ポートが同じではありません。このとき、サーバーのタスクは新しい接続を確立することであるため、新しい接続は 3 ウェイ ハンドシェイクを通じて確立されます。古い接続は TCP キープアライブ メカニズムをトリガーし、クライアントがアクティブでないことを検出した後、サーバーは古い接続を解放します。

        2) ポートは同じです。TCP は SYN パケットを送信し、サーバーは最後のメッセージの確認番号とシリアル番号を返します。この ACK はチャレンジ ACK と呼ばれます。チャレンジ ACK を受信したクライアントは、シリアル番号が期待していたものではないことに気づき、そのため、RST メッセージが送信され、サーバーは受信後に接続を解放します。

おすすめ

転載: blog.csdn.net/weixin_43284996/article/details/128127264