banner
Bai

Bai

写代码菜的一批 🤣
twitter
telegram
tg_channel
pixiv
github
bilibili
whatsapp

TCP/IPプロトコルの15の質問

一、ネットワーク層とは何ですか?#

TCP ネットワークの階層は通常 4 つの階層に分かれていますが、5 つの階層とも言われています。

  1. アプリケーション層(HTTP):データパケットをカプセル化します。
  2. トランスポート層(TCP):TCP ヘッダを追加し、ポート番号などの情報を含めます。
  3. ネットワーク層(IP):IP ヘッダを追加し、IP アドレスなどの情報を含めます。
  4. ネットワークインターフェース層(ARP):イーサネットヘッダを追加し、MAC アドレスなどの情報を含めます。

ネットワーク層の利点:

  • 各層は独立しています:依存関係の範囲が制限され、各層は標準化されたインターフェースを使用しており、上下の層がどのように動作するかを知る必要はありません。アプリケーション層プロトコルを追加または変更しても、トランスポート層プロトコルに影響を与えることはありません。
  • 柔軟性:たとえば、ルーターはアプリケーション層とトランスポート層を必要としないため、階層化することでルーターはより少ないプロトコル層をロードすることができます。
  • テストとメンテナンスが容易:テスト可能性が向上し、特定の層を独立してテストできます。特定の層の実装が改善された場合、全体を置き換えることができます。
  • 標準化を促進:各層の役割が明確であり、標準化が容易です。

二、TCP の 3 ウェイハンドシェイク?なぜ 2 回または 4 回ではないのですか?#

  1. クライアントはサーバーに SYN を送信し、seq = x です。
  2. サーバーはクライアントに SYN を送信し、seq = y、ACK = x + 1 です。
  3. クライアントはサーバーに ACK = y + 1 を送信します。

2 回では不十分です。2 回だけではサーバーの受信能力を確認することができません。
4 回の場合は不要であり、リソースの浪費を引き起こす可能性があります。

三、TCP の 4 ウェイハンドシェイク?なぜ 3 回ではないのですか?#

  1. クライアントはサーバーに FIN を送信し、seq = x + 2、ACK = y + 1 です。
  2. サーバーはクライアントに ACK = x + 3 を送信します。
  3. サーバーは残りのデータを送信した後、クライアントに FIN を送信し、seq = y + 1 です。
  4. クライアントはサーバーに ACK = y + 2 を送信します。

3 回では不十分であり、サーバーの ACK と FIN が遅れて送信される可能性があります。遅延時間が長すぎる場合、クライアントは切断要求を再送信し、リソースの浪費を引き起こす可能性があります。

四、なぜ SYN/FIN にはデータが含まれていないのにシーケンス番号を消費するのですか?#

相手に確認が必要な場合、TCP パケットのシーケンス番号が必ず消費されます。

五、半接続キューとは何ですか?SYN Flood 攻撃とは何ですか?#

クライアントが大量の偽の IP を使用して SYN パケットを送信し、サーバーからの ACK + SYN が(未知の)IP アドレスに送信されると、サーバーは大量の接続が SYN_RCVD 状態にあることになります。また、サーバーの半接続キューサイズにも制限があります。半接続キューがいっぱいになると、正常なリクエストの処理ができなくなる可能性があります。

六、TCP Fast Open の原理は何ですか?#

TCP Fast Open(TFO)
TFO は、元の TCP プロトコルに対する拡張プロトコルであり、最初の SYN パケットの送信時にデータを送信できるようにします。ただし、現在のクライアントは通常の 3 ウェイハンドシェイクを完了している必要があります。

TCP Fast Open には 2 つのフェーズがあります:Fast Open Cookie の要求と実際の TCP Fast Open の開始

TCP Fast Open の利点
ハンドシェイクを省略することで、往復時間(RTT)を削減し、SYN-Flood などの攻撃を防ぐことができます。

七、TCP パケットのタイムスタンプの目的は何ですか?#

TCP タイムスタンプオプションは、カテゴリ、長さ、送信元タイムスタンプ、エコーバックタイムスタンプの 4 つの部分で構成されています。

最初に RTT を計算するために使用され、2 番目にシーケンス番号のラップアラウンドの問題を防ぐために使用されます。同じシーケンス番号を使用していても、タイムスタンプを使用して異なるパケットを区別することができます。

八、TCP の再送タイムアウトはどのように計算されますか?#

再送タイムアウト:Retransmission TimeOut(RTO)

クラシックな解決策
RTT が小さい場合に適用される。SRTT(smoothed round trip time)を使用します。
最新の RTT を使用して SRTT 時間を更新します。
SRTT = α × SRTT + (1-α)× RTT

九、TCP フロー制御とは何ですか?#

送信データを送信バッファに格納し、受信データを受信バッファに格納します。受信バッファのサイズに基づいて送信側を制御します。
受信側は自分の受信ウィンドウ、つまり受信バッファ内の空き領域を通知します。

送信パケットの状態:

  • 送信済みかつ確認済み
  • 送信済みで未確認
  • 未送信で受信側が受け入れ可能(受信側に空きがある)
  • 未送信で送信不可(受信側に空きがない)

送信速度が遅い場合:送信待ちのバイトが多く存在します。
送信速度が速い場合:確認待ちのバイトが多く存在します。

十、TCP のキープアライブの原理は何ですか?#

接続の相手が生存しているかどうかを定期的に確認するために、プローブパケットを定期的に送信します。ただし、キープアライブのデフォルトの設定時間は長すぎて実用的ではないため、通常はアプリケーションレベルでハートビートメカニズムを使用します。

ハートビートメカニズムとは何ですか?
定期的にサーバーにメッセージを送信し、サーバーの応答に応答することができます。

長時間接続のビジネスシナリオ

  • ゲーム
  • リアルタイムコミュニケーション
    ハートビートメカニズムがない場合、ネットワークが切断されても相手は気づきません。
    クライアントがオフラインになった場合、サーバーはそれを知らずに接続を維持し続けるため、余分な無効なシステムオーバーヘッドが発生します。

なぜハートビートパケットが必要なのですか?

  • NAT、ファイアウォールネットワークにデバイスを配置し、チャネルレコードを保持します。
  • 相手のネットワーク切断を早期に検出し、適切な措置を講じます。

ハートビートパケットの実装方法

  • TCP レベルのハートビートパケットは、ネットワーク接続が異常であるかどうかを確認することしかできません。
  • アプリケーションレベルのハートビートパケットは、サービスインターフェースが異常であるかどうかを確認します。

なぜ TCP レベルを使用しないのですか?
アプリケーションレベルの接続が成功した場合、TCP があるトランスポート層も必ず成功します。

十一、TCP パケットのポート番号とは?#

  • ソースポート:ローカルポート
  • 宛先ポート:サーバーポート
    最大 65536 個あり、0 から 65535 までの範囲です。

以下は一部の一般的なポート番号の例です:

  • 21:FTP(ファイル転送プロトコル)ポート、ファイルのアップロードとダウンロードに使用されます。
  • 22:SSH(セキュアシェルプロトコル)ポート、安全なリモートログインとコマンドの実行に使用されます。
  • 25:SMTP(シンプルメール転送プロトコル)ポート、電子メールの送信に使用されます。
  • 80:HTTP(ハイパーテキスト転送プロトコル)ポート、Web ブラウザでのウェブサイトへのアクセスに使用されます。
  • 110:POP3(ポストオフィスプロトコルバージョン 3)ポート、電子メールクライアントでのメールの受信に使用されます。
  • 143:IMAP(インターネットメッセージアクセスプロトコル)ポート、電子メールクライアントでのメールの受信に使用されます。
  • 443:HTTPS(ハイパーテキスト転送プロトコルセキュリティ)ポート、安全なウェブブラウザでのウェブサイトへのアクセスに使用されます。
  • 3306:MySQL データベースポート、データの保存と検索に使用されます。
  • 3389:Microsoft リモートデスクトップポート、コンピュータのリモート管理と制御に使用されます。
    これは一部の一般的なポート番号の例であり、実際にはさまざまな通信プロトコルとアプリケーションに使用される他の多くのポート番号があります。

十二、TCP のシナリオの問題#

問題 1
A と B の 2 つのホスト間で TCP 接続が確立され、A ホストから B ホストに 2 つの TCP パケットが送信されます。パケットのサイズはそれぞれ 500 と 300 で、最初のパケットのシーケンス番号は 200 です。B ホストが 2 つのパケットを受信した後、返される確認番号はいくつですか?
500 + 300 + 200 = 1000

問題 2
受信した IP パケットを解析した後、どのプロトコル(TCP または UDP)に上層に配信する必要があるかをどのように知ることができますか?
IP パケットヘッダにはプロトコルフィールドがあり、TCP は 6、UDP は 17 です。

問題 3
TCP はバイトストリームサービスを提供し、送受信の両方が境界を保持しないため、アプリケーションは自分自身のレコード識別子をどのように提供すればよいですか?

アプリケーションは、メッセージの境界を識別するために独自のルールを使用します。たとえば、いくつかのアプリケーションはキャリッジリターン + 改行("\r\n")を使用し、Redis の通信プロトコルなどがあります。

十三、TCP と UDP の違いは何ですか?#

TCP は接続指向、信頼性のあるバイトストリームベースのトランスポート層プロトコルです。
UDP は接続指向ではないトランスポート層プロトコルです。

  • 接続指向:クライアントとサーバーの接続において、通信前に 3 ウェイハンドシェイクを行います。

  • 信頼性:

  1. TCP は状態を持ちます:TCP はデータの送信、受信、未受信を正確に記録し、データパケットの順序を保証し、エラーを許容しません。
  2. TCP は制御可能です:パケットのロスやネットワークのパフォーマンスに応じて自動的に調整します。

十四、Telnet と netstat の使い方は?#

  • リモートポートが開いているかどうかを確認するために使用されます。構文:telnet [ip] [port]
  • ネットワークの状態を調べるために使用されます。例:netstat -ano

十五、Tcpdump と wireshark#

パケットキャプチャに使用されます。たとえば、3 ウェイハンドシェイクや 4 ウェイハンドシェイクなどを確認できます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。