スティッキー TCP パケットの問題を解決するにはどうすればよいですか?
TCP スティッキー パケットの問題に対処する方法: 1. 固定長送信方式、送信側はデータ送信時にパケット化する長として LEN を使用します; 2. 送信する各データのテール マーク シーケンス方式パケットの最後に特別なバイト シーケンスを設定します; 3. ヘッダー マーキングの段階的な受信方法、ユーザー ヘッダーを定義し、ヘッダーで毎回送信されるデータ パケットのサイズを示します。
tcp スティッキー パケットの問題に対処する方法:
1. 設計計画 1: 修正済み送信長
データ送信時は、どんなに大きなデータを送信しても固定長にパケット化する固定長設計を採用しています(説明の便宜上、ここでは固定長を LEN として記録します)、つまり送信 データを送信するとき、エンドは LEN をパケット化の長さとして使用します。このように、受信側は固定のLENで受信するため、送信と受信が1対1で対応することができます。サブパッケージ化する場合、複数の完全な LEN パケットに完全に分割されない場合があります。通常、最後のパケットは LEN よりも小さくなります。このとき、最後のパケットは欠落部分を空白バイトで埋めることができます。
もちろん、このアプローチには欠陥があります。
1. 最後のパケットの不十分な長さは空白部分、つまり無効なバイト順序で埋められています。この無効な部分は、受信者が識別するのが困難になる可能性がありますが、これは単に埋めるためのものであり、実際には意味がありません。これにより、受信側がその意味を処理する際に問題が生じます。もちろん、フラグ ビットを追加することで補償できる解決策もあります。つまり、各データ パケットの先頭に固定長のヘッダーを追加し、データ パケットのエンド マークを一緒に送信します。受信側はこのマークにより無効なバイト列を確認し、データを完全に受信することができる。
2. 送信されるパケットの長さがランダムに分散されると、帯域幅が無駄になります。たとえば、送信長は 1,100、1000、4000 バイトなどであり、それらはすべて最大固定長である 4000 に従って送信される必要があります。4000 バイトより小さいデータ パケットを持つ他のパケットも同様に埋められます。 4000 の場合、ネットワーク負荷が無駄に浪費されます。
要約すると、この解決策は、送信されるデータ パケットの長さが比較的安定している (特定の固定値になる傾向がある) 場合により効果的です。
関連する学習の推奨事項: PHP プログラミングの入門から習熟まで
#2. 設計案 2: テール マーク シーケンス
#送信する各データ パケットの最後に 1 つを設定します特別なバイト シーケンス。このシーケンスには特別な意味があります。文字列の終了文字 "\0" と同じ意味があります。データ パケットの終わりをマークするために使用されます。受信側は、受信したデータを末尾シーケンス パケット境界を確認します。
この方法の欠陥は明らかです:
1. 受信者はデータを分析し、末尾シーケンスを識別する必要があります。
2. 末尾配列の決定自体が問題です。 「\0」のようなターミネータとして使用できるシーケンスは何ですか?このシーケンスは、「\0」が無効な文字列内容であるため文字列の終了マークとして使用できるのと同様に、人間やプログラムによって一般的に認識される意味を持たないデータ シーケンスである必要があります。では、通常のネットワーク通信におけるこのシーケンスは何でしょうか?しばらくは正解を見つけるのは難しいと思います。
3. 設計計画 3: ヘッダー タグの段階的な受信
この方法は、作成者の制限に基づいた最良の方法です。知識。効率を損なうことなく、あらゆるサイズのパケットの境界問題を完全に解決します。
このメソッドの実装は次のとおりです。ユーザー ヘッダーを定義し、ヘッダーで毎回送信されるデータ パケットのサイズを示します。受信機はデータを受信するたびに、まずヘッダーのサイズに応じてデータを読み取ります。これは 1 つのヘッダーのデータのみを読み取ります。ヘッダーからデータ パケットのデータ サイズを取得し、その後、データ パケットのデータ サイズに応じて再度読み取ります。データの内容を読み出します。
このように、各データ パケットは送信時にヘッダーでカプセル化され、受信者は 2 回に分けてパケットを受信します。1 回目はヘッダーを受信し、2 回目はデータを受信します。ヘッダーのサイズに基づいてコンテンツが決まります。 (ここでの data[0] の本質は、データのテキスト部分を指すポインタであるか、連続データ領域の開始位置である可能性があります。したがって、この場合は data[user_size] として設計できます) .)
以下は設計思想を示す図です。
この図から、データはヘッダーをカプセル化するアクションとともに送信され、受信側は各パケットの受信を 2 回に分割することがわかります。
このソリューションは優れているように見えますが、実際には欠陥もあります:
1. ヘッダーは小さいですが、各パケットはより多くの sizeof(_data_head) データをカプセル化する必要があり、累積影響を完全に無視することはできません。
2. 受信機の受信動作は 2 回に分けられ、データ読み取り動作が 2 倍になり、データ読み取り動作の recv または read はシステム コールとなり、システムにとって有害です。言語のオーバーヘッドは完全に無視できない影響であり、プログラムへのパフォーマンスへの影響は無視できます (システム コールは非常に高速です)。
利点: プログラム設計の複雑さが回避され、その有効性の検証が容易になり、ソフトウェア設計の安定性要件を満たすのが容易になります。結論から言えば、プラン 3 が最善の策です。
以上がスティッキー TCP パケットの問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

win10でtcp/ipプロトコルをリセットするにはどうすればよいですか?実際、その方法は非常に簡単で、ユーザーがコマンド プロンプトに直接入力し、ctrl Shift Enter キーの組み合わせを押して操作を実行するか、reset コマンドを直接実行して設定することができます。 Windows 10 で TCP/IP プロトコル スタックをリセットする方法をユーザーに注意深く紹介します。 Windows 10 で tcp/ip プロトコル スタックをリセットする方法 1。 管理者権限 1. ショートカット キー win R を使用してファイル名を指定して実行ウィンドウを直接開き、「cmd」と入力し、ctrl Shift Enter キーの組み合わせを押し続けます。 2. または、スタート メニューでコマンド プロンプトを直接検索し、右クリックします。

TCP は、コンピュータ ネットワーク通信プロトコルの一種であり、コネクション型の伝送プロトコルです。 Javaアプリケーション開発において、TCP通信はクライアントとサーバー間のデータ送信、音声や映像のリアルタイム送信など、さまざまなシーンで広く利用されています。 Netty4 は、サーバーとクライアント間のデータ交換プロセスを最適化し、効率性と信頼性を高めることができる、高性能、拡張性の高いネットワーク プログラミング フレームワークです。 TCP 通信に Netty4 を使用する具体的な実装手順は次のとおりです。

TCP クライアント TCP プロトコルを使用して継続的な対話を実現するクライアントのサンプル コード: importsocket#クライアント設定 HOST='localhost'PORT=12345#TCP ソケットを作成し、サーバーに接続 client_socket=socket.socket(socket.AF_INET,socket . SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#ユーザー入力を取得 message=input("送信するメッセージを入力してください:&

ここで言う「コネクション指向」とは、コネクションを確立し、コネクションを利用し、コネクションを解放する必要があることを意味します。接続の確立とは、よく知られている TCP スリーウェイ ハンドシェイクを指します。接続を使用する場合、データは 1 回の送信と 1 回の確認の形式で送信されます。また、一般的な TCP 4 波である接続の解放もあります。

以下では、説明の便宜上、TCPの通信当事者のうち、通信当事者をA、Bに置き換えて説明する。 TCP プロトコルによれば、A が接続を閉じた後も B がデータを送信し続けると、B は A の RST 応答を受信します。 B がデータの送信を続ける場合、システムは SIGPIPE 信号を送信して、接続が切断されたことを通知し、送信を停止します。 SIGPIPE シグナルに対するシステムのデフォルトの処理動作は、プロセス B を終了させることです。 SIGPIPE 信号に対するオペレーティング システムのデフォルトの処理動作は非常に不親切です。これを分析してみましょう。 TCP 通信は全二重チャネルであり、2 つの単信チャネルに相当し、接続の各端が 1 つのチャネルを担当します。反対側が「閉じる」場合、2 つのチャネル全体を閉じることが意図されていますが、ローカル エンドは FIN パケットのみを受信します。 TCP プロトコルの規定に従って、

1 つの TCP 接続を使用して複数のファイルを送信することについてこのブログが書かれているのはなぜですか?最近関連の本を読んでいるのですが、単に Socket を使ってプログラミングするのは問題ありませんが、これはいくつかの基本的な概念を確立するだけです。本当の問題に対してはまだ何もできません。ファイルを転送する必要がある場合、データ (バイナリ データ) を送信しただけのように見えますが、ファイルに関する一部の情報 (ファイル拡張子) が失われていることがわかります。そして、毎回 1 つのファイルを送信するために 1 つのソケットしか使用できないため、連続してファイルを送信する方法はありません (ファイルの送信を完了するにはストリームを閉じることに依存しているため、実際にはファイルの長さがわかりません。したがって、1 つのソケット接続がファイルを表す場合にのみファイルを送信できます)。

TCP と IP はインターネットにおける 2 つの異なるプロトコルです: 1. TCP はトランスポート層プロトコル、IP はネットワーク層プロトコル; 2. TCP はデータ パケットのセグメント化、並べ替え、確認、再送信などの機能を提供します。プロトコルはデータ パケットの送信元アドレスと宛先アドレスを提供する役割を果たします; 3. TCP は接続指向のプロトコルですが、IP プロトコルはコネクションレスです; 4. TCP はフロー制御と輻輳制御も提供します。

かつて、面接でよくある質問で、「ブラウザに URL が入力されてからページが表示されるまでの過程で何が起こっていますか?」という質問がありました。予習をした学生ならほとんど答えられると思いますが、「受信したHTMLに数十個の画像タグが含まれている場合、どのような方法で、どのような順序で、どれだけの接続が確立され、どのようなプロトコルでダウンロードされるのか」と続けて尋ねると、これらの画像はどうでしょうか?