TCPはどのように機能しますか? そのrozrivTCP接続の確立 ウザガルネーニャ

ゴロフナ / 2つのクールなリーダー

TCPという略語をよく知っているほど、伝送プロトコルが何であるかを知っている人は少なくなります。 エール、実質的に誰も和解に勝つ方法を知りません。

尊敬する! これは、食べ物と騙されて喧嘩している人のための保険の適用範囲の資料です。「メッシュがどのように固定され、私が成長できるか、私は知っています」。 それでもDNS、Telnet、Socketの単語を使用する必要がある場合は、この資料でスコアを付けることができます。ここでのこのような「ひどい」単語は、明らかに甲高いものではありませんが、考えることはできません。

静かな人、酔っている人のために:

間違いなく、多くの人がSYNフラッドやIPスプーフィングのような同じ言葉を感じることができます。 あらゆる種類の攻撃-pershaD.O.S.、友人
IPアドレスの置き換えにおけるpolagaє。 一見、これらのバットの間に問題はありませんが、そうではありません。攻撃的な攻撃は、TCPプロトコル、つまりその基盤となるプロトコルについての深い知識がなければ実行できません。
イネット。

TCPプロトコルの仕様は、RFC793で説明されています。 このドキュメントをよく理解しておくことをお勧めします。そうすれば、必要に応じて、マニュアルではわからない重要で関連性のあるコメントを少量で提供することで、より重要なことを伝えようとします。そして夜明けの実用的なカット、私は微妙さを逃すことができます。

データはパケットの形で転送されます。 この転送の編成は、データがどんなに臭くても、パケットに形成される小さなフラグメントに分割されることを意味します(転送中にパケットを形成し、サービスヘッダーがデータに追加されるようにします)。その後、一目で、データパケットはメジャーを介して送信されます(さらに、パケットの転送順序を分類できます)。 パケットヘッダーのサブセット上のデータの特定の配列からパケットの「ピック」を受け入れるシステム。 ツェはあまり理解していませんでしたが、ドックはパッケージの構造を調べていません。

TCPパケット構造:

最も重要な場所のみを説明します。

所有者の住所、所有者のポート、管理者のアドレス、管理者のポート-私は賢明に理解しています。

シーケンス番号(SYN)-カードの番号または最後の番号。送信時間のパケットのシリアル番号を示します。システム自体は、必要に応じてパケット自体を取得しますが、この順序ではなく悪臭として取得します。来ました。

確認応答番号(ACK)-システムがデータを含むパケットを拒否したことを示す確認番号
SYN。

制御ビット-6ビット(反転とウィンドウの間のスキーム)。 戦いの意味:

URG:用語インジケーターフィールド
ACK:確認フィールド
PSH:収納機能
RST:この法案の再進め
SYN:カードの番号の同期
FIN:送信するデータはもうありません

データ-データ、yakіmiは転送したいです。

仕事とプロトコルの原理を理解するために必要なのはそれだけだと思います。 RFC793の他のフィールドの意味に関するレポートを読むことができます。 さて、実際に実践されているので、もっと簡単に整理します。

システムをインストールする場合は、攻撃的な構造のシステムパッケージを編集できます。

クライアント---SYN(856779)---ホスト

De Client-tse mi、ホスト-システム全体。 どのようにそれを行うか、パケットを強制的に割り当てられたSYNより小さくします-これは、このパケットが最初のパケットであり、許可されていないことを意味します(毎日のACK)。 Tseyパッケージ次のようになります。

20 53 52 43 00 00 44 45 53 54 00 00 08 00 45 00 00 2C C3 00 40 00 20 06 10 0C CB 5E FD BA CB 5E F3 4 0 0 0 0 D9 70 00 00 02 04 05 B4 2D

その時のTsіkavyの瞬間、zvіdkiはSYNになります。 SYNは、チェルガの穂軸番号として検証されます
(ISN)-1から4294967295までの同じ32ビット数(32番目のステップでは2)。 再定量化されたシステムがdorivnyu1の場合のISN、128000の2番目のvin zbilshuhniへのPotim(厳密には一見、Zmina VIDBUVA VIKHNI 4 MIKROSKUNIDA)+皮膚の下でゼロドナニvinzbilshchiが64000になりました。 4.55歳。 パッケージの価格が長く上がることはないので、SYNが絶対にユニークになることを確認できます。

私たちのパッケージをotrimavshiした後、システムvіddalenavіdpovidaє、schootrimalaそれは注文をインストールする準備ができています。 このパッケージは次のようになります。

ホスト---SYN(758684758)およびACK(856780)---クライアント

Yak bachish、遠くにシステムはそれが私たちのパッケージに勝ったという理解を与えます。 勝ったものは、「私たちのSYN+1」という数字で私たちのACKを圧倒しました。 システムは、この距離の補遺のSYNを送信します。 そして、私たちのアドバイスは次のようになります。

クライアント---SYN(856780)およびACK(758684759)---ホスト

すでにすべてを理解できていると思います。 わからない場合は、パッケージが来ることを意味します。SYN(758684758)を含むパッケージが削除され、日付がインストールされ、SYNが856780に復元されました。

Qiuの手順は、「3回の確認」または「3回の握手」と呼ばれます。 最初の2つの段階は、システムのSYNを同期するために必要であり、3つ目は、同期が達成されたことの確認です。

両替をお願いします、それだけです。 現在セットアップおよび復元されているもの。 さらに、TCPプロトコルを使用して転送されるデータセキュリティのすべての段階で、次のようになることに注意してください。メッセージパケットはバッファに配置され、 予約時間システムが確認応答(ACK)からパケットを受信しない場合、パケットは再度送信されます。 確認が到着した場合、パケットは成功したと見なされ、バッファから削除されます。

ええと、これ以上は必要ありません。シャットダウンできます。 ツェイステージが再び
いくつかの段階にまたがる-私はこれらのパッケージを自分で読むことができます。

クライアント---FIN(4894376)およびACK(1896955378)---ホスト

ホスト---ACK(4894377)---クライアント

ホスト---FIN(1896955378)およびACK(4894377)---クライアント

クライアント---ACK(1896955378)---ホスト

ここでは複雑なことは何もないと思います。 vartoが意味するのは、タスクを完了するためのミッションを意味するエンサインFINだけです。

ぬいぐるみの小さな袋の場合、注文番号が変わる/変わらない場合があることは重要です。

1つのFINをパケットに渡す=+1
1つのSYNパケットを送信=+1
1つのACKパケットを送信=0
1つのSYN/ACKパケットを送信=+1
1つのFIN/ACKパケットを送信=+1
1秒で変化=+128,000
インストールされた半分=+64,000

「そして、マシンがそのようなACKからパケットを受け取るとどうなるでしょうか?」と尋ねると、それは可能です。 (SYN = ACK-1であり、そのようなSYNからパケットを送信しませんでした)。 Otrimavshivіdpovіdnezazumіlіscho、これからの時間についてお話しします。

エントリ

TCPは同じプロトコルであり、宛先を対象としています。 その前に、あたかも側が他の人に敬意を表すことができるかのように、それらの間に1日を確立することができます。 私たちが分割した人には、TCPがどのようにインストールされ、どのように開かれているかが報告されます。

TCP作業用のシャードは、2つのポイントの間にインストールする必要があり、UDPなどの接続のないプロトコルに使用できます。 UDPを使用する場合、スキン側はz'ednannyaの前に立つことなく、単に他のデータグラムを追加することを試みました。

ドアを設置して開けた

TCPがインストールされたときに何が起こるかを確認するために、svr4システムでコマンドを実行します。

svr4% telnetbsdi破棄
192.82.148.3を試して...
bsdiに接続しました。
エスケープ文字は「^]」です。
^] コントロール、右の四角い弓、
telnet> 終了する schobTelnetクライアント
接続が閉じられました。

telnetコマンドは、ホストのbsdiポートにTCP接続を設定します。これは、破棄サービスに適しています(第1章、セクション1)。 これは、そのサービスがインストールされたときに何が起こるかに驚嘆するために必要なタイプのサービスですが、お金を交換することはありません。

Visnovok tcpdump

このコマンドによって生成されたセグメントの18.1tcpdumpvisnovok読み取り値。

1 0.0 svr4.1037> bsdi.discard:S 1415531521:1415531521(0)
4096勝
2 0.002402(0.0024)bsdi.discard> svr4.1037:S 1823083521:1823083521(0)
ack1415531522勝利4096

3 0.007224(0.0048)svr4.1037> bsdi.discard :。 ack1823083522勝利4096
4 4.155441(4.1482)svr4.1037> bsdi.discard:F 1415531522:1415531522(0)
ack1823083522勝利4096
5 4.156747(0.0013)bsdi.discard> svr4.1037 :。 ack1415531523勝利4096
6 4.158144(0.0014)bsdi.discard> svr4.1037:F 1823083522:1823083522(0)
ack1415531523勝利4096
7 4.180662(0.0225)svr4.1037> bsdi.discard :。 ack1823083523勝利4096

図18.1TCP接続をインストールして開くためのtcpdumpの表示。

Tsіs_mTCPセグメントm_statはTCPヘッダーのみです。 ダニムの交換はうまくいきませんでした。

TCPスキンセグメントの場合、出力行は

ソース>宛先:フラグ(dzherelo>認識:prapori)

deフラグ(フラグ)は、TCPヘッダー()の6つのフラグの一部です。 小さな18.2には、5つの異なる記号が表示されています。これらの記号は、軍艦旗として機能し、視界に表示される場合があります。

3文字の省略形

説明

シーケンス番号の同期
管理者がデータの転送を完了しました
割引
受け入れられたプロセスのデータの修正
ジョーデン

図18.2TCPヘッダーでのエンサインバトルのためにtcpdumpコマンドによってキャプチャされたエンサイン文字。

このお尻 mi bachimo prapori S、Fその点。 さらに2つの旗(RとP)が後で宣言されます。 TCPヘッダーの他の2ビット(ACKとURG)は、tcpdumpコマンドによってオーバーライドされます。

1つのセグメントでは、複数のエンサインバトルが発生する可能性があり、小さな18.2を示しますが、1つのエンサインのみが鳴ります。

RFC 1025 [Postel 1987]は、カミカゼパケット(in 英語同様のパッケージのschek_lkavyznachen、およびそれ自体-「Brudnyパッケージ」、「Newyalinkaのパッケージ」)。

行1のフィールド1415531521:1415531521(0)は、パケットシーケンス番号が1415531521であり、セグメント内のデータのバイト数が0であることを意味します。 可能な限り、バイト数が0より大きい場合は、残りのシーケンス番号を調べます。フィールドには(1)があります。これは、セグメントを1バイトまたは数バイトのデータに置き換えることができることを意味します。エンサインSYN、FINまたはRST。 1、2、4、6行目では、18.1 ceの小さなフィールドが宣言されており、少尉の戦いの破片がこのお尻で行われていませんでした。

行2フィールドACK1415531522 Vonoは、ACK教育の使命として、vipadkuに対してあまり友好的ではありません。 スキン行のwin4096フィールドは、管理者によって驚かされたため、ウィンドウの拡張を示しています。 ダニムの交換が不可能だったこのお尻では、rozmіrvіknaは変更されずに、ロックの値である4096を獲得しました。

І小さな子18.1を見て残りのフィールド。 最大セグメントサイズ(MSS-最大セグメントサイズ)、正しいディレクトリを設定するためのオプションを表示します。 管理者は、TCPセグメントが大きく、小さい値を受け入れることを望んでいません。 Tse zazvychayは、断片化を回避するために戦うのが恥ずかしがり屋です(第11章、分割)。 ディストリビューションの配布用のセグメントの最大サイズを確認でき、ディストリビューションの配布用のさまざまなTCPオプションの形式が表示されます。

Timchasovі図

小さな18.3には、パケットの交換を確認するtimchas図が示されています。 (時計の図の主な特徴のいくつかを説明しましたが、これまでに説明しました。)この小さな図では、側面がパッケージをどのように締めているかが示されています。 tcpdumpコマンドも表示されました(それ以外の場合は、SではなくSYNが表示されました)。 この時計の図では、rozmіruveknaの意味が見られたので、それは私たちの議論のポイントではありません。

会議を設定するためのプロトコル

次に、小さな18.3に示すように、TCPプロトコルの詳細に移りましょう。 TCP接続をインストールするには、次のことを行う必要があります。

  1. 要求するパーティ(通常はクライアントと呼ばれます)は、SYNセグメントを編集して、クライアントが到達したいサーバーポート番号と、クライアントのデフォルトのシーケンス番号(このアプリケーションでは、ISN、1415531521)を示します。 Tseセグメント1。
  2. サーバーはSYNセグメントで応答して、シーケンスの最後のシーケンス番号(セグメント2)を取得します。 サーバーは、別のACK(クライアントのISNプラス1)を使用してクライアントのSYNも確認します。 SYNには1つのシーケンス番号があります。
  3. クライアントは、サーバーのSYN IDがACK選択(サーバーISNプラス1、セグメント3)で正しいことを確認する責任があります。

プラントの十分な設置のTsikh3つのセグメント。 しばしばスリーウェイハンドシェイクと呼ばれます。

図18.3インストールとその日の開始の時間別図。

たとえば、パーティが最初のSYNを圧倒し、その日をアクティブにする(積極的に発声する)ことが重要です。 最初のSYNを取り除き、攻撃的なSYNを管理する反対側は、攻撃(パッシブストライク)の結果としてパッシブな役割を果たします。 (ディビジョンのディビジョンでは、クロージングのアレンジの手順を報告します。ここでは、クロージングの確立時に、違反している当事者がアクティブな当事者によって尊重されます。)

スキン側がセッションを設定するための独自のSYNルールを設定している場合、スキン側はそのセッションの発信シーケンス番号(ISN)を選択します。 ISNは、皮膚が他のISNの影響を受ける可能性のある皮膚時間を変更することで有罪となります。 RFC 793 [Postel 1981c]は、ISNは32ビットの数値であり、スキンあたり4マイクロ秒を超えると述べています。 シーケンス番号へのZavdyaki、後で配達の順序で遅れたパッケージは、実際の注文の一部として受け入れられません。

シーケンス番号はどのように選択されますか? 4.4BSD(およびほとんどのBerkeley実装)では、システムが初期化されると、デフォルトのシーケンス番号が1に設定されます。同様の方法は、ホスト要件RFCによってホストされていると判断されます。 値を64000スキンpvsec増やし、値0をスキンを9。5年回転させてみましょう。 (これは、1スキン8マイクロ秒増加し、スキン4マイクロ秒では増加しないlichnikにも当てはまります。)さらに、日が復元されると、64000に変更されます。

セグメント3と4の間の4.1秒の間隔は、確立されたログとtelnetがログを開くためのquitコマンドの間の1時間によって与えられます。

注文開始のプロトコル

接続をインストールするには、3つのセグメントが必要であり、接続を開くには、4つのセグメントが必要です。 OskіlkiTCPs'dnannya全二重(データは別の方向から直接スキンに転送できます)、スキンから直接、別の方向から独立して閉じることができます。 経験則では、データ送信が完了した場合、皮膚側はFINを送信する傾向があります。 TCPがFINを受け入れる場合、リモート側がデータを開き、誰かからのデータの転送を直接受け入れることを通知するのはあなたの責任です。 プログラムが閉じられた結果、FINはビープ音を鳴らします。

反対側は、最初の側が閉じると(最初のFINを強化する)、アクティブに閉じ、反対側(FINを受け取ったとき)はパッシブに閉じると言えます。 健全な一方はより積極的に閉鎖され、もう一方は受動的ですが、第2部門の部門では、違反当事者がより積極的に閉鎖される可能性が高くなります。

セグメント番号4は、閉じる前に呼び出す小さな18.3であり、Telnetクライアントがロボットを受け入れると強制されます。 quitと入力すると、Tsevіdbuvaєtsyaになります。 このTCPを使用すると、クライアントはFINノイズを送信し、クライアントからサーバーへのデータの流れをブロックします。

サーバーがFINを受け入れると、受信したシーケンス番号に1を加えたもの(セグメント5)からACKを送り返します。 1つのシーケンス番号がFINとSYNに表示されます。 同時に、TCPサーバーはファイルの終わりの拡張子も提供します(サーバーを無効にするため)。 次に、サーバーはTCPをサイレンシングしてFIN(セグメント6)を送信することで自身の要求を閉じます。このクライアントは、確認応答(ACK)を担当し、受信したシーケンス番号を1つ増やします(セグメント7)。

小さな18.4の読み取りでは、セグメントの一般的な交換は、その日の営業時間に実行されます。 省略シーケンス番号。 独自の要求を閉じるプログラムを介して送信されるFINはほとんどないため、これらのFINのACKは自動的に生成されます。 ソフトウェアのセキュリティ TCP。

呼び出しはクライアントによってインストールされるため、最初のSYNがクライアントからサーバーにクラッシュします。 ヤクを保護し、パーティーは積極的に法案を閉じることができます(最初のFINを送信します)。 ただし、注文を破ることができるかどうかはクライアント自身に任されていることがよくありますが、クライアントのプロセスは主に速記で制御され、「終了」のように入力してドアを閉めることができます。 小さな子18.4では、小さな子の痕跡を思い出すことができます。赤ちゃんを獣に向け、左側をサーバー、右側をクライアントと呼びます。 しかし、それが小さなものに示されているように、あなた自身の心のすべてを刺激してください。 (たとえば、最初のお尻は14に分割され、サーバーが時計を閉じる方法を示しています。)

図18.41日の休業時間におけるセグメントごとの最大交換。

tcpdump winnower

tcpdumpプログラムでシーケンス番号をソートしてSYNセグメントのシーケンス番号をソートするのは簡単で、次のシーケンス番号はシーケンス内のシーケンス番号の変化として表示されます。 (18.1の赤ちゃんを指すvisnovyを削除するために、-Sオプションを指定することになります。)tcpdumpのデフォルトのvisnovyは、18.1の赤ちゃんを示し、18.5の赤ちゃんを示します。

1 0.0 svr4.1037> bsdi.discard:S 1415531521:1415531521(0)
4096勝
2 0.002402(0.0024)bsdi.discard> svr4.1037:S 1823083521:1823083521(0)
ack1415531522
4096勝
3 0.007224(0.0048)svr4.1037> bsdi.discard :。 ack 1 win 4096
4 4.155441(4.1482)svr4.1037> bsdi.discard:F 1:1(0)ack 1 win 4096
5 4.156747(0.0013)bsdi.discard> svr4.1037 :。 ack 2 win 4096
6 4.158144(0.0014)bsdi.discard> svr4.1037:F 1:1(0)ack 2 win 4096
7 4.180662(0.0225)svr4.1037> bsdi.discard :。 ack 2 win 4096

図18.5そのダンプをインストールするように指示する一般的なtcpdumpコマンドライン。

正確な数と順序を示す必要はありませんが、すべての攻撃的なバットで目撃の形を勝ち取ります。

タイムアウト

Іsnuєkіlkaの理由、mozhebutiではなくyakіを介してzadnannyaをインストールしました。 たとえば、ホスト(サーバー)が無効になっています。 この状況に対処するために、サーバーからイーサネットケーブルを確認した後でtelnetコマンドを実行しました。 Tiny 18.6は、tcpdumpコマンドの出力を示しています。

1 0.0 bsdi.1024>
4096勝
2 5.814797(5.8148)bsdi.1024> svr4.discard:S 291008001:291008001(0)
4096勝
3 29.815436(24.0006)bsdi.1024> svr4.discard:S 291008001:291008001(0)
4096勝

図18.6タイムアウトが原因であった接続を取得するためのtcpdumpコマンドの表示。

TCPクライアントがSYNを修正し、接続を復元しようとすることが多いため、このクライアントを尊重する必要があります。 別のセグメントは最初のセグメントの5.8秒後に強制され、3番目のセグメントは24秒後に強制されます。

このお尻は、クライアントが再前進したという事実から38週間後に発売されたことを尊重する必要があります。 したがって、注文の現在の出口番号は291008001(約38x60x6400x2)です。 穂軸では、バークレー型システムが現在のシーケンス番号を1に設定し、それを1秒あたり64,000スキンずつ増やすと言いました。

また、システムが再バンキングされた瞬間からTCPが開始される前に、クライアントポート番号が1024であることを示す必要があります。

ただし、18.6では表示されません。これは、TCPクライアントが再送信を試行する回数であり、最初に再試行されます。 時間の値を確認するには、次の順序でtelnetコマンドを入力する必要があります。

bsdi% 日にち; telnetsvr4破棄; 日にち
9月24日木曜日16:24:11MST1992
192.82.148.2を試してみてください...
telnet:接続がタイムアウトしましたリモートホスト:接続がタイムアウトしました
9月24日木曜日16:25:27MST1992

1時間で合計76秒になります。 ほとんどのバークレーシステムは1時間あたり75秒の間に設置され、新しいプラントは1時間で設置できます。 第21章では、クライアントが送信した3番目のパッケージが約16:25:29にタイムアウトになることが重要です。これは、クライアントが75秒後にプローブを接続しない場合、送信後48秒になります。 。 。

最初のタイムアウト

18.6の場合、最初のタイムアウトである5.8秒が6秒に近く、6秒以内であるが、他のタイムアウトはほぼ正確に24秒であることに注意してください。 さらに10個の同様のテストが実行され、スキンでは最初のタイムアウトの値は5.59秒から5.93秒の範囲でした。 ただし、別のタイムアウトは24.00秒です。

TCPのBSD実装は、500ミリ秒のスキンタイマーを開始することに注意してください。 この500ミリ秒のタイマーは、さまざまなTCPタイムアウトでオーバーライドされます。これらはすべて、次のセクションで説明します。 telnetコマンドを入力すると、6秒のタイマー(年間12ティック)が設定されますが、5.5〜6秒になる場合があります。 小さなもの18.7はそれがどのように見えるかを示しています。

Malyunok18.7500ミリ秒のTCPタイマー。

Oskіlkiタイマーは12ティックに設定されており、タイマーを変更する前は、設定後0〜500ミリ秒にすることができます。 この時点で、タイマーは約500ミリ秒変化しますが、最初の期間は異なる場合があります。 (「およそ」という言葉を勝ち取ります。つまり、TCPが500ミリ秒のスキン制御を必要とする場合、カーネルによる処理のように、さらに書き換えを行うことができることは明らかです。)

6秒タイマーが小さな18.7の0とマークされたティックで終了する場合、タイマーは24秒(48ティック)に設定されます。 500ミリ秒のTCPタイマーがコアではなくカーネルによって呼び出された場合、この次のタイマーは最大24秒です。

サービスタイプフィールド

小さなものに18.6バチモビラズ。 このフィールドは、IPデータグラム()のサービスの種類(TOS-サービスの種類)です。 BSD / 386のTelnetクライアントは、混乱が最小限になるようにフィールドを設定します。

最大セグメントサイズ

最大セグメントサイズ(MSS)は、距離の終わりにTCPが与えられたデータの最大部分です。 それが復元された場合、皮膚側はそのMSSを発声することができます。 値は1024です。結果に示されているように、データグラムのIPは40バイト大きくなります。TCPヘッダーの場合は20バイト、IPヘッダーの場合は20バイトです。

一部の出版物では、このオプションは「ハウスキーピング用」にインストールされているとされています。 確かに、家庭性は決して勝ちません。 日が回復すると、肌側にMSSが思い出されます。 (MSSオプションはSYNセグメントでのみ使用できます。)一方が他方からのMSSオプションを受け入れない場合、536バイトのロックをオーバーライドします。 (他の場合、20バイトのIPヘッダーと20バイトのTCPヘッダーを使用すると、IPデータグラムのサイズは576バイトになります。)

一般に、断片化が発生するまで、MSSが多いほど美しくなります。 (間違いはありません。iに戻ってコマに切り替えます。)セグメントサイズが大きいと、スキンセグメントにより多くのデータを送信できるため、IPヘッダーとTCPヘッダーのサイズが変更されます。 TCPがSYNセグメントを管理している場合、ローカルプログラムが接続を設定したい場合、またはリモートホストへの要求を受信した場合は、MSS値を設定できます。これにより、出力インターフェイスのMTUが固定されたIPヘッダーに設定されます。 。 イーサネットMSSの場合、これは1460バイトになる可能性があります。 IEEE 802.3(第2章、セクション2)の代替カプセル化では、MSSは最大1452バイトになります。

値は1024なので、どのディストリビューションでも使用できます。BSD/ 386とSVR4の運命をたどる必要があることがわかっているので、BSDの実装が多いので、MSSは512の倍数でした。 Solaris 4.2.2、SunOS 4.2.2、およびAIX 3.2.2は、問題のあるパーティが同じイーサネット上にある場合、MSSを1460に等しくスタンします。 [Mogul 1993]に示されているビューは、MSSが古い1460の方がイーサネットでの生産性が高く、MSSが古い1024の方が低いことを示しています。

IPアドレスが「ローカルではない」と認識された場合、MSSはロックに設定されたように聞こえます-536。ローカルか非ローカルかに関係なく、認識のエンドポイントは攻撃的なランクになる可能性があります。 認識ポイント。そのIPアドレスは、merezhіの同じ識別子であり、ローカルであるサブディビジョンの同じマスクである可能性があります。 認識ポイント。IPアドレスはメジャーの識別子と同じ方法で認識されます。つまり、非ローカルです。 アイテムはmerezhіの同じIDで認識されますが、サブディビジョンのマスクが異なるため、ローカルと非ローカルの両方になります。 その他の実装については、構成オプション(i)を設定して、システム管理者がローカルか非ローカルかを指定できるようにします。 このオプションをアドバタイズされた最大MSS(発信インターフェイスのMTUに到達できる値)に設定します。それ以外の場合、デフォルト値は536です。

MSSを使用すると、ホストはデータグラム拡張を設定できます。データグラム拡張はリモート側で制御できます。 また、ホストがデータグラムスペースにまたがっており、データグラムスペースを圧倒しているという事実も考慮に入れてください。これにより、ホストがより小さなMTUで境界に接続した場合に、断片化を回避できます。

MTUが296に等しいSLIPチャネルがbsdiルーターに接続できるスリップホストを見つけます。 小さな18.8には、ホスト太陽のシステムが表示されます。

図18.8そのMSS値をスリップする前に太陽に送信されたTCP。

スリップする前にTCP接続をsunに設定し、tcpdumpの勝利のセグメントを調べました。 小さな写真18.9は、固定されたウィンドウ以上のものを示しています(ウィンドウの開口部は削除されています)。

1 0.0 sun.1093> slip.discard:S 517312000:517312000(0)

2 0.10(0.00)slip.discard> sun.1093:S 509556225:509556225(0)
ack517312001
3 0.10(0.00)sun.1093> slip.discard:。 ack 1

図18.9スリップする前に太陽を埋め込むためのtcpdumpの表示。

ここで重要なのは、MSSが256に等しい(行2)人に、sunが256バイトを超えるデータの一部を含むセグメントを送信できないことに注意することです。 さらに、スリップオシレータは発信インターフェイスのMTUが296であることを認識しているため、太陽は1460に等しいMSSを読み取ることができ、断片化を回避するために256バイトを超えるデータを送信することはできません。 Prote、システムは反対側からより少ないデータ、より低いMSS音声を送信できます。

この方法で断片化を回避できるのは、MTUが576未満のブリッジに中間接続なしでホストが接続されている場合のみです。ホストがイーサネット接続に接続され、接続が536に等しいMSSをアナウンスする場合、中間接続は次のようになります。 MTUが296に等しい場合、フラグメンテーションはクリアされます。 これを取り除く唯一の方法は、トランスポートMTU割り当てメカニズムを高速化することです(第24章のセクション)。

TCPハーフクローズ

TCPを使用すると、接続の1人の参加者がデータの転送を開始できますが、それでもリモート側からのデータを受け入れることができます。 これはTCPハーフクローズと呼ばれます。 すでに先に推測したように、プログラムの執事は彼らの能力を誇りに思うことができます。

ソフトウェアインターフェイスの特性を打ち負かすには、次のように補遺を追加する機能を提供する必要があります。「データの転送が完了しました。ファイルの終わり(FIN)記号を最後に送信します。終わりの終わりのファイルの終わり(FIN)ですが、ファイルの終わりのサイン(FIN)が私に送信されるまで、終わりの終わりから静かな場所までデータを取得したいと思います。」

APIソケットはクローズモードをサポートしているため、プログラムはcloseではなく別の引数1を使用してshutdownを呼び出します。 ただし、ほとんどのプログラムは、クリックして閉じるだけで両方向に通話を開くことができます。

サムネイル18.10は、クローズドTCPの一般的なシナリオを示しています。 左側からクライアントを示し、反対のモードを開始しましたが、側面で作業することもできます。 最初の2つのセグメントは同じです。イニシエーターの場合はFIN、続いてレシーバーの場合はACKとFINです。 しかし、18.4の小さなものに向けられたものに照らしてシナリオをレビューし、「歌う」という命令を受けた側が依然として賛辞を課すことができるようにします。 データの1つのセグメントのみを示し、その後にACKを示しました。この場合、データの複数のセグメントを送信できます。 (データセグメントの交換と確認については、で詳しく説明します。)「データの送信」の注文をキャンセルし、データの転送をキャンセルした場合は、次のように1日の一部を終了します。その結果、FINが適用され、終了ファイルのどの記号で、追加のファイルが配信されます。これは、ある種のinitsiyuvav「napivzakritiy」モードです。 別のFINが確認された場合、注文は再度クローズされます。

クローズドモードのMaliunok18.10TCP。

Navischoはvikoristanynapіvzkritiyモードになることができますか? 1つの例は、Unix rsh(1)コマンドで、これは別のシステムのコマンドをオーバーライドします。 チーム

太陽 % rshbsdiソート< datafile

ファイル名datafileから読み取られたrshコマンドの標準入力を使用して、bsdiホストでsortコマンドを実行します。 rshコマンドは、リモートホストにログオンしているかのように、それ自体とそのプログラムの間にTCPを作成します。 次に、rsh関数を実行するのは簡単です。コマンドは、入力から標準入力(データファイル)をコピーし、入力から標準ディスプレイ(端末)にコピーすることです。 小さなもの18.11には、それがどのように見えるかが示されています。 (TCPは全二重であることに注意してください。)

図18.11コマンド:rsh bsdi sort< datafile.

リモートホストでは、bsdiサーバーであるrshdサーバーが、TCP接続の標準入力および標準出力方向になるようにソートプログラムをハイジャックします。 ブランチ14でホバー レポートの説明ここで参加しているUnixプロセスの構造ですが、TCPがどのようにハッキングされ、TCPモードが閉じられているかを説明します。

ソートプログラムは、すべての入力が読み取られるまで出力の生成を開始できません。 rshクライアントからソートサーバーに送信する必要のあるすべての出力データは、ソート可能なファイルに置き換えられます。 ファイル終了アイコンが入力(データファイル)に使用できる場合、rshクライアントはTCP接続を書き込みます。 次に、ソートサーバーは、標準出力(TCP出力)からファイルの終了タグを受け取り、ファイルをソートして、標準出力(TCP出力)の結果を書き込みます。 rshクライアントは、引き続きTCP順序を読み取り、標準ウィンドウから並べ替えファイルをコピーします。

ハーフクローズ体制を破ることなく、クライアントがサーバーを回復できるようにするための追加の手法が必要になります。データの要求が完了した後も、クライアントはサーバーからデータを取得できます。 あるいは、2学期を振動させる必要があります。クローズドモードでは、vikoristanyよりもproteの方が重要です。

TCP転送ステーションの図

rozryuTCP接続を設定するためのルールのコピーについて説明しました。 Qiルールは、18.12に少し示されている転送の段階の図から選択されます。

次のステップは、図が標準ステーションの図であることを示すことです。 クライアントのプライマリ転送を太い太い矢印でマークし、サーバーのプライマリ転送を太い点線の矢印でマークしました。

キャンプをリードする2つのギアがインストールされ(ESTABLISHED)、1日の始まりを確認し、キャンプがインストールされている(ESTABLISHED)2つのギアがその日の始まりを示します。 ESTABLISHEDキャンプは現在、2者間で双方向にデータを転送できるようになっています。 次の部門では、各キャンプで何が起こるかについて説明します。

左下の2つの正方形と点線の枠の中央の図を組み合わせて、「アクティブクローズ」とマークしました。 他の2つの正方形(CLOSE_CLOSED-CLOSE_WAITおよびSTOP_APPROVED-LAST_ACK)は点線のフレームで結合され、「パッシブクローズ」(パッシブクローズ)としてマークされます。

ステーションを確認するために、そのようなランクで選択された11のステーション(CLOSED-CLOSED、LISTEN-LISTEN、SYN_VIDPRAVLENY-SYN_SENTなど)に名前を付けて、netstatコマンドの入力方法を確認します。 netstatの名前は、それ自体、RFC 793で説明されている名前と実質的に同じです。CLOSEDキャンプは実際にはキャンプではありませんが、ダイアグラムの開始点と終了点です。

LISTENからSYN_SENT(SYN_SENT)への変更は理論的には可能であり、Berkeleyの実装ではサポートされていません。

そして、変更はSYN_SYN(SYN_RCVD)になり、LISTENに戻ることができます。SYN_RCVD(SYN_RCVD)キャンプの場合と同様に、SYN(LISTEN)(メインシナリオ)になり、SYはなりません)。 これは、パッシブ入力を行い(LISTENキャンプに移動)、SYNを削除し、ACKからSYNを送信した(WITHDRAWAL_SYNキャンプに移動-SYN_RCVD)pributtyaіnshoyzapuonz'єdnannya

18.12ダイアグラムがTCPに変更されました。

サムネイル18.13は、完全にインストールされたTCPクロージャを示しています。 伝えられるところによると 別になりますヤキパスクライアントとサーバーを介して。

図18.13TCPミル。これは、その日の成長に対する優れた応答を示しています。

18.13の小さなものでは、左側からわかるクライアントがよりアクティブであり、右利きのサーバーがパッシブであることを手放しました。 また、クライアントがアクティブに閉じていることも示しました(以前に予測したように、スキン側はアクティブに閉じることができます)。

その変更が再び発生する理由を理解できるように、12.18の小さなものを対象とした、ステーションの変更のヘルプデータグラムを使用して、18.13の小さなもののステーションを変更する手順に従う必要があります。

洗浄ミル2MSL

TIME_WAITミルは、2MSL消毒ミルと呼ばれることもあります。 スキンの実装では、最大セグメント寿命時間(MSL-最大セグメント寿命)の値が選択されます。 これは、前のメジャーで使用できるセグメントをストレッチすることにより、クリアされる最大時間です。 これは境界の時間であり、TCPセグメントのフラグメントはIPデータグラムの助けを借りて送信され、スキンIPデータグラムには存続時間であるTTLフィールドが含まれていることがわかっています。

RFC 793 [Postel 1981c]は、MSLが2に等しい可能性があることを示しています。 他の実装では、値は30秒​​、1クイル、または2クイルの場合があります。

IPデータグラムの寿命は、タイマーではなく、多数の送信に囲まれていると言われていました。

MSLが無効になると、次のルールが適用されます。TCPがアクティブに閉じて、残りのセグメントを復讐確認応答(ACK)に送信する場合、その日はTIME_WAITステーションに1時間残される可能性があります。これは、2つのMSLに適しています。 これにより、TCPは、最初のACKが送信されたのと同時に(リモート側がタイムアウトして最後のFINを再送信したときに)残りのACKを再送信できます。

それ以外の場合、2MSL検証は、TCP接続が2MSL検証に含まれていることを意味し、この接続で見られるソケットのペア(クライアントIPアドレス、クライアントポート番号、サーバーIPアドレス、およびサーバーポート番号)は、再ウィコリスタンを実行できません。 この呼び出しは、2MSL時間が終了した場合にのみ再度繰り返すことができます。

残念ながら、実装の大部分(Berkeleyはその1つです)は、最も人気のあるものの順序の下にあります。 ロック後、ローカルポート番号を再ブランド化することはできません。ドックポート番号は、2MSLステーションで再ブランド化されたソケットパリティのローカルポート番号です。 以下で、燃えるようなvimogsを見てください。

実装行為とAPIは、交換をバイパスできるため、保護されます。 ソケットAPIバリアントには、SO_REUSEADDRソケットオプションを指定できます。 2MSLステーションでホッピングしているローカルポートに独自のローカルポート番号を割り当てることができますが、TCPルールでは、2MSLステーションにホッピングする場合のように、そのポート番号をフロントエンドでビコリスタニーにすることはできません。

当日到着したスキンジャミングセグメントは、2MSLステーションで叱責されると判明。 その日のシャードは2MSLステーションでソケットのペアとして割り当てられ、サーバーをドットに再切り替えしたり、ドックを新しいものに設定したりすることはできません。 遅れた荷物が新しい日の一部として受け入れられなかったという事実のために、Tseは戦います。 (日付はソケットのペアとして定義されます。新しい日付は更新、またはこの日付の報酬と呼ばれます。)

すでに18.13を少し示したので、クライアントを呼び出してアクティブに閉じ、TIME_WAITモードに入ります。 サーバーは受動的に閉じられているように聞こえ、TIME_WAITモードを通過しません。 クライアントを模倣して別の方法で再起動するために使用できるvisnovokを作成することは可能ですが、この新しいクライアントは同じローカルポート番号に勝つことはできません。 誰にとっても多くの問題があるので、クライアントとして、動的に割り当てられたvicoristポートを呼び出し、特定の時間にポートvikoristovuetsyaを動的に割り当てることを誓わないでください。

ただし、サーバーの観点からは、すべてが異なり、サーバーのシャードはvikoristovuyutzazdalegіdvidomіportiです。 インストール可能なサーバーをvimknemoするにはどうすればよいですか。サーバーを不注意に再起動しようとすると、サーバーは接続のエンドポイントとしてバックオーダーのポート番号を取得できず、このポート番号の理由はその日、MSが入ります。 サーバーが再起動されるため、トムは彼の前に1〜4クレジットが必要になる場合があります。

あなたは靴下プログラムの助けを借りてそのようなシナリオを見ることができます。 サーバーを起動し、新しいクライアントにアクセスしてから、サーバーを削除しました。

太陽 % sock-v-s 6666
(このポートに来るbsdiでクライアントを起動します)
140.252.13.35.1081からの140.252.13.33.6666の接続
^? サーバーを無効にするには、再起動記号を入力します
太陽 % 靴下6666同じポートでサーバーを再起動しようとします
ローカルアドレスをバインドできません:すでに使用されているアドレス
太陽 % netstatキャンプを再考してみてください
アクティブなインターネット接続
Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)
tcp 0 0 sun.6666 bsdi.1081 TIME_WAIT
見られる顔のない列

サーバーを再起動しようとすると、プログラムは許しについて通知します。これは、自分のポート番号を取得できない人に通知するため、障害はすでに勝利しています(2MSLクリアリングステーションでの再起動)。

vikonuemo netstatを否定的に汗を流して、schobがキャンプz'ednannyaを見て、それがTIME_WAITキャンプで実際に機能していることを確認しましょう。

続行する場合は、サーバーを再起動して、適切なタイミングかどうか疑問に思って、2MSL値を計算できます。 SunOS 4.1.3、SVR4、BSD / 386、およびAIX 3.2.2の場合、サーバーの再起動には1分かかります。つまり、MSLの完了には30秒かかります。 Solaris 2.2では、サーバーの再起動には4クレジットが必要です。つまり、MSLには2クレジットが必要です。

クライアントによって生成された同じ恩赦を使用して、クライアントが2MSLクリアモードにある呼び出しの一部であるポートを入力するように求められるようにすることができます(クライアントに奪わないように話します)。

太陽 % sock-v bsdi echoクライアントが起動し、エコーサーバーに到達します
140.252.13.33.1162から140.252.13.35.7に接続
こんにちは別の行
こんにちは
^Dファイルの終了文字を入力して、クライアントを無効にします
太陽 % 靴下-b1162bsdiエコー
ローカルアドレスをバインドできません:すでに使用されているアドレス

クライアントの最初の実行時に、どのローカルポート番号(1162)が選択されているかを確認できるように-vオプションが指定されました。 クライアントの別の実行で、-bオプションが指定され、クライアントにローカルポート番号1162を割り当てるように指示しました。

ここで、ファイル転送プロトコル(FTP-ファイル転送プロトコル)について話す場合は、2MSLの特定の機能について推測する必要があります。 すでに述べたように、2MSLウィンドウでは、いくつかのソケットが省略されています(これは、ローカルIPアドレス、ローカルポート、リモートIPアドレス、およびリモートポートで構成されます)。 ただし、非個人的な実装では、プロセスは2MSLモード(SO_REUSEADDRオプションを指定)のソケットの一部であるポート番号を再配線できます。 Tseは、攻撃的な実験の助けを借りることができます。

太陽 % sock-v-s 6666サーバーはポート6666でリッスンを開始します
(このポートに来るbsdiでクライアントを起動します)
140.252.13.35.1098からの140.252.13.33.6666の接続
^? サーバーを無効にするには、再起動記号を入力します
太陽 % 靴下-b6666bsdi1098ローカルポート6666でクライアントを起動します
ローカルアドレスをバインドできません:すでに使用されているアドレス
太陽 % 靴下-A-b6666bsdi 1098-Aオプションを使用して初めて魔法をかけ直す
アクティブなオープンエラー:アドレスはすでに使用されています

まず、ポート6666でサーバーとしてsockプログラムを起動し、bsdiホストから新しいクライアントにアクセスしました。 クライアントポート番号は1098で、動的に割り当てられます。 サーバーの電源を切りました。このランクでは、vinzdіysnivがアクティブに閉じました。 サーバー上の4つのパラメーター-140.252.13.33(ローカルIPアドレス)、6666(ローカルポート番号)、140.252.13.35(リモートIPアドレス)、および1098(リモートポート番号)は、2MSLキャンプによって消費されます。

突然、このプログラムをクライアントとして実行し、ポート1098でホストbsdiに到達しようとしたときに、ポート6666にローカル番号を入力しました。ローカルポート6666に再度チェックマークを付けようとすると、ポート全体が2MSLキャンプにあります。

許しを取り除くために、-Aオプションを指定してSO_REUSEADDRオプションをアクティブにすることにより、プログラムを再開しました。 これにより、プログラムは独自のポート番号6666を割り当てることができましたが、プログラムがそれを積極的に確認しようとした場合は許可されませんでした。 たとえば、プログラムは独自の番号をポート6666に割り当てることができ、bsdiホストのポート1098への呼び出し、ソケットのペア、最初の呼び出しを作成して、2MSLステーションで再試行できます。

別のホストからバックアップをインストールする必要がありますか? まず、-Aエンサインを使用して、Sunでサーバーを再起動する必要があります。これにより、必要なポート(6666)が、2MSLステーションにある開始の一部になります。

太陽 % 靴下-A-s6666ポート6666でリッスンしているサーバーを開始します

その前に、2MSLウィンドウが太陽で終了するので、bsdiでクライアントを起動するのを待ちましょう。

bsdi% 靴下-b1098太陽6666
140.252.13.35.1098から140.252.13.33.6666に接続

残念ながら、それは機能します! この短いTCP仕様は、より多くのBerkeley実装でサポートされています。 Qi実装は、TIME_WAITステーションでの変更のように、呼び出しの新しい呼び出しで要求を受け取ります。 新しい番号シーケンスが大きく、シーケンスの残りの数が少ないほど、字幕はその日の前にあります。 どちらの方法で、新しいzadnannyのISNは、前のz'ednannyのシーケンス番号の残りに128000を加えたものに等しく設定されます。RFC1185の補遺は、そのようなテクノロジーの潜在的な不足を示しています。

この実装特性により、クライアントとサーバーは同じポート番号を再配線して、同じプラントを正常に更新できます。この場合、サーバーはアクティブに閉じられません。 FTPと話し合う場合は、別のバット2MSLを検討したいと思います。 したがって、同じ部門に戻ります。

静かな時間を理解する

2MSLクリアリングステーションは、早期注文によるパケットのバックログから保護することになっています。この場合、悪臭は、ローカルおよびリモートのIPアドレスとポート番号だけでなく、新しいプラントの一部として解釈されません。 ただし、2MSLステーションでの会議の主催者がうまくいかないため、その場合にのみ機能します。

2MSLステーションにポートがあるホストで問題が発生し、MSLを1時間リセットし、ローカルポートと一致する同じローカルおよび離れたIPアドレスとポート番号に新しいサーバーを誤ってインストールした場合、故障前の2MSLステーションにあったとしたらどうでしょうか。 ? このように、故障する前に眠りに落ちたかのように遅れて閉じられたセグメントは、再前進後に作成された新しい注文に属しているかのように容赦なく解釈することができます。 再前進後に選択された日付シーケンス番号によっては、独立している場合があります。

このような重要ではないシナリオから保護するために、RFC 793は、キャプチャの瞬間の後にMSLが完了するまで、TCPは新しい接続を確立する責任がないと述べています。 ツェは静かな時間(静かな時間)と呼ばれます。

一部の実装では、ホストは再進行後に、より低い時間のMSLをチェックします。

FIN_FIN_WAIT_2ミル

FIN_WAIT_2ステーションでは、FINを圧倒し、向こう側がそれを確認します。 閉鎖されたザドナンヤのキャンプでお互いを知らなければ、プログラムが遠くの国にあることは明らかです。ファイルの終わりの兆候を見て、ザドナンヤの私たちの側を閉じることができます。さらに、 FINが送られてきました。 プロセスがリモートエンドで閉じられている場合にのみ、私たちの側はFIN_WAIT_2モードからTIME_WAITモードに切り替わります。

Tseは、攻撃側をこのモードのままにしておくことができることを意味します。 リモート側は引き続きCLOSE_WAITが可能であり、同じ国に永久に残される可能性があります。プログラムドックはクロージングに違反しません。

より多くのバークレーの実装は、FIN_WAIT_2キャンプでのそのような永遠の決定を攻撃的なランクにするでしょう。 プログラムがアクティブにクローズしたかのように、クローズの形式ではなく、クローズの外側で作成されました。これは、データを受信する価値のあるプログラムを示します。この場合、タイマーが設定されます。 通話が10分プラス75秒間キャンセルされない場合、TCPは通話をクローズモードにします。 プロトコルの特性に類似しているものについてのコメントがあります。

セグメンティスキダーニャ(リセット)

TCPヘッダーのどのビット(RSTタイトル)が「リセット」(リセット)を意味するかを推測しました。 ハードドライブの場合、到着したセグメントが指定されたストップとオーバーラップしないかのように、「リセット」信号がTCPによってそのドライブに送信されます。 (「参照接続」という用語を使用します)。これは、割り当てられたIPアドレスと参照のポート番号、およびジェレルのIPアドレスとジェレルのポート番号によって識別される接続を意味します。RFC793 「ソケット」とは呼ばれません。)

不明なポートへの呼び出しの要求

リセットが生成されたときの最も明白な変動。したがって、注文の要求が到着し、プロセスがない場合、どのヒアリングポートが認識されます。 UDPの場合、第6章で説明したように、データグラムが認識ポートに到着しても失敗しません。ポートにアクセスできないことについてICMPパードンが生成されます。 TCPnatom_stvikoristovuєskidannya。

ポート番号を入力して、クライアントのTelnetバリアントの簡単な例を作成します。これは、認識ポイントでバリアントではありません。

bsdi% telnet svr4 20000ポート20000は勝利していません
140.252.13.34を試してみてください...
telnet:リモートホストの呼び出し:接続が拒否されました

恩赦に関する情報は、Telnetクライアントには表示されません。 コマンドを確認するパケット交換の18.14表示。

1 0.0 bsdi.1087> svr4.20000:S297416193:297416193(0)
4096勝
2 0.003771(0.0038)svr4.20000> bsdi.1087:R 0:0(0)ack 297416194 win 0

図18.141時間あたりのドロップ日を生成

つまり、この赤ちゃん、シーケンス番号のフィールド、および割引の確認番号のフィールドを詳しく調べる必要があります。 セグメントに確認応答ビット(ACK)が挿入されていないため、到着時にドロップシーケンス番号が0に設定され、確認応答番号が入出力シーケンス番号(ISN)にデータのバイト数を加えたものに設定されます。セグメント内。 到着したセグメント内のものに関係なく、実際のデータは存在しませんが、SYNビットは論理的にシーケンス番号のスペースで1バイトを取ります。 この順序で、割引データの確認番号は、ISN +日付データ(0)+1つのSYNビットに設定されます。

Rozriv z'ednannya

配布物の配布では、その日の発展に勝利する最も重要な方法は、当事者の1人がFINを許可しているという事実に基づいていることを学びました。 正しい番号と呼ばれることもあり(順番にリリース)、FINシャードは、データが以前に黒字にされ、修正され、余分なデータがないときに鳴った後に送信されます。 ただし、FINにリセット(リセット)を送信することにより、その日を中断することができます。 場合によっては、アボートリリースと呼ばれます。

その日の同様のオープニングには、2つの可能性が追加されます:(1)与えられるかどうか、悪魔に立つ-台無しにされる、そして投げ捨てが正しくない、(2)RSTを受け入れた側、反対側はその日のzam_stを破り、素晴らしいランクでヨガを締めくくったと言えます。 プログラムによって使用されるソフトウェアインターフェイス(API)は、通常のシャットダウンの同様の置換を生成する方法を担当します。

私たちの靴下ソフトウェアを使った同様の開発で私たちが見ているものに驚嘆することができます。 Sockets APIを使用すると、longer on close(SO_LINGER)ソケットオプションを使用できます。 シャットダウン時間に-Lオプションを指定しました。これは、0を意味します。Zeは、1日を閉じるために素晴らしいFINを置き換えるために割引が送信されることを意味します。 svr4で、サーバーとして機能するかのように、sockプログラムのバージョンに接続します。

bsdi% 靴下-L0svr48888 ceクライアント; 以下に示すサーバー
こんにちは世界距離の終わりの方向にある1つの行が導入されます
^Dファイルの終了文字を入力して、クライアントを無効にします

Tiny 18.15は、このアプリケーションのtcpdumpコマンドを示しています。 (私たちは、この小さなもの、私たちのミルクバニヤに悪臭を放つものではなく、バイコンのすべてのノイズを見てきました。)

1 0.0 bsdi.1099> svr4.8888:S671112193:671112193(0)

2 0.004975(0.0050)svr4.8888> bsdi.1099:S 3224959489:3224959489(0)
ack671112194
3 0.006656(0.0017)bsdi.1099> svr4.8888 :。 ack 1
4 4.833073(4.8264)bsdi.1099> svr4.8888:P 1:14(13)ack 1
5 5.026224(0.1932)svr4.8888> bsdi.1099 :。 ack 14
6 9.527634(4.5014)bsdi.1099> svr4.8888:R 14:14(0)ack 1

図18.15FINの送金(RST)からの請求書の配布。

行1〜3は、通常のz'ednannyaを示しています。 行4では、私たちが叱った賛辞の行が適用されます(12文字と新しい行のUnix文字)が、行5では、賛辞の受領の確認が追加されます。

行6は、ファイルの終わりに入力された文字(Control-D)を確認します。これにより、クライアントを削除しました。 オシレーターは、初期クロージャーのオーバーライド(コマンドラインオプション-L0)を解決したことを示し、bsdiのTCPは初期FINのRSTオーバーライドを送信しました。 シーケンス番号と確認番号を返すRSTセグメント。 また、RSTセグメントが遠端で認識しないものにも注意を払ってください。将来、確認の復讐をしないでください。 アボートウォッチはその日を中断し、その日が中断されたことをプログラムに通知します。

私たちはそのような交換でサーバーから許しを取ります:

svr4% 靴下8888サーバーとして実行し、ポート8888でリッスンします
こんにちは世界
読み取りエラー:ピアによって接続がリセットされました

このサーバーは測定値から読み取り、標準のvisnovokからすべてが削除されたものをコピーします。 VINを呼び出して作業を完了し、TCPからファイルの終わりの記号を削除しますが、ここでは、RSTが到着したときにVINが恩赦を削除した可能性が高くなります。 私をochіkuvaliしたのとまったく同じ人たちへの許し:その日はその日の参加者の一人によって引き裂かれました。

その日の批評の名前の指定

一方の側がもう一方の側に通知せずに呼び出しを閉じたり中断したりしたため、TCP呼び出しをクリアすることが重要です。 2つのホストのうち1つだけが調和していれば、それは可能かもしれません。 したがって、しばらくの間、同じ日にデータを転送する試みは行われず、一方の側が機能し、ドックはもう一方の側が調子が狂ったことを示しません。

クライアントのプログラムをシャットダウンしてからコンピューターをシャットダウンする代わりに、クライアントのホストでライブが無効になっているため、vyniknutizapіvіdkritezadnannyaを使用できるもう1つの理由があります。 たとえば、TelnetクライアントはPCで起動され、たとえば営業日のコンピュータを模倣します。 PCのシャットダウン時にデータ転送が遅延していなくても、サーバーはクライアントが認識されていることを認識しません。 攻撃が発生したら、PCの電源を入れて、新しいTelnetクライアントを起動すると、サーバーホストで新しいサーバーが起動します。 価格によって、多くのTCP呼び出しがサーバーホストに表示される可能性があります。 (TCPの一方の端を識別できる方法を確認したいと思います。これは別の兆候です。TCPオプション「キープアライブ」(キープアライブ)を克服してみてください)。

その日の名前を簡単に作成できます。 bsdiでTelnetクライアントを起動し、svr4で破棄サーバーに接続します。 1つの行を入力し、tcpdumpの回答、通過方法に驚嘆します。次に、サーバーホストからのイーサネットケーブルを確認して再起動します。 私たちは、ホストサーバーとの調子が悪いことを模倣しました。 (サーバーが再ラップする前にイーサネットケーブルをドロップしたため、FINをスターターに送信せず、サーバーがダウンしたときにTCPモジュールを無効にできました。)サーバーが再アップロードされたため、ケーブルをドロップして試してみました。クライアントからサーバーへのもう1つの行。 Oskіlkiサーバーbuvrezavantazheniyaと、zadnannya、yak_snuvaliに関するすべてのデータをrezavantazhennyaまで入力した後、彼らはzadnannyaについて何も知らず、到着したzadnannyu嘘セグメントについて何も疑っていません。 この場合、TCP側がリセットされます。

bsdi% telnetsvr4破棄クライアントの起動
140.252.13.34を試してみてください...
svr4に接続されています。
エスケープ文字は「^]」です。
やあこの行は大丈夫です
ここでサーバーホストを再構成しました
別の行市が割引(リセット)した人
接続は外部ホストによって閉じられました。

Tiny 18.16は、このお尻のtcpdumpビューを示しています。 (私たちは、バイコンの発声、サービスの種類に関する情報、およびMSSの発声を削除しました。私たちのミルクバニヤに悪臭を放つことはありません。)

1 0.0 bsdi.1102> svr4.discard:S 1591752193:1591752193(0)
2 0.004811(0.0048)svr4.discard> bsdi.1102:S 26368001:26368001(0)
ack1591752194
3 0.006516(0.0017)bsdi.1102> svr4.discard :。 ack 1

4 5.167679(5.1612)bsdi.1102> svr4.discard:P 1:11(10)ack 1
5 5.201662(0.0340)svr4.discard> bsdi.1102 :。 ack 11

6 194.909929(189.7083)bsdi.1102> svr4.discard:P 11:25(14)ack 1
7 194.914957(0.0050)arp who-has bsdi tell svr4
8 194.915678(0.0007)arp reply bsdi is-0:0:c0:6f:2d:40
9 194.918225(0.0025)svr4.discard> bsdi.1102:R 26368002:26368002(0)

図18.16クリティカルコールが発生した場合のデータセグメントの到着に対する割引データ。

行1〜3には、通常インストールされているz'ednannyaがインストールされています。 行4で、行「hi there」(大まかに「hey、there」と翻訳できます)が破棄サーバーに送信され、行5で確認が到着します。

この場所でsvr4のようなイーサネットケーブルを入手し、再インストールして、ケーブルを再接続しました。 武侠の手順は約190秒かかりました。 次に、クライアントで次の紹介行(「別の行」)を叱り、Returnキーを押すと、その行がサーバーに送信されました(小さな18.16の行6)。 bulaがキャンセルされると、サーバーIDは無効になりましたが、サーバーはリセットされ、ARPキャッシュは空でした。そのため、行7と8で、ARPにその入力がロードされました。 行9でリセットを待ちましょう。 ドロップを終了し、転送が離れたホストによって中断されたことを確認したクライアント。 (Telnetクライアントタイプに関する残りの情報は、それほど有益ではありません。)

Odnochasnevіdkrittya

2つのdodatkіvіsnuєmozhlivіstzdіysnitiのためにその時間にもっと積極的にvіdkrittya。 スキン側では、SYN転送を行うことができ、SYNはメッシュを1つずつ通過できます。 また、スキン側は反対側である小さなポート番号である必要があります。 1時間オープン(同時オープン)と呼ばれます。

たとえば、ホストAの補遺は、ローカルポート7777がホストBのポート8888にアクティブに書き込む場合があります。ホストの補遺は、ローカルポート8888がホストAのポート7777にアクティブに書き込む場合があります。

ホストAのTelnetクライアントがホストBのTelnetサーバーに到着し、ホストBのTelnetクライアントがホストAのTelnetサーバーに到着する場合も同じではありません。Telnetクライアントが動的に割り当てられる独自のポート番号を割り当てる方法、ポートではなく、リモートTelnetサーバーの日付を設定する方法。

TCPは、一晩で実行できるように特別に分割されており、その結果、2つではなく半分になります。 (他のプロトコルファミリ、たとえばOSIトランスポート層では、今回は1つではなく2つの接続があります。)

1時間の注意が必要な場合は、18.13に赤ちゃんに指示されるとすぐに、プロトコルが変更されます。 キャンプSYN_SENT(SYN_SENT)に入るSYNを同時に編集するために2日間を禁止します。 スキン側がSYNを受け入れると、SYN_ACCEPT(SYN_RCVD)(div。baby 18.12)に変更され、SYNが受け入れられたことを確認するためにスキンがSYNを再調整します。 スキンがSYNとACKで終わる場合は、ESTABLISHEDに変わります。 駅の変更は少し18.17をもたらしました。

図18.171時間のコールバックプロセスでのセグメント交換。

Odnochasnevіdkrittyavimagaєはchotirmaセグメントを交換し、もう1つ、「3回のハンドシェイク」で低くします。 したがって、最後のクライアントの1つではなく、他のサーバーと呼んでいるサーバーを尊重します。 この特定のタイプに侮辱はクライアントのように、そしてサーバーのように振る舞います。

一晩でそれを行うことが可能で、通過するのは簡単です。 違反した当事者は、SYNが1対1に転向するような方法で、ほぼ同じ時間に開始する罪を犯します。 このようにして、会議の2人の参加者の間で交代する素晴らしい時間を助けることができます。これによりSYNが交代することができます。 これを念頭に置いて、接続ホストの1人の参加者がbsdiであり、もう1人のホストがvangogh.cs.berkeley.eduであるため、勝つことができます。 それらの間のシャードはダイヤルアップ付きのSLIPチャネルであり、ターンの時間は大きくなる可能性があり(数百ミリ秒)、SYNがターンオーバーできるようになります。

一方の端(bsdi)は、ローカルポート8888(コマンドラインオプション-b)を割り当ててから、別のホストのポート7777にアクティブに書き込みます。

bsdi% sock-v-b8888 vangogh.cs.berkeley.edu 7777
140.252.13.35.8888から128.32.130.2.7777に接続
TCP_MAXSEG = 512
こんにちは世界行全体を入力してください
こんにちは
ピアによって閉じられた接続

開始の最後の終わりはほぼ同じ時間で、自分のローカルポート番号7777を確認し、ポート8888に積極的に連絡を開始します。

ヴァンゴッホ% 靴下-v-b7777bsdi.tuc.noao.edu 8888
128.32.130.2.7777から140.252.13.35.8888に接続
TCP_MAXSEG = 512
こんにちは、世界は別の国で紹介されています
そしてそこに行全体を悪用しました
^D次に、EOFファイルの終了文字を入力しました

皮膚接触のIPアドレスとポート番号を確認するために、sockプログラムの-vコマンドラインを指定しました。 この旗は、皮膚科学で勝利を収めているもう1つのMSSでもあります。 また、スキンkіntsiに一度に1行を導入する方法、最も遠いkіnetsとnarukovanіにbіdpravlenіを導入する方法、perekonatisyaにすすり泣き、ホストを侮辱する方法を叱りました。

赤ちゃんの18.18で、半分の半分のセグメントの交換の兆候。 (4.4BSDのルールとして、SYNの週末に登場し、vangoghで登場したいくつかの新しいTCPオプションを見てきました。SYNディストリビューションの配布における新しいオプションについて説明します。)2)2つのSYNとそれに続くACK(行3および4)。 一度に1時間見る人。

行5は、bsdiからvangoghに移動する「hello、world」行の紹介を示し、行6を確認します。行7と8は、異なる方向に進む「andhithere」行に続きます。 9〜12行目には、その日の終わりが示されています。

ほとんどのバークレーの実装は一夜にして正しくありません。 これらのシステムでは、SYNが切り替わるポイントに到達できたとしても、すべてがセグメントの交換、SYNとACKを使用したスキンの両方向での交換で終了します。 ほとんどの実装は、SYN_SENTからSYN_RCVDへの切り替えを計画しています。証言18.12。

1 0.0 bsdi.8888> vangogh.7777:S 91904001:91904001(0)
4096勝
2 0.213782(0.2138)vangogh.7777> bsdi.8888:S 1058199041:1058199041(0)
8192に勝つ
3 0.215399(0.0016)bsdi.8888> vangogh.7777:S 91904001:91904001(0)
ack 1058199042 win 4096

4 0.340405(0.1250)vangogh.7777> bsdi.8888:S 1058199041:1058199041(0)
ack91904002勝利8192

5 5.633142(5.2927)bsdi.8888> vangogh.7777:P 1:14(13)ack 1 win 4096
6 6.100366(0.4672)vangogh.7777> bsdi.8888:メモを追加メモを編集| ack14勝8192

7 9.640214(3.5398)vangogh.7777> bsdi.8888:P 1:14(13)ack 14 win 8192
8 9.796417(0.1562)bsdi.8888> vangogh.7777:メモを追加メモを編集| ack 14 win 4096

9 13.060395(3.2640)vangogh.7777> bsdi.8888:F 14:14(0)ack 14 win 8192
10 13.061828(0.0014)bsdi.8888> vangogh.7777:メモを追加メモを編集| ack 15 win 4096
11 13.079769(0.0179)bsdi.8888> vangogh.7777:F 14:14(0)ack 15 win 4096
12 13.299940(0.2202)vangogh.7777> bsdi.8888:メモを追加メモを編集| ack15勝8192

図18.181時間のウェイクアップのセグメント交換。

一晩閉鎖

前に述べたように、一方の側から(多くの場合、クライアントの側から開始しない場合)、最初のFINが強制されるアクティブなクロージングがあります。 両側をアクティブに閉じることも可能ですが、TCPプロトコルでは同時に閉じることができます。

用語では、18.12の小さい方を指すと、プログラムが終了する前にシグナルを確認した場合、攻撃側はESTABLISHEDからFIN_WAIT_1になります。 侮辱されたと感じたら、ここの国境で腹を立てることができるなら、FINを送ってください。 FINが受け入れられると、最終ACKがスキン側FIN_WAIT_1にスーパーインポーズされ、最終ACKがスキン側から追加されます。 スキンが最後のACKで終了する場合、それはTIME_WAITに変更されます。 小さなもので18.19はstanіvの変化を示しています。

図18.191時間のシャットダウンプロセスでのセグメント交換。

1時間の閉鎖の場合、重大な閉鎖の場合と同様に、そのような数のパッケージの交換は課金されます。

TCPヘッダーは、options()でオーバーライドできます。 元のTCP仕様で定義されているオプションは、終了オプションリスト、操作なし、最大セグメントサイズのみです。 真皮SYNセグメントで実用的なMSSオプションを在庫に含めました。

より多くの新しいRFC、たとえばRFC 1323 追加オプション TCP。そのほとんどは後の実装で見られる可能性があります。 (新しいオプションについてはで説明します。)18.20の指示の時点では、RFC793およびRFC1323で説明されているように、TCPストリーミングオプションの形式はサイレントです。

図18.20TCPオプション。

スキンオプションは、オプションのタイプを示す1バイトタイプ(種類)に基づいています。 タイプが0と1のオプションは、1バイトを占有します。 他のオプションでは、2(len)バイトがバイトタイプに従うことができます。 Dovzhina-tse povna dovzhina、そのdovzhinaのようなバイトが含まれます。

「操作なし」(NOP)オプションが追加されたため、ワーカーは4バイトの倍数のフィールドをすぐに格納できます。 4.4BSDシステムにTCPをインストールする場合、tcpdumpを使用して、SYNcobセグメントに次のオプションを使用できます。

MSSオプションは512に設定され、次にNOP、次にウィンドウサイズ変更オプションが続きます。 最初のNOPオプションは、ウィンドウを4バイトに拡張するための3バイトオプションを追加するように変更されています。 したがって、10バイトのタイムスタンプオプションの前には2つのNOPがあるため、12バイトかかります。

タイプ4、5、6、7などの他のオプションは、セレクティブACKオプションおよびムーンオプションと呼ばれます。 タイムスタンプオプションを置き換えるオプションがあるため、小さな18.20には表示しませんでした。現在のところ、選択的ACKについてはまだ説明されており、RFC1323には含まれていません。Tを示す必要があります。 11、12、および13に等しいタイプの3つのオプションを指定するTCPトランザクションの/ TCP提案(セクション24)。

TCPサーバーの実装

第1章の分岐点で、彼らはTCPサーバーの大部分が競争力があると述べました。 サーバーは、新しいクライアントのインストールに関する要求を受信すると、その要求を受け入れて、新しいクライアントにサービスを提供する新しいプロセスを開始します。 活発なオペレーティングシステムの休耕 違う方法新しいサーバーの作成。 Unixシステムでは、追加のフォーク機能を使用して新しいプロセスが作成されます。

TCPが競合サーバーとどのように相互作用するかについて議論する必要があります。 次のリクエストでリクエストを受け取りたいのですが、サーバーがクライアントからの新しい接続でリクエストをキャンセルした場合、ポート番号はどのように取得されますか?また、少量のリクエストが一度にリクエストに到着した場合はどうなりますか?

TCPサーバーのポート番号

TCPサーバーが何であるかを見れば、TCPがポート番号をどのように処理するかがわかります。 netstatコマンドを使用してTelnetサーバーを見てみましょう。 攻撃はシステムに設定されているため、アクティブなTelnet呼び出しはありません。 (Telnetサーバーを示す単一の行の背後にあるすべての行を確認しました。)

太陽 % netstat -a -n -f inet
アクティブなインターネット接続(サーバーを含む)
Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)
tcp 0 0 *.23*。*聞く

Prapor -aは、キャンプで見つかったものだけでなく、国境のすべての終点について伝えます(確立済み)。 10桁目の-n他のIPアドレスをエンサインし、DNSを変更してアドレスを名前に変換し、他の数字のポート番号(たとえば、23)が他のサービス名を変更します(このTelnetモードの場合)。 -finetオプションは、TCPおよびUDPエンドポイントについて詳しく説明します。

ローカルアドレスは*.23として表示されます。これは、ワイルドカードまたはメタ文字と呼ばれます。 これは、入力要求(SYN)が任意のローカルインターフェイスから受け入れられることを意味します。 ホストに複数のインターフェイスがある場合、ローカルIPアドレスとして1つの特定のIPアドレス(ホストのIPアドレス用に1つ)を指定でき、そのインターフェイスから受信したホストへの要求のみが処理されます。 (配布の後半で作業したいと思います。)ローカルポートは23ですが、Telnetのポートははるかに遅れています。

距離のあるアドレスは*。*として表示されます。これは、IPアドレスが遠くにあることを意味します。 リモコン番号港はまだ見えていないので、最後のポイントはLISTEN駅、z'ednannyaのochіkuyuchipributtyazapにあります。

同時に、サーバーに送信されるスリップホスト(140.252.13.65)でTelnetクライアントを起動します。 netstatコマンドの視覚的な行は次のとおりです。


tcp 0 0140.252.13.33.23140.252.13.65.1029確立済み
tcp 0 0 *.23*。*聞く

ポート23の最初の行はESTABLISHEDです。 この接続では、ローカルアドレスとリモートアドレスのすべての要素が保存されます。ローカルIPアドレスはポート番号、リモートIPアドレスはポート番号です。 ローカルIPアドレスは、着信が要求されたインターフェイスに与えられます(イーサネットインターフェイス、140.252.13.33)。

LISTENステーションでエンドポイントが失われました。 これがエンドポイントです。競争力のあるサーバーが会議のリクエストを受け入れるために勝ち、未来に来ることができるからです。 この場合、コアに配置されているTCPモジュールは、到着と受け入れが要求された時点で、ESTABLISHEDステーションに新しいエンドポイントを作成しました。 したがって、ESTABLISHEDステーションにあるので、変更せずに接続用のポート番号を持っている人を尊重してください。エンドポイントについては、LISTENステーションにあるのでvindor_vnyu23です。

同時に、同じクライアント(スリップ)からサーバー全体にもう1つのTelnetクライアントを起動します。 netstatコマンドの出力は次のようになります。

Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)
tcp 0 0140.252.13.33.23140.252.13.65.1030確立済み
tcp 0 0140.252.13.33.23140.252.13.65.1029確立済み
tcp 0 0 *.23*。*聞く

同時に、同じホストから同じサーバーへの2つのESTABLISHED接続を持つことができます。 23のローカルポート番号に腹を立てています。リモートポートの数が異なるため、TCPでは問題ありません。 一方、Telnetクライアントが動的に割り当てられたポートを獲得し、割り当てが動的にポートに割り当てられるため、特定の時間に獲得されなかったそのポートのみを動的に割り当てることができることがわかります。ホスト(スリップ)。

この例は、TCPが、ローカルアドレスとリモートアドレス(宛先IPアドレス、宛先ポート番号、ジェレルIPアドレス、およびジェレルポート番号)に等しい異なる値を持つ入力セグメントを逆多重化する方法を示しています。 TCPは、認識されたポート番号を調べても、どのプロセスが入力セグメントを取得したかを判断できません。 また、LISTENステーションにあるポート23の3つの端末ポイントのうち1つだけが、コールへの入力要求を受け入れます。 ESTABLISHEDステーションにあるエンドポイントはSYNセグメントを受け入れることができず、LISTENステーションにあるエンドポイントはデータセグメントを受け入れることができません。

同時に、ホストsolarisからもう1つのTelnetクライアントを起動します。これは、イーサネットではなく、太陽からSLIPチャネルを経由します。

Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)
tcp 0 0 140.252.1.29.23 140.252.1.32.34603ESTABLISHED
tcp 0 0140.252.13.33.23140.252.13.65.1030確立済み
tcp 0 0140.252.13.33.23140.252.13.65.1029確立済み
tcp 0 0 *.23*。*聞く

最初にインストールされた(ESTABLISHED)アドレスのローカルIPアドレスが、リッチインターフェイスホストsun(140.252.1.29)のSLIPチャネルインターフェイスアドレスに割り当てられるようになりました。

ローカルIPアドレスを交換する

サーバーがローカルIPアドレスとしてワイルドカードを使用せず、1つの特定のローカルインターフェイスアドレスを設定するとどうなるか疑問に思うかもしれません。 ソックスプログラムのIPアドレス(またはホスト名)をどのように指定しますか。サーバーとして勝った場合、そのIPアドレスが聞こえるエンドポイントのローカルIPアドレスになります。 例えば

太陽 % sock-s 140.252.1.29 8888

SLIPインターフェース(140.252.1.29)からの呼び出し専用の中間サーバー。 netstatコマンドのwinnowokは、より高度です。

Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)

ソラリスホストからSLIPチャネルを介してこのサーバーにアクセスするにはどうすればよいですか。

Proto Recv-Q Send-Qローカルアドレス外部アドレス(状態)
tcp 0 0 140.252.1.29.8888 140.252.1.32.34614ESTABLISHED
tcp 0 0140.252.1.29.8888*。*聞く

ただし、イーサネット(140.252.13)を介してホストからそのサーバーに到達しようとすると、サーバーへの要求はTCPモジュールによって受け入れられません。 tcpdumpの助けを借りて驚いた場合、小さな18.21に示すように、SYNでRST出力が削除されたようです。

1 0.0 bsdi.1026> sun.8888:S 3657920001:3657920001(0)
4096勝
2 0.000859(0.0009)sun.8888> bsdi.1026:R 0:0(0)ack 3657920002 win 0

図18.21サーバーのローカルIPアドレスに基づくネットワークでの電力共有。

サーバー上で実行されるプログラムが接続を要求することはありません。交換は、補遺によって割り当てられたローカルIPアドレスに基づいてカーネル内のTCPモジュールによって実装されます。

リモートIPアドレスの交換

第11章では、UDPサーバーがローカルIPアドレスとポート番号を指定するだけでなく、リモートIPアドレスとポート番号を割り当てることができることを理解しました。 Функції інтерфейсу, наведені в RFC 793, дозволяють серверу здійснювати пасивне відкриття на основі повністю описаного віддаленого сокета (у цьому випадку очікується запит на активне відкриття від конкретного клієнта) або не зазначеного віддаленого сокета (у цьому випадку очікується запит на з'єднання від будь-どのクライアント)。

残念ながら、ほとんどのAPIはそのような機能を提供していません。 サーバーは、ソケットを指定せずに残し、接続を確認してから、クライアントのIPアドレスとポート番号を逆にする罪を犯します。

図18.22は、TCPサーバーを自分でセットアップできる3種類のアドレスとポートとの相互リンクアドレスを示しています。 すべてのlportオプションについて、サーバーポートが転送され、localIPがローカルインターフェイスのIPアドレスを担当します。 表内で3つの行がソートされている順序は、入力への入力要求を受信するローカルエンドポイントとしてTCPモジュールが割り当てられている順序を示しています。 テーブルの最初の行が最初にテストされ、次に他の仕様(置換シンボルに割り当てられたIPアドレスを持つ残りの行)が残りの行によって試行されます。

図18.22TCPサーバーのローカルおよびリモートのIPアドレスとポート番号を指定します。

請求書の入場料

競合するサーバーは、スキンクライアントにサービスを提供する新しいプロセスを開始します。サーバーは、そのサーバーが有罪であると聞きますが、注文の入力要求の開始を常に処理する準備ができています。 これが、競争力のあるサーバーが勝利する主な理由です。 ただし、リッスンしているサーバーが新しいプロセスを作成している場合、またはオペレーティングシステムがより高い優先度の別のプロセスの処理でビジー状態の場合、要求はその時点で自動的に到着することは明らかです。 リスニングプログラムがビジー状態のときに、TCPはコールへの入力をどのように処理しますか?

Berkeleyの実装は、これらのルールに従います。

  1. 皮膚の終点は、私が聞いているように、その日の最終日を修正できるため、TCPで受け入れることができます(「トリプルハンドシェイク」が完了します)が、補遺ではまだ受け入れられません。 TCP法案の受け入れと市内でのヨガの配置の違いを実行するときは、そのプログラムが法案からの法案を受け入れることに注意してください。
  2. プログラムは、チェルガの価格の境界または境界を示しています。それは、バックログと呼ばれています。 置換の数は0から5の範囲にすることができます(さらに追加すると、最大値は5になります)。
  3. コール(SYNセグメント)の要求がある場合、TCPはで設定されたコールの流量を調べます。 現在の瞬間 tsієїkontsevoїポイントのuchergu、schoヒアリング、vinz'yasovuє、chiはzadnannyaを受け入れることができます。 プログラムによって示されるバックログの値が最大になることに注意してください。したがって、それほど単純ではありませんが、ターゲットポイントの最大日数を行に入れることができます。 図18.23は、バックログの相互の値と、従来のBerkeleyシステムおよびSolaris2.2でバックログに入れることができる実際の最大日数を示しています。

    バックログ値

    z'ednanの最大数、黒に置く

    従来のBSD

    図18.23聞こえるエンドポイントの受信コールの最大数。

    バックログの値は、1つのエンドポイントのラインに配置された最大日数のみを示していることに注意してください。これらはすべてTCPによってすでに受け入れられており、補遺によって受け入れられたことを示しています。 バックログの値は、システムによってインストールできるため、呼び出しの最大数、または競合するサーバーにサービスを提供できるため、クライアントの数には適用されません。

    ochіkuvalがあるので、同じ小さなもの自体でのSolarisの重要性。 従来のBSD値(いくつかの不合理な理由による)は、バックログ値に3を掛けて2で割った値に1を加えた値を返すことです。

  4. このリスニングエンドポイントが新しい接続(Div。Baby 18.23)の時間である場合に備えて、TCPモジュールは到着した(ACK)SYNを確認し、サウンドをインストールします。 ヒアリングエンドポイントを備えたサーバープログラムは、この新しい注文をdotyに送信しません。「3回のハンドシェイク」の3番目のセグメントは、ドックによって受け入れられません。 また、クライアントはサーバーがデータを受信する準備ができていることを示すことができます。クライアントのアクティブな要求が正常に完了すると、次のサーバープログラムに新しい接続が通知されます。 (当然のことながら、TCPサーバーは単に入力データボックスに入れることができます。)
  5. 新しいクロックを投入する時間がないため、TCPはSYNの受け入れを単に無視します。 入力では何も試行されません(RSTセグメントのナビゲートは試行されません)。 聞いたように、サーバーがすでに受け入れられた注文の受信に応答できない場合、それらが境界まで満たされていると、クライアントのアクティブな応答はタイムアウトによって中断されます。

靴下プログラムのヘルプについては、このスクリプトを確認できます。 新しいオプション(-O)から始めましょう。まるで、会議のリクエストを受け入れる前に、エンドポイントの終了後に一時停止する必要があることを思い出させるかのように。 長い休止状態でいくつかのクライアントの実行を開始するとすぐに、サーバーは呼び出しを受け入れるためのキューに入れられ、発生した場合は、tcpdumpコマンドを使用して変更します。

bsdi% 靴下-s-v-q1-O305555

-q1オプションは、リスニングエンドポイントのバックログを値1に設定します。従来のBSDシステムの場合、テールごとに2つの入力に対して有効です(図18.23)。 オプション-O30は、あらゆる種類のクライアント呼び出しを受け入れる30秒前に「スリープ」プログラムを無効にします。 ラインを完了するために、クライアントのロールを開始するために30秒を与えます。 SunSunで4つのクライアントを開始します。

最初のクライアントの最初のSYNから開始するtcpdumpプログラムの小さな18.24読み取り。 (音声メッセージとMSS音声メッセージが表示されています。TCPが復元された場合、クライアントのポート番号も太字で表示されます(「3回のハンドシェイク」)。)

ポート1090からのクライアントタイプの最初の要求は、TCPモジュール(セグメント1〜3)によって受信されます。 ポート1091でのクライアントに対する別の要求も、TCPモジュール(セグメント4〜6)によって受け入れられます。 サーバープログラムはまだ「スリープ」状態であり、目的のウェイクアップを受け入れていません。 すべてのviconanは、カーネルのTCPモジュールによって実装されました。 また、2人のクライアントが、「3回の手書き」が正常に完了したというアクティブな確認応答を正常に完了したことを示す必要があります。

10.0太陽。 1090 > bsdi.7777:S1617152000:1617152000(0)
2 0.002310(0.0023)bsdi.7777>太陽。 1090 :S4164096001:4164096001(0)
30.003098(0.0008)太陽。 1090 > bsdi.7777 :。 ack1617152001
ack 1
4 4.291007(4.2879)太陽。 1091 > bsdi.7777:S1617792000:1617792000(0)
5 4.293349(0.0023)bsdi.7777>太陽。 1091 :S4164672001:4164672001(0)
ack1617792001
6 4.294167(0.0008)太陽。 1091 > bsdi.7777 :。 ack 1
7 7.131981(2.8378)sun.1092>
8 10.556787(3.4248)sun.1093> bsdi.7777:S 1618688000:1618688000(0)
9 12.695916(2.1391)sun.1092> bsdi.7777:S 1618176000:1618176000(0)
10 16.195772(3.4999)sun.1093>
11 24.695571(8.4998)sun.1092> bsdi.7777:S 1618176000:1618176000(0)
12 28.195454(3.4999)太陽。 1093 > bsdi.7777:S1618688000:1618688000(0)
13 28.197810(0.0024)bsdi.7777>太陽。 1093 :S4167808001:4167808001(0)
14 28.198639(0.0008)太陽。 1093 > bsdi.7777 :。 ack1618688001
ack 1
15 48.694931(20.4963)太陽。 1092 > bsdi.7777:S1618176000:1618176000(0)
16 48.697292(0.0024)bsdi.7777>太陽。 1092 :S4170496001:4170496001(0)
ack1618176001
17 48.698145(0.0009)太陽。 1092 > bsdi.7777 :。 ack 1

図18.24バックログ取得のためのtcpdumpプログラムの表示。

セグメント7(ポート1092)で3番目のクライアントを起動し、セグメント8(ポート1093)で4番目のクライアントを起動してみました。 TCPはSYNの侮辱を無視したので、私が聞いている限り、最後のポイントの行が入力されています。 問題のあるクライアントは、セグメント9、10、11、12、および15でSYNを再送信しました。4番目のクライアントの3回目の再送信が受け入れられたため(セグメント12〜14)、30秒間のサーバーの一時停止が終了し、サーバーは2つが受け入れられたことを確認しました。悪魔を清めた。 (理由は、たまたま、要求が30を超える時間ではなく、28.19の時間にサーバーによって受け入れられたという事実によるものです。それは、必要な人に起こりました。サーバーの起動後、最初のクライアントを起動するのに数秒かかります[セグメント1、表示時の時間開始]。)3番目のクライアントの4回目の再送信も受け入れられます(セグメント15〜17)。 4番目のクライアント(ポート1093)の日付は、30秒の一時停止の終了からクライアントの再送信までの30秒後、3番目のクライアント(ポート1092)の日付より前にサーバーによって受け入れられました。

半分から受け入れられた人の数は、プログラムによってFIFOの原則(最初の勝利、最初の勝利)にアップグレードされると確信できました。 このように、TCPはポート1090と1091で補遺を受け入れるため、プログラムがポート1090に戻り、次にポート1091に戻ることがわかりました。ただし、ほとんどのBerkeley実装にはバグがあり、その結果、LIFOが発生します。注文が勝ちます(最後に上、最初に下)。 Vyrobnikiは何度も許しを正そうとしました、タンパク質はSunOS4.1.3のようなそのようなシステムで使用されました。

回線がいっぱいの場合、TCPは着信SYNを無視し、許しを介してRSTバリアントを尊重しません。 プログラムまたはオペレーティングシステムがビジー状態であり、プログラムが入力を処理できないため、コールが入力されていることを確認してください。 このようなキャンプは短期間で変更することができます。 ただし、TCPサーバーがリセットされると、クライアントのアクティブな接続が中断されます(サーバーが起動されていない場合は中断されます)。 したがって、SYNが無視されると、TCPクライアントは後でSYNを再送信することを躊躇し、新しい接続の余地があるかどうか疑問に思います。

ここでは、TCP/IPのすべての実装に実用的な1つの非常に重要な詳細について説明する必要があります。 TCPが接続(SYN)の入力要求を別の時間に、また後で受け入れるという事実に勝ちました。 もしそうなら、誰に尋ねる必要があるか(ジェレルのIPアドレスとジェレルのポート番号)に応じて、プログラムは驚くことはできません。 TCPを使用する必要はありません。実装で勝つ、よりワイルドな手法です。 TLI(パート1)などのAPIと同様に、接続への要求の取得に関する補遺を追加し、要求を停止して受け入れることができます。その後、TCPを変更すると、次のように入力できます。プログラムがチェックされていれば、それは大丈夫です、本当にTCPはすでに「3回の手振り」を完了しています! 他のトランスポートレーンでは、到着を分離してフライトを受け入れることができます(OSIトランスポートレーン)。TCPにはそのような機能はありません。

Solaris 2.2には、TCPが接続で着信要求を受け入れることを許可しないオプションがありますが、プログラムはそれを許可しません(Eプログラムの配布ではtcp_eager_listeners)。

この動作は、アクティブなクライアント呼び出しが中断されるような方法でTCPサーバーを生成できないことも意味します。 新しいクライアントとの接続がサーバーに接続されている場合、TCPの「3ウェイハンドシェイク」はすでに完了しており、クライアントのアクティブな呼び出しは正常に完了しています。 サーバーがクライアントのIPアドレスとポート番号に驚嘆し、そのクライアントにサービスを提供したくない場合は、すべてのサーバーがチケットを閉じる(FIN​​が送信されるとき)か、チケットをドロップする(RSTが送信されるとき)ことができます。 クライアントがそのように感じた場合、サーバーはすべて正常であり、シャードはアクティブな応答で終了し、おそらくサーバーに要求を送信した後に終了します。

短いvisnovki

その前に、2つのプロセスがTCPの勝利とデータを交換できるため、自分自身の間で順序を確立するのはあなたの責任です。 それらの間の作業が完了すると、注文が破られる可能性があります。 部門が詳細に検討されるのは、「3回の手作業による」見積もりの​​見積もりの​​確立方法と、chotiriohセグメントの見積もりの​​手配方法です。

tcpdumpをハッキングして、TCPヘッダーのすべてのフィールドを表示しました。 また、通話がどのように設定されているのか疑問に思いましたが、タイムアウト、通話の切断方法、通話が閉じられた後に何が起こるか、TCPが通話をクローズモードに設定する方法(1時間1時間)によって中断される可能性があります-時間のシャットダウン。

TCPの機能を理解するには、TCPの基本的な変更図を見る必要があります。 ポイント、その日がどのように回復しているか、そしてキャンプでいつ変更が加えられたかを見ました。 そこで、TCPサーバーがTCP呼び出しをどのように設定しているかを調べました。

TCP接続は、ローカルIPアドレス、ローカルポート番号、リモートIPアドレス、およびリモートポート番号の4つのパラメーターによって一意に識別されます。 シャットダウンが発生するときはいつでも、一方の側がシャットダウンを覚えているという罪を犯します。その場合、TIME_WAITモードが使用されていると言います。 規則は、MSL時間の経過後、実施の承認を得て、レジーム全体に入った後、こちら側がより積極的になる可能性があると言うことです。

  1. ディーラーから、現在のシーケンス番号(ISN)を1に設定し、64000スキンpivsec増やす必要があり、よりアクティブにする必要があると言われました。 Tseは、ISNの最下位の3桁が永久に001になることを意味します。ただし、小さな18.3 qiの場合、皮膚の最下位の3桁は直接521を追加します。どうしたのでしょうか。
  2. 18.15の小さなものでは、12個のシンボルを叱り、TCPが13バイトを送信したことと戦いました。 18.16の小さなものでは、8つのシンボルを悪用しましたが、TCPは10バイトを送信しました。 最初のvipadに1バイトが追加され、他のvipadに2バイトが追加されたのはなぜですか?
  3. なぜあなたはvіdminnіstmіzhnapіvvіdkritimz'ednannyamとnapіvzkritimzadnannyamと言わなければならないのですか?
  4. サーバーとしてsockプログラムを起動し、ロボットを中断すると(元のクライアントが接続されていない場合)、サーバーを不注意に再起動できます。 Tseは、vinが2MSLステーションで取得できないことを意味します。 用語を図で説明し、変更します。
  5. ポートが2MSL検証キャンプの一部である限り、クライアントは同じローカルポート番号を再勝利できないことを示しました。 ただし、sockバイナリプログラムをクライアントとして実行する場合、1時間以内にサーバーに到着すると、同じローカルポート番号を使用できます。 さらに、2MSLキャンプにいるかのように、新しいビジネスを作成することができます。 気分はどうですか?

    太陽 % 靴下-vbsdi昼間

    1993年7月7日水曜日07:54:51
    ピアによって閉じられた接続

    太陽 % 靴下-v-b1163bsdi昼間同じローカルポート番号を再転送する
    140.252.13.33.1163から140.252.13.35.13に接続
    1993年7月7日水曜日07:55:01
    ピアによって閉じられた接続

  6. たとえば、FIN_WAIT_2ミルについて説明した場合、より多くの実装をCLOSEDミルからCLOSEDミルに転送する必要があることを示しました。これは、約11分後に補遺が完全に閉じられた(半分閉じられていない)ことを意味します。 反対側(CLOSE_WAITステーション内)は、閉じる(FIN​​をリダイレクトする)前に12クレジットをどのようにチェックしますか?TCPはFINの引き出しから何を取得しますか?
  7. 電話回線のどちら側がよりアクティブで、どちらが受動態ですか? 一晩で見えますか? 一晩閉じてもらえますか?
  8. 小さな18.6では、ARPzapizuまたはARPvodgukを取得しませんでした。 ただし、ホストsvr4のハードウェアアドレスはbsdiARPキャッシュにある可能性があります。 ARPキャッシュ内のアイテムが利用できないこの小さなことについて、何を変更する必要がありますか?
  9. tcpdumpコマンドで何が起こっているのかを説明します。 図18.13でヨガを調整します。

    1 0.0 solaris.32990> bsdi.discard:S 40140288:40140288(0)
    8760に勝つ
    2 0.003295(0.0033)bsdi.discard> solaris.32990:S 4208081409:4208081409(0)
    ack 40140289 win 4096

    3 0.419991(0.4167)solaris.32990> bsdi.discard:P 1:257(256)ack 1 win 9216
    4 0.449852(0.0299)solaris.32990> bsdi.discard:F 257:257(0)ack 1 win 9216
    5 0.451965(0.0021)bsdi.discard> solaris.32990:。 ack258勝3840
    6 0.464569(0.0126)bsdi.discard> solaris.32990:F 1:1(0)ack 258 win 4096
    7 0.720031(0.2555)solaris.32990> bsdi.discard :。 ack2勝9216

  10. 小さな18.4のサーバーが、クライアントのFINのACKを独自のFINと組み合わせて、セグメントの数をそれ自体で3つに変更できないのはなぜですか。
  11. 赤ちゃん18.16の場合、なぜRST注文番号26368002なのですか?
  12. レベルでの分割の原則に基づいて、MTUについてチャネルレベルにTCPをキューイングするための基礎は何ですか?
  13. TCP認識ポート番号を固定することにより逆多重化されます。 チー右ツェ?
手書きTCPを失う

TCPセッションの開始プロセス(「ハンドスクレイピング」とも呼ばれます)は、3つの部分で構成されています。

1.日付を設定できるクライアントは、シーケンス番号とSYN署名を持つセグメントでサーバーをオーバーライドします。

  • サーバーはセグメントを削除し、シーケンス番号を記憶して、新しいクライアントにサービスを提供するためのソケット(バッファーとメモリー構造)を作成しようとします。
    • 成功すると、サーバーはシーケンス番号を使用してセグメントをクライアントに送信し、SYNとACKを送信して、SYN-RECEIVEDステーションに移動します。
    • 障害が発生した場合、サーバーはRSTエンサインを使用してセグメントをクライアントに送信します。

2.クライアントがSYNフラグの付いたセグメントを削除した場合、シーケンス番号を記憶し、ACKフラグの付いたセグメントを送信します。

  • Yakshchoは、1時間のotrimuєiprapor ACK(どのような音とvіdbuvaєtsya)で、確立されたステーションに行きます。
  • クライアントがRSTエンサインのあるセグメントを受け入れると、クライアントは接続を試みます。
  • クライアントが10秒間遅延をキャンセルしない場合、クライアントは再度呼び出しのプロセスを繰り返します。

3.サーバーがACKエンサインを持つSYN-RECEIVEDセグメントを受け入れることができる場合、サーバーはESTABLISHEDに切り替わります。

  • それ以外の場合は、タイムアウト後、ソケットが閉じてCLOSEDに切り替わります。

このプロセスは「triheapuzgodzhennyam」と呼ばれ、それらを知らないoskіlki、実際にはz'dnannya z vikoristannya chotirokhsegmentіv(バックサーバーのSYN、バッククライアントのACK、バッククライアントのSYN、エコノミーのACK時間)をインストールするプロセスが可能です。 3つのセグメントが勝利しています。

TCP-vikno

ガイドは確認なしで送信できるため、どのフィールドにデータのバイト数で示される数値があります。

TCP vikno –データフローの強度を管理するためのアルゴリズム、データの最大量を変更する理由。所有者は、返却時に1つのセグメントを受け入れて確認する準備ができているため。
恩赦の数の統計によると、Rozmirvіknaは定期的に服従を割り当てます

ドメイン名

ドメインkolіzіy--ce 国境の面積イーサネット, すべての大学は独立してコリスマを認識しています、実際、ビニールのガルシアコリスマの一部では

  • フレームを超えてrozpovsyudzhuєtsyaではないビニールkolіzіyaコリズムのドメインに似ています
  • コロニー内のドメインの数が多いほど、皮膚コロニーの痕跡を覚えにくくなります。
  • 家で鎖を壊すkolіzіyzastosovuyutスイッチはありません

スイッチのVTPモード

VTP-VLANトランキングプロトコル。これにより、スイッチの管理とCiscoスイッチのVLANの管理が容易になります。 VTPから、VTPサーバー上のVLANを作成、変更、または表示できます。すべての変更は、1つのVTPドメイン内のすべてのスイッチに自動的に転送されます。 管理者がスキンスイッチでVLANを設定できるようにするもの。
3つのVTPモード(VTPモード)があります。

1.VTPサーバー-サーバーモード。 このモードでは、VLANを作成、表示、変更したり、VTPドメイン全体のプロトコルバージョン(vtpバージョン)、vtpフィルタリング(vtpプルーニング)などのさまざまなパラメータを設定したりできます。 VTPサーバは、VLAN設定を同じVTPドメイン内にある他のスイッチに報告し、VLAN設定を同期します。 また、VTPサーバは、クライアントの設定リビジョン番号が大きい限り、その設定をクライアントのVTP設定と同期させることができます。 VTP情報の交換は、TRUNKポートを介して送信されます。

2.VTPクライアント-クライアントモード。 VTPクライアントモードのスイッチでは、VLANを作成、表示、または変更することはできません。 スイッチのすべてのVLAN設定は、VTPサーバから取得されます。

3.VTPトランスペアレント-トランスペアレントモード。 このモードでは、スイッチはVTPサーバからのVLAN設定をブロックせず、その設定を他のスイッチに通知しませんが、トランクポートを介して他のスイッチにVTP情報を渡すことはできます。

引用

レビューの一環として、皮膚セグメントの転送の正確さは、注文の受領によって確認することができます。 引用-これは、単一の呼び出しを保護する従来の方法の1つです。 \ u200b\u200bquittingのアイデアは攻撃的です。

作成されたデータの再送信を整理できるようにするために、修正されるユニットの数(簡単にするために、それらはフレームと呼ばれていました)。 スキンフレームの場合、店員は、いわゆるポジティブレシートのレシート(サービス通知)をチェックして、撤回の最後のフレームと新しいフレームのデータが正しいことを確認する必要があります。 この周囲の掃除の時間-スキンフレームが送信されると、送信機はタイマーを開始し、受信が確実に完了するとすぐにフレームが台無しになります。 一部のプロトコルでは、作成されたデータでフレームを切断する場合、受信者は否定的な受信を修正する罪を犯します-フレームを再送信する必要があることは明らかです。


輸送ラインの機能

  • プログラム間の論理接続を確保します。
  • データのrealizuєnadіynu転送。
  • 伝送速度の制御を確実にします。

ソケット

ソケット(ソケット、ネスト)-オブジェクトを識別するデータ構造。

より多くのソケットが必要ですか? サーバー(プログラム)は、同じコンピューターを含む他のコンピューターとのTCP接続を同時にサポートできます。 スタンダードルームポート。 実装方法は? タスクをプログラマーに任せることができます。 パケットを受け取るために彼にバッファーからワインを選ばせ、政権の悪臭に驚嘆し、公式のランクを確認させます。 しかし、あなたはより良く働くことができます。

皮膚からz'єdnannyam有罪butipo'yazaniyasvіypotіk、あなたは情報を書くことができ、そこからあなたは読むことができます。 スキンストリームには、リモートコンピューターのIPアドレスとリモートコンピューターのポートが割り当てられます。 データの構造を、そのような皮膚の流れを示すものとして、ソケット(ロゼット)と呼びましょう。 このようにして、サーバーはrozgaluzhuvachem zの一連のソケットに接続でき、そこまでクライアントが接続されます。

この場合、バッファからメディアレベルのレシーバーまで、さまざまな種類のパッケージを並べ替える代わりに、サーバーはストリームから読み取り可能であり、そのような要求からのスキンがクライアントに送信されます。 。 クライアントのデータ型はコンパートメントで呼び出されませんが、ソケットストリームに分割されます。 このようなrozpodilのVidpovidalnistは、プログラマーではなく、オペレーティングシステムのトランスポートレベルのドライバーにあります。

ソケットはカリフォルニア大学バークレー校で開発され、OSI TLI(Transport Layer Interface)に対する事実上の標準になりました。

歴史的証拠。 Rozkol UNIX

1978年から、彼はBSD UNIXの歴史、カリフォルニア大学バークレー校での創作を始めました。 BSDの作者であるBillJoyによる。 1980年代の初めに、ベル研究所を所有していたAT&Tは、UNIXの価値を認識し、UNIXの商用バージョンを作成しました。 UNIXが分割された重要な理由は、1980年代の実装でした。 TCP/IPプロトコルスタック。 UNIXでのこのマシン間相互作用の前に、私は発祥の地で試してみました。これは、UUCP文字をリンクする最も一般的な方法です(あるUNIXシステムから別のUNIXシステムにファイルをコピーするために使用されました。 電話対策ヘルプモデム用)。

これらの2つのオペレーティングシステムは、ネットワークアドオン用に2つの異なるプログラミングインターフェイスを実装しました。バークレーソケット(TCP / IP)とTLI(OSI ISO)トランスポートレイヤーインターフェイス(トランスポートレイヤーインターフェイス)です。 カリフォルニア大学バークレー校でバークレーソケットインターフェースが拡張され、TCP/IPプロトコルスタックが分解されました。 AT&T作成のTLIは、OSIモデルのトランスポートレベルまでです。 当面、TCP / IPやその他のネットワークプロトコルの実装はなく、サードパーティ企業によって実装が提供されていました。 Tse、yak、およびіnshіmirkuvannya(zdebіlshoy、rіnkovі)、dvomgіlkamiUNIX-BSD(バークレー大学へ)とSystem V(AT&Tからの商用バージョン)の間のvyklikalo残留razmіzhuvannііѕ。 長年にわたり、AT&TからSystem Vのライセンスを取得した多くの企業が、AIX、HP-UX、IRIX、Solarisなどのさまざまな商用バージョンのUNIXを開発してきました。

ソケットプリミティブ

ソケット 新しい(空の)ソケットを作成します
練る サーバーはソケットからローカルアドレス(ポート)を表示します
聞く サーバーはクライアント接続用のメモリを認識します(TCP)
受け入れる サーバーはクライアントの接続を確認するか、カードからの最初の接続(TCP)を受け入れます。 入力接続の検証をブロックするために、サーバーはACCEPTプリミティブを無効にします。 リクエストを削除した後、OSトランスポートモジュールは、ソケットと同じパワーで新しいソケットを作成し、新しいソケットの説明ファイルを作成します。 次に、サーバーはプロセスを廃止するか、後で新しいソケットの接続を処理し、元のソケットの攻撃のチェックと並行して行うことができます。
接続 リクエストクライアント(TCP)
SEND / SEND_TO データの送信(TCP / UDP)
RECEIVE / RECEIVE_FROM データの受信(TCP / UDP)
切断 電源(TCP)

多重化と逆多重化

多重化-使用する付録のソケットタイプの追加を選択し、ヘッダーを追加します。

逆多重化-ソケット上のrozpodіlデータ。

UDPの場合、必要なソケットはホストのポート番号によって割り当てられ、TCPの場合、ホストのポート番号、IPアドレス、およびマスターのポート番号によって割り当てられます。

輸送プロトコル

トランスポートレベルには、TCP(上位)とUDP(非上位)の2つのプロトコルがあります。

UDPプロトコル

UDP(ユーザーデータグラムプロトコル)には最小制限があり、プログラムは中間の相互運用性なしで動作できます。 PratsyuєはTCPに富んでいるため、日付をインストールして配信確認を検証する必要はありません。 あなたはセグメントを使うことができます。 送信されるデータの正確さ(制御量)を制御できます。

UDPセグメントの構造

ヘッダーはわずか8バイトです。

データの信頼できる転送の原則

myTCPプロトコルを設計しているため、複雑になっています。

  • myTCP1.0プロトコルになります。 絶対に優れたチャネルによる伝送
  • myTCP 1.0プロトコルになります(右)(完全に正しいチャネルによる送信).JPG

    Vidpravnik

    myTCP 1.0プロトコル(マスター)になります(絶対右チャネルでの送信).JPG

    Oberzhuvach

  • myTCP2.0プロトコルになります。 戦闘の作成を可能にするチャネルによる送信。 不可能な中でパケットを無駄にする
  • myTCP 2.0プロトコルになります(右)(戦闘の作成を可能にするチャネルによる送信。できなくてもパケットを消費します)。JPG

    Vidpravnik

    myTCP 2.0プロトコル(マスター)になります(戦闘の作成を可能にするチャネルによる送信。できなくてもパケットを消費します)。JPG

    Oberzhuvach

しかし、領収書も台無しになる可能性があります。 領収書が作成されるとすぐに、ワーカーはパッケージを更新します。 保護者は、繰り返されるパケットを処理する方法について考えている罪を犯しています(新しいキャンプを導入する必要があります-彼らは最小のパケットを補遺に渡しました)。

TCP / IPでの「繰り返される」および「新しい」識別子の役割は、パケット番号によって果たされます(パケットが破棄される可能性があるため)。

  • myTCP2.1プロトコルになります。 戦闘の作成を可能にするチャネルによる送信。 不可能な中でパケットを無駄にする
  • myTCP 2.1プロトコルになります(右)(戦闘の作成を可能にするチャネルによる送信。できなくてもパケットを消費します)。JPG

    Vidpravnik

    myTCP 2.1プロトコル(マスター)になります(戦闘の作成を可能にするチャネルによる送信。できなくてもパケットを消費します)。JPG

    Oberzhuvach

国間の主な違いは、繰り返されるパッケージの処理方法に従順です。 「補遺に転送されるミヌリウムパッケージ」ステーションでは、パケットが繰り返され、「補遺によって転送されないミヌリウムパッケージ」ステーションでは、補遺を受け入れて転送します。

今、どのパッケージが台無しになる可能性があるかを推測する時が来ました。

  • パッケージが使用されたことに注意する必要があります。たとえば、パッケージが送信されてから1時間後に確認します。
  • パッケージに番号を付ける必要があります。
  • 領収書には、発送先の荷物番号を記載する必要があります。

このランクでは、タイマーの消費になります。 その日の変わり目に、曲の最後の1時間と確認が来なかったかのように、通知を繰り返す必要があります。 1時間の間隔は大きくありません。 支出の可能性は1に近くなります(良好なWiFi接続のためにこれを使用する必要はありません)。

確認のためのポイントを含む短いプロトコル

例を見てみましょう。 є1Gbチャンネルのロストフ-モスクワに行きましょう。 1000バイト(または8000バイト)を送信する時間待ちましょう:

8000ビット/1Gb / s = 8 µs

rozpovsudzhennya信号の時間:

1000 km / 300,000 km / s = 3333 µs

一緒に:次の1000バイトは6674 µsでますます送信されます。

Visnovok:99.9%の確率で、チャンネルは勝利していません。

さくらんぼの方法-パッケージのサイズを大きくします。 エール、1ビットつまずいたい場合は、パッケージ全体を捨ててください。 ほかに何か?

クラフトプロトコル

この問題の解決策:管理者が1つのフレームではなく、最初に低いズピニティのスプラットを圧倒し、確認(受信)モードに切り替えることができるようにします。 この技術はと呼ばれます 組み立てライン.

小さな緑色の部分に、これらの領収書がマークされています。すでに撤回されている場合、削除されている場合、削除されていない場合、修正の準備ができていますが、修正できない場合、ドックは領収書を削除できません。 Zhovtで。 Vіkno:zhovtiとblakitnі-tseパッケージ、yakіは領収書をクリアせずに転送することができます。 最初の白いパッケージは、最初の黄色の確認が取り消された後にのみ発行できます。 Todіknoは1人の右利きで崩壊します。

メモを求めることができます。次に、ウィンドウの開口部を調整し、すべてのパッケージを送信して、確認を確認する必要があります。 しかし、それほど臆病になることはできません。メレジのベンチャーを利用するのは簡単です。

職員を運ぶ時間の恩赦の立証の問題を解決する2つの方法があります:

  • GBN(Go Back N-Nパケットを元に戻します);
  • SR(セレクティブリピート-振動リピート)。
GBN

Oberzhuvachは、より積極的な領収書を行使し、そのようなパッケージの撤回についてはあまり考えていません。そのため、心が打たれています。番号の小さいすべてのパッケージはすでに撤回されています。 このランクでは、ここvikoristovuєtsya グループの均等化:番号iの領収書の管理者が受け取ったということは、iまでのすべてのパッケージが正常に配達されたことを意味します。 ある時間内に店員がレシートを受け取らなかった場合、残りのレシートについて次から始めて、N個のパケットすべての発行を繰り返します。

GBN方式は、お金が使われるため、長期間の拡張パケットの場合には効果がありません。 バット:1000パケットが修正され、もう一方は到着しませんでした。もう一方から始めて、すべての強度を繰り返す必要がありました。 私たちはzasmіchuєmomezhumarnyトラフィックです。

SR

Tseypidkhidがスキンパッケージのレシートの強度を引き渡します。 マネージャーは、間違ったフレームが取得された後に取得された、すべての正しいフレームをバッファーから取得します。 tsimuが間違ったフレームvіdkidaєtsyaの場合。 同じフレームのレシートのレシートがマージされるとすぐに、マネージャーは、今後のすべてのフレームの修正を繰り返さずに、同じフレームを再デプロイします。 それ以外の場合、テストは成功し、所持しているパッケージを次の行に転送できます。その後、番号が最も大きいフレームの削除の確認が送信されます。

多くの場合、振動法は、恩赦の場合(たとえば、誤った制御合計を使用した場合)の「否定応答」(NAK-否定応答)の修正と組み合わされます。 ロボットの効率が向上している人のために。

大きなブレークの場合、SRはかなりのバッファサイズを必要とする場合があります。

TCPプロトコル

TCPセグメント形式

TCPセグメントは、データフィールドとヘッダーフィールドの数で構成されます。 賛辞のフィールドプロセス間で渡されるデータの断片を復讐するため。 データフィールドの拡張はサイズで区切られます MS(最大セグメントサイズ)。 プロトコルが大きなファイルの転送を必要とする場合、MSSのサイズ(残りのフラグメントの叫び声、可能性があります)によってデータをフラグメントに分割するように聞こえます 小さいサイズ)。 一方、対話型プログラムは、データと交換されることが多く、通常はMSSよりはるかに少なくなります。 たとえば、Telnetなどのリモートアクセスプログラムは、1バイトのデータをトランスポートラインに送信できます。 Oskіlkiは、TCPセグメントのヘッダーの長さを20バイト(これは12バイト長く、UDPの場合は低くなります)と見なします。この方法でのセグメントの最後のサイズは21バイトです。

UDPプロトコルと同様に、ヘッダーには、データの多重化および逆多重化手順で認識されるマスターとドライバーのポートの番号、およびチェックサムフィールドが含まれます。 さらに、TCPセグメントウェアハウスがdeak_フィールドに入る前。

  • シリアル番号と確認番号の32ビットフィールド。 データの送信に必要です。
  • 4ビットヘッダー長フィールドは、TCPヘッダーの長さを32ビットワードで設定します。 最小サイズは5ワードに設定され、最大サイズは15に設定されているため、20バイトと60バイトを設定するのが妥当です。 TCPヘッダーは、以下で説明するパラメーターフィールドの長さに変更できます(パラメーターフィールドを空に設定します。これは、ヘッダーの長さが20バイトに設定されることを意味します)。
  • エンサインフィールドは6ビットで構成されています。 確認ビット(ABC)は、レシートにあるはずの重要なものが正しいことを示します。 呼び出しを完了するために、RST、SYN、およびFINビットが呼び出されます。 PSHビットをリセットして、coristuvachaの補足であるプライマリバッファに蓄積されたデータを処理するようにユーザーに指示します。 URGビットは、セグメントにデータがあり、用語として上位レベルに配置されていることを示します。 用語データの残りのバイトの解凍は、用語データ標識の16ビットフィールドで指定されます。 受信する側では、TCPプロトコルは、セグメント内の用語データの存在の上限を報告し、それをデータの終わりのインジケーターに渡す役割を果たします。 実際には、フラグPSH、URG、および用語のインジケーターのフィールドは一般化されていません。 完全な在庫以上のものを推測しました。
  • 初めて16ビットのデータフロー制御。 あなたが受け入れる側を受け入れるのは良い考えであるかのように、それはバイト数での復讐を必要とします。
  • 重要値-指定されたセグメントのシリアル番号の正の値の16ビット値。 このフィールドは、緊急データを終了するオクテットのシリアル番号を指定します。 このフィールドは、インストールされたエンサインURGからのパッケージをあまり尊重しないように取られています。
  • vypadkiのneobov'yazkoveフィールドparametrіvvykos​​tvuєtsya、送受信する側がセグメントの最大サイズについて「domovlyayutsya」である場合、ただしvysokoshvidkіsnyhmerezhaでウィンドウをスケーリングするため。 また、このフィールドには、タイムマーカーのパラメーターが表示されます。 追加情報は、RFC854およびRFC1323にあります。
シーケンス番号と確認番号

セグメントシーケンス番号-セグメントの最初のバイトの番号。

予約番号-次のoctifiedバイトの序数。

TCPセグメントのヘッダーで最も重要であることを確認するシーケンス番号フィールドであるシャードは、データ転送サービスの機能において重要な役割を果たします。 ただし、その前に、TCPのように値に到達するオーバーヘッド送信のメカニズムにおけるこれらのフィールドの役割をどのように考慮するかがフィールドに配置されます。

TCPプロトコルは、データをバイトバイトの非構造化順序と見なします。 この動作は、TCPがシーケンス番号をセグメントではなく、送信されているスキンバイトに割り当てるという事実に表れています。 代わりに、セグメントのシーケンス番号が、セグメントの最初のバイトのシーケンス番号として割り当てられます。 攻撃しているお尻を見てみましょう。 ホストAに送信し、TCP拒否を介してデータをホストに転送します。 送信側のTCPプロトコルは、ストリームごとのバイト数を暗黙的に列挙します。 転送されるファイルのサイズを500,000バイト、MSS値を1000バイト、ストリームの最初のバイトのシーケンス番号を0とします。TCPはデータストリームを500セグメントに分割します。 最初のセグメントにはシーケンス番号0が割り当てられ、別のセグメントにはシーケンス番号1000が割り当てられ、3番目のセグメントにはシーケンス番号2000が割り当てられ、以下同様に続きます。シーケンス番号はTCPスキンのシーケンス番号フィールドに入力されます。セグメント。

それでは、確認番号を見てみましょう。 TCPプロトコルがデータの二重送信を保証し、ホストA間の単一のTCPデータ転送を介して、両側に同時に送信できるようにするものについて考えてみましょう。 ホストを離れるスキンセグメントは、ホストBからホストAに送信されるデータのシーケンス番号を置き換えます。ホストAがそのセグメントに送信する確認番号は、ホストAがホストから検証した攻撃バイトのシーケンス番号です。 B.攻撃しているお尻を見てみましょう。 ホストによって送信された、0から535までの番号を持つすべてのバイトを削除したホストAが、ホストBに送信するためのセグメントを形成するとします。そのセグメントの確認番号のフィールドの536。

別の状況を見てみましょう。 ホストAがホストタイプYを2つのセグメントから削除し、最初のセグメントは0〜535のような番号のバイトを持ち、もう1つは900〜1000のような番号のバイトを持ちます。ホストAが最初の日のバイトを受け入れることにした場合は、そのセグメントの確認番号フィールドの番号536。

例の残りの部分は、TCPプロトコルの機能のさらに重要な側面を示しています。 3番目のセグメント(バイト900-1000を削除するため)は、他のセグメント(バイト536-899を削除するため)よりも早くホストAによって受け入れられたため、データのシーケンスが壊れています。 非難の力:TCPはどのように故障に対応しますか? セグメントが削除されると、シーケンス番号は高く、スコアは低くなり、セグメントからのデータはバッファリングされますが、確認されたシーケンス番号は変更されません。 セグメントが毎年受け入れられ、指定されたシーケンス番号になっている場合、データの順序は、セグメントのシーケンス番号に基づいて自動的に更新されます。 このランクでは、TCPはSRのプロトコルになりますが、新しいものでは、GBNのような正式な承認として祝われます。 SRが欲しい-それほどきれいではない。 当事者が(3)1つの同じセグメントxに対して負の領収書を受け入れる場合、注文とセグメントx + 1、x + 2、x + 3、...に料金が発生したと推測されます。配達されました。 Todinadsilaetsya-GBNプロトコルのようにxのシリーズ全体。

セグメントの最大サイズに関する問題

TCPは、セグメント全体で仮想化され、ユニットあたりの最大サイズ(MTU)が標準のイーサネットMTU(1500バイト)よりも小さくなるように、その時点で最大セグメントサイズを明示的に設定する必要があります。 GRE、IPIP、PPPoEトンネルMTUなどのトンネリングプロトコルは標準よりも小さいため、最大サイズのTCPセグメントは、最大パケットサイズよりも大きく、MTUが低くなる可能性があります。 最も重要な場合の断片化の断片はブロックされ、そのようなパケットはスローされます。

これらの問題を示したので、それはその日の「ハングアップ」のように見えます。 「ハングアップ」の場合は、特定の瞬間と時間にハングアップする可能性があります。それでも、勝利者のリーダーが許容範囲の拡大のために鳩のセグメントに到達した場合は、ハングアップする可能性があります。 この問題を解決するために、ファイアウォールルールがルーターにインストールされ、接続を開始するすべてのパケットにMSSパラメーターが追加されるため、ドライバーは許容サイズのセグメントを打ち負かすことができます。 MSSは、オペレーティングシステムの設定によっても制御できます。

トライイン手書き

チャレンジを設定するために、ホスト2はACCEPTをプライミングすることによって入力チャレンジを受動的に評価します。

ホスト2は、接続を設定するvin、TCPセグメントの最大サイズなどを指定して、CONNECTプリミティブを選択します。 ASK=0および確認を確認します。 この順序で、ホストは1から2までのホストでの一連の戦闘のシリアル番号xをアナウンスします。

ホスト2は、「接続が受け入れられました」という確認を送信します(機能が受け入れられます)。 通常の方法で実行されるTCPセグメントのシーケンスを図に示します。SYN=1ASK = 1、ホスト2はホスト2対1の一連の戦闘のシーケンス番号xをチェックし、データがまだ残っていることを通知します。有効で、バイト番号x+1から始まります。

ホスト1(接続)は、接続の受け入れの確認を強制します。

TCP圧倒的な戦い

フェンスに来る賛辞がもっとあれば、やるべきことがもっとあり、フェンスで混雑が確立されます。 インターネットは誰の感覚のせいでもありません。 フリンジは虚栄心と戦うのにも役立ちますが、データ伝送速度の低下に関連するこの問題の解決への主な貢献は、TCPプロトコルによって実装されます。

理論的には、物理​​学を超えた追加の原理、つまりパッケージの保存則を利用するために戦うことは可能です。 アイデアは、新しいパケットをメジャーに転送しないことです。ドックは古いパケットを残してはなりません(したがって、それらは配信されません)。 TCPプロトコルは、動的な環境の助けを借りて世界中で利用できるようになっています。

フィールドの冒険との戦いの最初のステップは、それを引き出すことです。 10年間、merezhіの変化を示すことは困難でした。 パッケージが1時間ごとに配信されない理由を理解することが重要です。 高い川のラインを介してラインにパッケージを転送する絶好の機会もあります。

この時間に、送信中にパケットを使用します。ほとんどの中間回線が光ファイバーに接続されているため、パケットが目に見えてトラップされることはめったにありません。 ダーツレスメレザ vіdsotokpakіv、scho vtrachayutsya through shkodi、dosit high)。 明らかに、インターネットで費やされたパケットの大部分は輻輳を引き起こしました。 すべてのTCPアルゴリズムはインターネットに許可されており、パケットを浪費するパケットは先駆者に呼び出され、トラブルメーカーであるかのようにタイムアウトを追跡します。

まず、進行中の攻撃に対してTCPがどのように反応するかについて説明し、プロトコルを停止する方法をいくつか説明します。 緊急性が明らかになった場合、実行可能なロズミールの予約があるかもしれません。 Obedzhuvachはrozmіrvіkna、vyhodyachiіzkіlkostіを示すことができます フリースペースバッファで。 uvazіrozmіrvіknのmatimeのドライバーのように、マネージャーのバッファーのオーバーフローが問題の原因になることはありませんが、それでも、マネージャーとマネジャー。

TCP圧倒的な戦い

給水の尻の問題を説明します。 小さい子では、パイプを吹き飛ばしますが、それは小さな容量への執着につながります。 ウォーターハウスのドックはそれ以上の水を許可しません、低いものは風に合うことができます、水はこぼれません、介在する要因は風の容量ではなく、建物の容量です。 渦潮の蛇口からのように、水はより速く流出し、次に渦潮の水の小川はより頻繁に上昇し、それが澄んでいる場合、水の一部が渦潮の端を越えて溢れる可能性があります。

インターネットでzastosovuєtsyaが2つの潜在的な問題の認識を突っ込んでいるソリューション:低スループット容量と低容量oberzhuvacha-両方の問題の一種のソリューション。 この皮革労働者には、vikno、強迫観念、viknorevantazhenniaの2つの勝利があります。 ガイドが転送する権利を持っているかもしれないので、Rozmirスキンїхвідпідідєкілкоїbyteіv。 Vdpravnikkeruetsyaこれら2つの値の最小値。 たとえば、所有者は「8 Kバイトを送信」と言っているようですが、マネージャーは、4 Kバイトを超える受信があった場合、メジャーで輻輳が発生することを知っているため、4Kバイトを送信します。 まあ、労働者は知っています 多数データ、たとえば32 Kバイトは、スタイルを渡し、証明書を要求します(tobto 8Kバイト)。

チケットを設定すると、ドライバーはウィンドウのサイズを、指定されたゾーンで勝つ最大セグメントのサイズと等しくなるように設定します。 最大セグメントを1つ転送してみましょう。 このセグメントの保有を確認するために、採点期間が終了し、年末までセグメントの拡大が追加され、世紀の拡大が変更され、すでに2つのセグメントが強制されています。 皮膚セグメンテーションの改善の場合、最大1つのセグメントの値による皮膚のセグメンテーションの拡張が実行される。 n個のセグメントに対して拡張が適切であるとしましょう。 すべてのセグメントの確認が1時間ごとに到着すると、nセグメントに応じて、バイト数だけ増加します。 実際、セグメントの皮膚シーケンスの確認は、戦争が終わる前に実行する必要があります。

この指数関数的成長のプロセスは3回であり、制御ウィンドウの拡張によってドックに到達しないか、境界のシフトを示すタイムアウトサインによって振動しません。 たとえば、1024、2048、および4096バイトのサイズのパケットは成功したが、8192バイトのサイズのパケットの送信の確認は用語挿入によって確認されなかったため、チャレンジは4096バイトに設定されました。 。 空室の拡張が4096バイトに等しいままである限り、所有されることを望んでいる空室の拡張に関係なく、他のより多くのパケットが圧倒されることはありません。 アルゴリズム全体が呼び出されます 長期スタート、 また 適切な起動。 しかし、ワインはもはや一般的ではありません(Jacobson、1988)。 指数関数的に勝ちます。 TCPプロトコルのすべての実装をサポートする必要があります。

それでは、インターネットで勝利を収めている逆境と戦うメカニズムを見てみましょう。 3番目のパラメーターには境界値があるため、原則として64Kbが復元されます。 タイムアウト状況に問題がある場合(確認が文字列でローテーションされない場合)、新しいしきい値がストリーミング容量ギャップの半分に等しく設定され、ギャップギャップが1つの最大セグメントに変更されます。 次に、斜面の前にいるかのように、長時間の起動アルゴリズムが開発されます。これにより、レーンのスループット容量をすばやく表示できます。 ただし、静脈の広がりの指数関数的な増加は、しきい値に達した後に上昇し、その後、皮膚の不快な伝達のために1セグメントずつ直線的に増加します。 実際、未来の二重の拡大を落ち着いて減らすことができると言われています。その後、段階的にヨガを増やしていきます。

オーバーヘッド伝送メカニズム。 ウザガルネーニャ

チェックサム 受け取ったパッケージでの戦闘の作成を明らかにしました
タイマー Vіdl_k_intervaloch_kuvannyathatvkaz_vkaonyogozakіchennya。 残りは、パッケージが高レベルの転送可能性を備えているか、送信中に領収書が使用されたことを意味します。 同時に、荷物が詰まりから配達されたが、使用されていない場合(チェックアウト間隔が終了する前)、そうでない場合、受領は無駄になり、受領側でパッケージが複製されるまで再送信が行われます。 。
序数 転送側によって圧倒されるパッケージの連番。 取られるパッケージの数の「Probіli」は、お金を使うことについてのひげを追加することを可能にします。 同じシーケンス番号とパケットは、パケットが1つのうちの1つを複製することを意味します
「+」と「-」の領収書 これは、受信側によって生成され、パケットが受け入れられたか、パケットのグループが受け入れられたか、受け入れられなかったかを送信側に示します。 注文番号と正常に受信されたパケットを確認するために呼び出します。 プロトコルに従って、個人およびグループの確認はプロトコルに従って分割されます
ヴィクノ/コンベヤー パケットの転送に使用できるシリアル番号の範囲を囲みます。 グループ転送とハンドシェイクにより、大幅な増加が可能になります 建物を通過します por_vnyannіzモードochіkuvannyapodverdzhennyaでのプロトコル。 Rozmіrvyknaは、受け取り側の受け取りとバッファリングの可能性、および資本化のレベルに基づいて再保険をかけることができます

プログラミング機能

  1. TCP接続ストリーム
    • 状況a)可能 不潔な星 merezhny川のデータグラムグループが到着するまでのわずか1時間は素晴らしいです:
      • computer1かつて勝利した送信機能。
      • computer2は、1つのrecvサイクルですべての情報を取得するわけではありません(サイクルのサイクルが必要です)。
    • 状況b)は、マリウムの送信機能の呼び出しとこれらのマリウムの拡張との間の時間間隔として可能です。
      • computer1vicorist関数はスプラット時間を送信します。
      • computer2は、1回のrecvクリックですべての情報を取得します。
  2. UDPプロトコルの背後にある
    • 状況a)-不可能
      • computer1は、送信機能を使用すると、境界線上でUDPセグメントがパケットのスプラットに分割されます。
      • computer2は、1回のrecvクリックで毎回セグメントを取得し、すべてのIPデータグラムに含まれるのはごくわずかです。
    • 状況b)-不可能
      • computer1の異なるsendtoツイートは、computer2の異なるUDPデータグラムと異なるrecvfromツイートに許可されます。
  3. recvおよびrecvfrom関数のバッファーが小さいため、送信されるデータの数を減らします。UDPモードでは、データの一部が無駄になり、TCPモードでは、攻撃的なrecv呼び出しのために余剰分が保存されます。
  4. UDPサーバーは1つのソケットを持つことができ、TCPサーバーは(1時間ごとに接続されるクライアントごとに)多くの異なるソケットを持つことができ、独自の情報がスキンに送信されます。

©2022androidas.ru-Androidのすべて