ネットワークプロトコル8

  1. ネットワークプロトコル1 – 概要
  2. ネットワークプロトコル2 – IPはどうやって来たのですか?
  3. ネットワークプロトコル3 – 物理層からMAC層へ
  4. ネットワークプロトコル4 – スイッチとVLAN:オフィスが複雑すぎる、私は学校に戻って行きたい
  5. ネットワークプロトコル5 – ICMPとPing:スカウト
  6. ネットワークプロトコル6 – ルーティングプロトコル:どこに問い合わせるのですか?
  7. ネットワークプロトコル7 – UDPプロトコル:セクシュアリティは再生する都市に適合

前回私が "Sexual Good" UDPプロトコルを言ったとき、このバディは "ネットワークの始まり、性質は良い、パッケージを失うことはなく、順不同ではない"という原則に従い、ネットワークの世界にある。

これに対応して、TCPは社会の残酷さを理解し、複雑で成熟し、「性的邪悪な理論」に忠実な兄弟のようなものです。 パケットロス、順序外れ、再送、輻輳は一般的なことですが、同意しないとパケットが失われて配信できなくなるため、信頼性はアルゴリズムレベルから保証されます。

TCPヘッダー形式

古い規則では、TCPヘッダーの形式を見てみましょう。

上記の図から分かるように、UDPよりもはるかに複雑です。 複雑な場所は、UDPの問題を解決するために必要な分野でもあります。

まず、送信元ポート番号と宛先ポート番号はともに不可欠なフィールドです。

次のパケットのシーケンス番号です。 パケット番号に問題を解決するための外です。 大兄弟は物事をしており、彼は安定しており、彼は複雑な状況に直面しています。

送信されたパケット数を終了する必要性に加えて、受信機は、 確認番号を返します 物事を行うことは信頼できる、あなたはそれをしなければならない、あなたはしばらくそれをすることはできません。

TCPは大きな兄弟ですが、送信の正確さを保証するとは言えません。 IPレベルから、ネットワークが本当に悪い場合は、信頼性の保証はありません.TCPの兄が安定していても、IPレイヤのパケット損失を管理することはできません。セックス

そして、いくつかのステータスビット。 次の共通ステータスビットがあります。

  • SYN(シーケンス番号を同期させる):接続を開始する
  • ACK(肯定応答):返信
  • RST(接続リセット):再接続
  • FIN:接続を終了する

これらのステータスビットから、TCPは「性的害悪の理論」に基づいていることが分かり、アラートは非常に高いです。UDPや子供とは異なり、わからない子供だけが一緒に遊ぶことができます。複数の相互作用を確立することができます。

ウィンドウサイズもあります これは、フロー制御に使用されるTCPです。 通信の2つの側面はそれぞれ、現在の処理能力を識別するためのウィンドウを宣言し、送信者があまりにも速く送信しない、または受信者が死んでいる。 それはあまりにも遅く送信することはできません、またはそれは受信機で飢えています。

上記のTCPヘッダーの分析に基づいて、次の問題がTCPプロトコルに焦点を当てるべきであることがわかっています。

  • 注文の問題、安定した、混沌としたものではない。
  • 手荷物の損失、約束は信頼できる。
  • 最初から最後までWeihaoに接続しました。
  • フロー制御、サイズをつかむ。
  • 輻輳制御、知り、知る。

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

TCPヘッダの完全な理解は、私たちは有名であるTCPコネクションの確立、見てみましょう「スリーウェイハンドシェイク。」

スリーウェイハンドシェイクは、プロセスは次のようになります:

  • A:こんにちは、これは(SYN)です
  • B:こんにちはA、I B(SYN、ACK)。
  • :こんにちは、B(ACKのACK)。

上記のプロセスを覚えることに焦点を当て、多くのその後の分析はこのプロセスに基づいています。

3ウェイハンドシェイクに初めて触れたとき、私はいつも不思議に思っていましたが、なぜ3回持っていかなければならないのですか? あなたは二度できませんか? あなたは4回できませんか? それから、多くの人々は、それが2回なら、どのように、4回、どのように説明しましたか? しかし、 その理由を押してから 、実際の結果にはそれが自然に指定されていませんでした。

私たちは、これが究極の目標である、握手は安定した接続を確立することであることを知っている必要があります。 この目的を達成するために、我々は、 閉ループ確認を形成するために、2つの側面間の双方向のコミュニケーションを持っています

AとBの通信の上記の例を取り上げると、AはBにメッセージを送信し、BはAにメッセージを受信したことを通知します。 現時点では、確認のループですか? 明らかに、BはAからの確認を受け取っていないためではありません。

そこで、我々はこのように閉ループ確認を形成し、上記の目標を達成したい、だけでなく、Bへの確認A。

AがBに確認メッセージを送信した後、ネットワークが正常でない場合、パケット損失が発生します。 論理的に言えば、応答があるはずですが、これは再生されていないようです。

したがって、通信関係者が閉ループを形成する限り、接続は確立されているとみなされます。 接続が確立されると、Aはすぐにデータを送信し、Aはデータを送信し、その後の多くの問題が解決されます。

例えば、AからBによって送信された確認メッセージは失われ、その後にAによって送信されたデータが到着すると、Bは接続が確立されたとみなすことができる。 Bが直接ハングした場合、Aによって送信されたデータは、Bが到達不能であるとエラーを報告するので、AはBが故障していることを知る。

3ウェイハンドシェイクに加えて、主にTCPパケットの通信の問題番号に 、通信相手の接続を確立します

A Bに通知するために、開始したパケットの開始番号がBから開始されたパケットのシリアル番号の開始番号であるAから始まる番号から開始します。

TCPパケットのシリアル番号は時間とともに変化し、32ビットのカウンタと見なすことができ、4msごとにインクリメントされます。 計算すると、その数字を繰り返すのに4時間以上かかります。 しかし、4時間後、目的地に到着していないバッグはすでに死亡しています。 これは、IPヘッダーのTTL(生存時間)のためです。

シリアル番号が1から始まらないのはなぜですか? これは容易に矛盾につながるからです。

たとえば、AがBに接続すると、1,2,3パケットが送信されますが、3を送信すると、途中で失われるか、または迂回されて再送信され、Aがドロップされ、Bが再び接続されます。通し番号は1から始まり2を送りますが、3を全く送るつもりはありませんが、迂回路の最後の3つが戻ってBに送られた場合、Bは自然にこれが次のパッケージだと考えてしまいました。間違っている。

このようにして、双方は多くの苦難を経験し、最終的につながりを確立しました。 前述のように、この接続を維持するには、両者がステートマシンを維持する必要があります。接続確立プロセス中、両者の状態変更タイミング図は次のとおりです。

全体のプロセスは次のとおりです。

  1. クライアントとサーバーの両方がCLOSED状態です。
  2. サーバーはアクティブな状態でポートをリッスンし、LISTEN状態になります。
  3. クライアントは接続SYNを開始し、SYN-SENT状態になります。
  4. サーバはクライアントによって開始された接続を受け取り、SYNを返し、ACKクライアントのSYNはSYN-RCVD状態になります。
  5. サーバから送信されたSYNとACKを受信した後、クライアントはESTABLISHED状態にあるACKのACKを送信します。
  6. サーバは、ACKのACKを受信した後、ESTABLISHED状態になります。

TCPの4つの波

接続について話した後、TCPの「さよならモード」を見てみましょう。 これは、多くの場合、4回と呼ばれ、手を振っています

また、AとBを取って、プロセスを振ります:

  1. A:Bああ、私はあなたと遊びたくありません。
  2. B:ああ、あなたは遊びたくありません、私は知っています。 この時間は、ちょうどAがデータを送信しないこと、Aをプレイする必要はありませんが、今回はBは自分のことを行っていない、またはあなたがそう半分閉じ 、この場合Bには、データを送信することができます
  3. B:A、いいよ、私はあなたと遊びたくありません、さようなら。
  4. A:よし、さようなら。

この接続は閉じられています。 それはプロセスが非常にスムーズであるようです、はい、これは両当事者間の "平和的な分裂"の場面です。

Aは "これは前に、両側はまだ協力の状態にあるので、"演奏しない、Bは "知って"、このラウンドは、問題はないと言って始めた。

Aが「再生しない」と応答しない場合、Aは「再生しない」を再送信します。 しかし、このラウンドが終わった後は、最初に顔を裂くために異常な状況が起こる可能性が非常に高い。 この顔が引き裂かれる状況は2つあります。

Bは終わりを開始していない、との直接実行中の場合、Bの終了によって開始された場合でも、取得していないので、一つのケースでは、Aが終了した後、そこに問題があるの直接実行を、「再生しません」答え、B、私は何をすべきかわかりません。

他の例では、仕上げは足の上に直接、Bを 「再生できません」。 これはまた、AがBが何かをしているかどうか、あるいはしばらくして終了するかどうかをAが知りませんので問題になります。

これらの問題を解決するために、TCPはこれらの問題を処理するいくつかの州を設計しました。 切断されたときに続いて、我々はタイミングチャートの状態を見てみましょう。

全体のプロセスは次のとおりです。

  1. Aは「再生しない」と言って、FIN_WAIT_1状態に入る。
  2. B「Aが再生しない」というメッセージを受信した後、「know」と応答してCLOSE_WAIT状態に入る。
  3. Aは「Bが知っているとわかる」を受け取り、FIN_WAIT_2状態に入ります。 このとき、Bの直接実行中の場合は、Aは、常にこの状態になります。 TCPプロトコルはこの状態を処理しませんが、Linuxにはtcp_fin_timeoutパラメータを調整してタイムアウト時間を設定するオプションがあります。
  4. Bは実行されず、LAST_ACK状態のメッセージ「Bが再生されていません」が送信されました。
  5. Aはメッセージ「Bはいいえ」を受信し、「AはBが再生していないことを知っている」というメッセージに応答し、FINE_WAIT_2ステータスで終了する。

最後のステップで、Aがまっすぐ進むと、問題が発生します。 Aの最後の返信のため、Bは受信されていない場合は手順4を繰り返しますが、Aは既に実行されているためBは手順4を繰り返します。

したがって、TCPプロトコルでは、Aに一定時間待機する必要があります。この待機時間はTIME_WAITです。この時間は十分です。BがAの応答を受信しない場合、BはAに応答を返し、Aの応答にはBに到達するのに十分な時間があります。

Aのポートが空であるが、Bが最初に送信したパケットの多くが依然として移動している可能性があることをBが認識していない場合、Aのポートが新しいアプリケーションによって占有されている場合、シリアル番号は再生成されますが、以前の接続でBによって送信されたパッケージが届きますが、混乱を防ぐために二重保険が適用されます。 したがって、Aが、Bによって送信されたすべての未送信パケットが「致命的に歪められ」、その後ポートを空にするまで、十分に長い時間待つことも必要です。

この待機時間が2MSL設定されている、MSLは最大セグメント寿命、最大生存時間であるメッセージです ネットワーク上にメッセージが存在する最長時間であり、この時間を超えるメッセージは破棄されます。

TCPパケットはIPプロトコルに基づいており、IPヘッダーにはIPデータグラムが通過できる最大数であるTTLフィールドがあります。この値は、ルータが処理されるたびに1ずつ減ります。レポートは破棄され、送信元ホストに通知するためにICMPメッセージが送信されます。 この協定では、MSLが2分であり、30秒、1分、2分が実用化に一般的に使用されると規定されている。

異常があり、Bは2MS時間よりも、まだそれはACKのFINを送信受け取っていません。 TCPの原則によれば、BはもちろんFINを再送しますが、この時点でAがパッケージを受け取った後、私はあなたを待っていると言いますが、それは誠実であると考えられます。 RSTなので、BはAが動作していることを知っています。

TCPステートマシン

一緒に2つのタイミング状態図の接続の確立と切断は、よく知られたTCP状態機械です このステートマシンをタイミングステートマシンと比較すると、より明確になります。

写真の黒と太字の部分が上記の主要なプロセスです。

  • アラビア数字のシリアル番号:接続順序を確立する。
  • 大文字の数字のシリアル番号:切断された注文。
  • 太い実線:クライアントAの状態が変化する。
  • 太字の点線:サーバBの状態遷移。

要約

  • TCPヘッダーは複雑で、5つの問題に焦点を当てています。 シーケンス問題、パケット損失問題、接続維持、フロー制御、輻輳制御。
  • 3方向ハンドシェイク接続を確立し、4回接続を切断し、状態図を覚えておく必要があります。

リファレンス:

  1. Baidu百科事典 – TCPエントリ。
  2. Liu Chao – ネットワークプロトコルシリーズに関する興味深い話。
元のリンク