UDP および TCP プロトコルはトランスポート層で最も重要なコンテンツであるため、ここで別の記事を書いて、皆さん (私自身) がよりよく理解できるようにします。
1.UDPプロトコル
UDP は、IP のデータグラム サービスに、多重化と逆多重化、およびエラー検出という 2 つの基本的なサービスを追加するだけです。
UDP を使用する利点:
-
UDP は接続を確立する必要はありません
-
接続状態なし
-
パケット ヘッダーのオーバーヘッドが小さい
-
アプリケーション層は、どのデータをいつ送信するかをより詳細に制御できます
-
UDP は、1 対 1、1 対多、多対 1、および多対多のインタラクティブ通信をサポートします。
1.1 UDP ヘッダー形式
UDP データグラムは、UDP ヘッダーとユーザー データの 2 つの部分で構成されます。UDP ヘッダーは 8B で、4 つのフィールドで構成され、各フィールドの長さは 2B です。彼らです:
-
ソース ポート
-
宛先ポート
-
長さ
-
チェックサム
トランスポート層が IP 層から UDP データグラムを受信すると、ヘッダーの宛先ポートに従って、対応するポートを介して UDP データグラムをアプリケーション プロセスに送信します。受信側の UDP は、受信したメッセージの宛先ポート番号が正しくないことを検出すると、そのメッセージを破棄し、ICMP によって「ポートに到達できません」というエラー メッセージが送信側に送信されます。
1.2 UDP インスペクション
チェックサムを計算するときは、UDP データグラムの前に 12B 疑似ヘッダーを追加する必要があります。ダミー ヘッダーは送信も送信もされませんが、チェックサムの計算のみを目的としています。UDO のチェックサムは、ヘッダーとデータ セクションをチェックします。
UDP チェックサムの計算方法:
送信者は最初にすべて 0 をチェックサム フィールドに入れ、ヘッダーを追加してから、データ部分の最後にすべて 0 のバイトを埋めます (ただし、このバイトは送信されません)。次に、2 進補数コードに従ってこれらの 16 ワードの合計を計算し、この合計の 2 進補数コードをチェックサム フィールドに書き込んで送信します。受信側は、受信した UDP データグラムにダミーヘッダを付加し、合計値の 1 の補数を検証量フィールドに書き込んで送信します。受信者は、受信した UDP データグラムに疑似ヘッダーを追加し、バイナリの 1 の補数コードを追加して、これらの 16 ビット ワードの合計を求めます。エラーがない場合、結果はすべて 1 になります。それ以外の場合は、エラーがあることを示し、受信者はこの UDP データグラムを破棄する必要があります。
2. TCP プロトコル
TCPプロトコルは、信頼性の低いIP層に実装された信頼性の高いデータ伝送プロトコルであり、主に信頼性が高く、秩序があり、損失がなく、繰り返しのない伝送の問題を解決します。TCP は TCP/IP システムの非常に複雑なプロトコルで、主な機能は次のとおりです。
-
TCP は接続指向のトランスポート層プロトコルであり、TCP 接続は論理接続です。
-
各 TCP 接続は 2 つのエンドポイントのみを持つことができ、各 TCP 接続はポイント ツー ポイント (1 対 1) のみにすることができます。
-
TCP は信頼性の高い配信サービスを提供し、送信データにエラーがなく、失われず、繰り返されず、順序どおりであることを保証します。
-
TCP は全二重通信を提供し、両当事者のアプリケーション プロセスがいつでも通信してデータを送信できるようにします. このため、TCP 接続の両端には送信キャッシュと受信キャッシュが装備されており、データを一時的に 2 秒間保存します。方法通信。
-
TCP はバイト ストリーム指向です。アプリケーション プログラムと TCP の間の対話は一度に 1 つのデータ ブロック (異なるサイズ) ですが、TCP はアプリケーション プログラムによって渡されるデータを一連の非構造化バイト ストリームと見なすだけです。
TCP と UDP では、パケットの送信方法がまったく異なります。UDP メッセージの長さは送信アプリケーション プロセスによって決定されますが、TCP メッセージの長さは、受信者によって指定されたウィンドウ値と現在のネットワークの輻輳レベルに従って決定されます。アプリケーションから TCP キャッシュに送信されたデータ ブロックが長すぎる場合、TCP はそれを送信する前に短い断片に分割します。短すぎる場合、TCP は十分なバイトが蓄積されるまで待ってから、セグメントを形成して送信することもできます。外。
2.1 TCP セグメント
TCP で送信されるデータの単位をセグメントと呼びます。TCP セグメントは、データの伝送だけでなく、接続の確立、接続の解放、および応答にも使用できます。
TCP セグメントは、ヘッダーとデータの 2 つの部分に分かれています。TCP セグメント全体が、IP データグラムのデータ部分として IP データグラムにカプセル化されます。そのヘッダーの最初の 20B は固定です。最短の TCP ヘッダーは 20B で、次の 4N バイトは必要に応じて追加できるオプションです。
【学習アドレス】:FFmpeg/WebRTC/RTMP/NDK/Androidの音声・動画ストリーミングメディアの高度な開発
[記事の特典]: より多くのオーディオおよびビデオ学習パッケージ、Dachang インタビューの質問、テクニカル ビデオ、学習ロードマップを無料で受け取ることができます (C/C++、Linux、FFmpeg webRTC rtmp hls rtsp ffplay srs など) 1079654574 をクリックして参加します受け取るグループ〜
ヘッダーのフィールドは次のとおりです。
-
送信元ポートと宛先ポートはそれぞれ 2B を占有します。ポートは、トランスポート層とアプリケーション層の間のサービス インターフェイスであり、トランスポート層の多重化および逆多重化機能は、ポートを介して実現する必要があります。
-
シリアル番号は 4B を占めます。TCP 接続によって送信されるバイト ストリーム内の各バイトには、順番に番号が付けられます。シーケンス番号フィールドの値は、このセグメントで送信されたデータの最初のバイトのシーケンス番号を参照します。
-
確認番号、4B。これは、相手が受信すると予想される次のセグメントの最初のデータ バイトのシーケンス番号です。確認番号が N の場合、シーケンス番号 N-1 までのすべてのデータが正しく受信されたことを意味します。
-
4 ビットを占めるデータ オフセット (ヘッダーの長さ) で、TCP セグメントのデータの先頭が TCP セグメントの先頭からどれだけ離れているかを示します。「データオフセット」の単位は 32 ビット(4B で計算)です。4 ビットの 2 進数で表現できる最大値は 15 であるため、TCP ヘッダーの最大長は 60B です。
-
貸切、6席占有。
-
緊急ビット URG。URG=1 の場合、緊急ポインタ フィールドが有効であることを示し、このセグメントに緊急データがあり、できるだけ早く送信する必要があることを示します。
-
確認ビット ACK。ACK=1 の場合、確認番号フィールドは有効です。TCP は、接続が確立された後、送信されたすべてのセグメントで ACK を 1 に設定する必要があると規定しています。
-
プッシュビット PSH (プッシュ)。受信側の TCP が PSH=1 のセグメントを受信すると、キャッシュ全体がいっぱいになるまで待たずに、できるだけ早く受信側のアプリケーション プロセスに配信します。
-
ビット RST をリセットします (リセット)。RST=1 の場合、TCP 接続に重大なエラーがあり、接続を解放してから、トランスポート接続を再確立する必要があることを示します。
-
同期ビット SYN。SYN=1 の場合は、接続要求または接続受付メッセージであることを意味します。
-
終了ビット FIN (終了)。FIN=1 の場合、このセグメントの送信者のデータが送信されたことを示し、トランスポート接続を解放する必要があります。
-
ウィンドウは 2B を占有します。相手が送信できるデータ量を示します。
-
2B を占めるチェックサム。検査の範囲には、ヘッダーとデータの 2 つの部分が含まれます。
-
2B を占有する緊急ポインター。URG=1 の場合に意味があり、緊急データが何バイトあるかを示します。
-
オプション、可変長。MSS は、TCP セグメントのデータ フィールドの最大長です。
-
パディング。ヘッダー全体の長さが 4B の整数倍になるようにします。
2.2 TCP 接続管理
TCP 接続のポートはソケットであり、TCP 接続は毎日、通信の 2 つのエンドポイント (つまり 2 つのソケット) によって一意に決定されます。
TCP 接続の確立には、クライアント/サーバー モードが採用されます。接続の確立をアクティブに開始するアプリケーション プロセスはクライアントと呼ばれ、接続の確立を受動的に待機するアプリケーション プロセスはサーバーと呼ばれます。
2.2.1 TCP コネクションの確立
-
クライアントの TCP は、最初に接続要求セグメントをサーバーに送信します。このとき、ヘッダの同期ビットSYNを1にセットし、同時に初期シーケンス番号seq=xを選択する。TCP は、SYN セグメントがデータを伝送できないことを規定していますが、シーケンス番号を消費します。
-
サーバーの TCP が接続要求セグメントを受信した後、接続の確立に同意した場合は、確認応答をクライアントに送り返し、TCP 接続用のバッファーと変数を割り当てます。確認メッセージ セグメントでは、SYN ビットと ACK ビットを 1 に設定します。確認番号は ack=x+1 であり、同時に初期シーケンス番号 seq=y を自分で選択します。確認応答セグメントはデータを運ぶことはできませんが、シーケンス番号を消費します。
-
クライアント コンピューターは、確認メッセージ セグメントを受信した後、サーバーに確認を送信し、TCP 接続用のバッファーと変数を割り当てる必要もあります。確認メッセージ セグメントの ACK 位置は 1、確認番号 ack=y+1、シーケンス番号 seq=x+1 です。このセグメントはデータを運ぶことができ、データを運ばない場合、シーケンス番号は消費されません。
上記の 3 つの手順を正常に実行すると、TCP 接続が確立されます。サーバー側のリソースは 2 回目のハンドシェイクが完了すると割り当てられ、クライアント側のリソースは 3 回目のハンドシェイクが完了すると割り当てられるため、サーバーが SYN フラッド攻撃に対して脆弱になることに注意してください。
(TCP リリースについてはここでは説明しません。)
3. まとめ:
-
接続が確立されました
-
SYN=1、シーケンス=x
-
SYN=1、ACK=1、seq=y、ack=x+1
-
ACK=1、seq=x+1、ack=y+1
-
-
接続解除
-
FIN=1,seq=u
-
ACK=1、seq=v、ack=u+1
-
FIN=1、ACK=1、seq=w、ack=u+1
-
ACK=1、seq=u+1、ack=w+1
-
紙面の都合上、とりあえずここに収録~