目次
(2)ウェルノウンポート番号を知る(Well-Know Port Number)
(1) 例 1: n はエイリアスの表示を拒否し、表示可能な数値はすべて数値に変換されます。
(2) 例 2: l Listening (モニタリング) でサービスの状態のみを一覧表示する
(3) 例 3: p は、該当するリンクを確立しているプログラムの名前を表示します。
(3) ヘッダー追加の本質は、実際にはオブジェクトをコピーすることです。
(1) TCP プロトコルのセグメント形式を詳しく紹介します
(3) 32 ビットのシリアル番号は順番に到着することを保証します—URG
①32 ビットのシリアル番号は順番に到着することを保証します。
③URG アプリケーション シナリオ - サーバー/ホストのステータスを取得するために使用されます
(1) 信頼できないもの: パケット損失、障害、検証失敗。。
(2) メッセージが失われたかどうかを確認する方法 (確認応答メカニズム)
(2) TCP ヘッダーに 32 ビットのシリアル番号と 32 ビットの確認番号の 2 セットのシリアル番号があるのはなぜですか? 頻繁にテストする
(2) 16 ビット ウィンドウ サイズ - フロー制御戦略
(3) tcp テキストの長さはアプリケーション層によって決まります
5. パケットロスの解決策 - タイムアウト再送信メカニズム
(2) データを繰り返し受信し、シリアル番号を重複排除することができます
③TIME_WAIT状態によるバインド失敗の解決方法(ジョブ)
3. listen の 2 番目のパラメータ - backlog
1. ポート番号についてもう一度話します。
1. ポート番号の定義
2. ポート番号範囲分割
(1) 合計 2^16 個のポートがあります
(2)ウェルノウンポート番号を知る(Well-Know Port Number)
cat /etc/services
ポート番号を使用するプログラムを作成するときは、これらの既知のポート番号を避ける必要があります。
3. ポート番号とプロセスはKV関係です
4.ネット統計
(1) 例 1: n はエイリアスの表示を拒否し、表示可能な数値はすべて数値に変換されます。
(2) 例 2: l Listening (モニタリング) でサービスの状態のみを一覧表示する
(3) 例 3: p は、該当するリンクを確立しているプログラムの名前を表示します。
関連するリンクを確立している PID とプログラム名は、一般ユーザーは表示できません。root 権限のみが表示できます。
5.ピドフ
2. UDPプロトコル
1. UDPプロトコル終了フォーマット
(1) UDPプロトコルの構造
最初の 8 バイトは UDP ヘッダー、残りはメッセージです
16ビットの送信元ポート番号: 自身のプロセスのポート番号
16ビットの宛先ポート番号: アクセス先のプロセスのポート番号
(2) ヘッダーはビット セグメントを含む構造です。
(3) ヘッダー追加の本質は、実際にはオブジェクトをコピーすることです。
オブジェクトのメンバー変数を入力し、sizeof (udp_header) のサイズをバイナリにコピーして、それを udp_header (udp_hdr) 型に強制します。
2. UDPの特徴
3. データグラム指向
データグラム: UDP の長さは 16 ビットであるため、メッセージとメッセージの間には明確な境界があります。
4. UDPバッファ
5. UDP利用時の注意事項
6. UDPベースのアプリケーション層プロトコル
3.TCPプロトコル_
1.TCP定義
2. TCPプロトコルセグメントフォーマット
①梱包・開梱方法:
②シェア方法
(1) TCPプロトコルのセグメント形式を詳しく紹介します
(2) メッセージにもカテゴリがあります
。 FIN : このメッセージは、リンクを切断するための要求メッセージ テキスト (終了)
ACK : 確認フラグ、1 に設定すると、メッセージが履歴メッセージの確認であるだけでなく、一般的に最も正式な通信の場合、送信されるデータも伝送できることを意味しますACK は 1
PSH : 受信側アプリケーションに TCP バッファからデータをすぐに読み取るように要求します
URG : 緊急ポインタフラグビット。機能: メッセージはシーケンス番号を無視し、上位層によって直接読み取られて処理されます。(このメッセージを緊急ポインタメッセージと呼びます)詳細は3→2→(3)を参照してください。
最後の ACK が失われた場合、クライアントは接続がまだ確立されていることを認識せず、メッセージの送信を続けます。サーバーも ACK を受信しないときにこの問題を認識します。この状況を回避するために、サーバーは次のようにします。 ACK を受信しません。接続がリセットされると、SYN+ACK 応答が再送信され、RST も 1 に設定されます。
(3) 32 ビットのシリアル番号は順番に到着することが保証されます — URG
① 32 ビットのシリアル番号は順番に到着することを保証します。
メッセージが送信されると、順序どおりに到着しない可能性があります。それは信頼できない種類のものです。
パケットを順番に到着させる必要がありますが、どうすればよいでしょうか? —— 32 ビットのシリアル番号により、順番に到着することが保証されます。これはメッセージのシリアル番号であり、受信バッファは受信後にソートできます。
②URG緊急ポインタフラグと緊急ポインタ:
TCP でデータが順番に到着する必要がある場合、つまり、一部のデータの優先順位が高くてもシーケンス番号が後である場合、データを制限して緊急に処理することはできません。
解決策: URG緊急ポインタ フラグを使用します。URG は1 としてマークされ、優先度の高いメッセージのシリアル番号を無視し、上位層によって直接読み取られて処理されます。(このメッセージを緊急ポインタメッセージと呼びます)
16 ビット緊急ポインタ: 緊急ポインタ メッセージを指すオフセット。緊急ポインタ メッセージには 1 バイトのみを含めることができます
③ URGアプリケーション シナリオ - サーバー/ホストのステータスを取得するために使用されます
クライアントがサーバーにデータを送信する際、何らかの理由(メモリ不足など)によりサーバーがメッセージを受信できない、またはメッセージの受信が遅い場合があり、この場合、クライアントはサーバーの状態を知りたいため、 1 と マークされたメッセージ URG 緊急ポインタを送信します 。このとき、サーバーは非常に困難な状況下でも、指定された 1 バイトを優先的に受信し、サーバー内に設定された特定のロジックを通じてステータス コード 20 (仮定) を取得します。そして、URG 緊急ポインタ フラグを使用して、指定されたポインタをマークします 。1バイトがクライアントに返され、クライアントは 20 ステータス コードを受け取り、「メモリ不足」のためにサーバーが正常に動作できないことを知り、スタッフに通知します。
3. 信頼性の問題:
(1) 信頼できないもの:パケット損失、障害、検証失敗。。
(2) メッセージが失われたかどうかを確認する方法 (確認応答メカニズム)
回答:応答を受け取った場合は、その応答が紛失していないことを確認しますが、そうでない場合はわかりません。信頼性とは、送信したメッセージが相手から応答される場合は信頼できるものであり、応答されないメッセージは信頼できるとは保証されないことを意味します。
詳しく解説:自分が送ったメッセージが相手に届いたかどうかはどうやって分かるのでしょうか?——相手から返信があれば、自分が送ったメッセージは100%相手に届いたということになります!
遠距離通信中は、常に最新のデータが存在します。したがって、100% 信頼できる合意は存在しません。!ただし、ローカルでは 100% 信頼できる可能性があります。
ただし、送信されたメッセージに対応する応答がある限り、送信したメッセージは相手に受信されたと考えられます!! 確認
応答メカニズムにより、相手がデータを受信できることが保証されます。
4.確認応答(ACK)メカニズム
(1) 32ビットシリアル番号/32ビット確認番号
合意を確立します。TCP が通信するとき、送信されるメッセージには TCP ヘッダーが含まれている必要があります。
以下の図について説明します。クライアントがペイロードを送信するときは、TCP ヘッダーを運ぶ必要があり、データはすでに入力されています。ランダムに生成された開始シーケンス番号が 1 で、クライアントからサーバーに送信されるヘッダー全体とメッセージのサイズが 1000 バイトであると仮定すると、シーケンス番号は 1 ~ 1000 個を占め、32 ビットのシーケンス番号は 1 になります。サーバーがデータを受信した後にクライアントに応答するために、サーバーは32ビットの確認番号1001 で応答します。これは、受信側がバイト シーケンス番号[1, 1000] の データを受信し、あなたからのデータを期待していることを意味します。 1001以降のバイトシーケンス番号のデータを送信します。
32 ビット シリアル番号/32ビット確認番号:シリアル番号はメッセージの番号をマークします。確認番号は確認番号より前のすべてのメッセージの受信をマークし、後続のメッセージは次のシーケンス番号から送信されます。双方向フル ダブルワーカー確認応答メカニズム。
例: サーバーは 6 つのメッセージを受信し、32 ビットのシリアル番号はそれぞれ 1、2、3、5、6、7 です。応答する場合、クライアントに返される確認シリアル番号には 4 を入力する必要があります。説明: 確認番号は、特定のシーケンス番号より前のすべてのメッセージが受信されたことをクライアントに伝えるためのものです。ここではメッセージ番号 4 が受信されていないため、4 を入力して、4 より前のすべてのメッセージが受信されたことをクライアントに伝えます。 4が届かなかった場合は4日から再発行となります。
(2) TCP ヘッダーに32 ビットのシリアル番号と 32ビットの確認番号の 2 セットのシリアル番号があるのはなぜですか? 頻繁にテストする
TCP プロトコルは全二重であるため、メッセージを送信しながらメッセージを受信できます。
説明: サーバーがあなたに応答 (確認シーケンス番号を入力) すると同時に、メッセージ (独自のシーケンス番号を含む) を送信したい場合はどうすればよいでしょうか? ——クライアントは「食べましたか?」( 32ビットのシーケンス番号を記入)をサーバーに送信し、サーバーは「食べました」( 32ビットの確認シーケンス番号を記入)をクライアントに応答します。 、同時に「もう食べましたか?」を送信します (独自の32 ビット シリアル番号を入力します)。
クライアントは、シーケンス番号と相手の確認シーケンス番号を用いて左から右への信頼性を確保し、サーバは自身のシーケンス番号と相手の確認シーケンス番号を用いて右から左への信頼性を確保する。これにより、双方向の全二重確認応答メカニズムが保証されます。
(3)
5.tcp送受信バッファ
(1) TCP には送信バッファと受信バッファがあります。
IO 関数。実際には、これらはすべてコピー関数です。
書き込み/送信関数を使用してデータをカーネル バッファにコピーした後、tcp は適切なタイミングでデータを送信します。カーネルバッファ内のデータをいつ送信するか、どれだけ送信するか、何か問題が発生した場合はどうするか、効率を向上させるための戦略を追加するかどうかは、OS 内の TCP によって決定されるため、TCP は送信制御プロトコルと呼ばれます!
上図からわかるように、バッファの読み取りと書き込みの 1 つのファイル記述子は相互に影響を与えず、TCP 通信が全二重であることがわかります。
(2) 16ビット ウィンドウ サイズ - フロー制御戦略
クライアントがサーバーにデータ パケットを送信するとき、送信が速すぎてサーバーが受信する時間がなくなったらどうなるでしょうか?
—— サーバーの受け入れ能力をクライアントに知らせる必要があります!
1. どのインジケーターがサーバーの受信能力を示しているか受け入れ能力?——受信バッファの残り容量!
2. クライアントはどうやって知るの? ? ——送信時には応答がある! 応答の本質は TCP ヘッダーを含むことです。TCP ヘッダーには、16 ビット ウィンドウ サイズと呼ばれるサーバーの受信能力を保存する属性フィールドを含めることができます。 4. クライアント——>サーバ、サーバ——>クライアント、両方向とも同じ
概要:双方の送信バッファは、相手の受信バッファの受信容量を知っているという条件に基づいて、それぞれに応じてデータ通信を実行します。継続的に更新されるウィンドウサイズにより、定期的に適切なデータサイズを相手に送信する戦略をフロー制御戦略と呼びます。フロー制御ポリシーは両方の方法で機能します。
5. このフロー制御戦略では、16 ビットのウィンドウ サイズを使用して受信能力の属性フィールドを保存しますが、クライアントは、初めてサーバーにデータを送信するときに、サーバーの受信能力をどのようにして知るのでしょうか?
3 ウェイ ハンドシェイク中は、リンクが確立されるだけでなく、ピアに受信能力を通知することも含まれる情報交換が行われます。
(3) tcp テキストの長さはアプリケーション層によって決まります
tcp ストリーミング サービスなので、テキストの長さを考慮する必要はありません。テキストの長さはアプリケーション層自体によって決定される必要があります。たとえば、私たちが作成したエンコードとデコードは、シリアル化された文字列全体に対して実行されます 9\ r\n100 + 200\r\n 抽出長
4. TCP スリーウェイ ハンドシェイク
1 はじめに
TCP スリーウェイ ハンドシェイク: SYN、SYN+ACK、ACK。SYN は接続を確立し、SYN+ ACK は接続を確立して接続を確認します (つまり応答)。3 番目の ACK はクライアントの応答です。
3 ウェイ ハンドシェイクで接続が確立されると、メッセージのペイロードはデータを埋めずに空になります。(スリーウェイハンドシェイク中にリンク確立、リンク確立成功後にデータ通信データ送信を行う)
図中の斜線は時間がかかることを示しています
2. TCP スリーウェイ ハンドシェイクを行う理由
——tcp はコネクション指向だからです。接続する必要がある場合に使用してください。udp には絶対に必要ありません。
3. つながりをどう理解するか?
——多数の接続、OS はこれらの接続を管理する必要がありますが、どのように管理すればよいですか? ?——最初に、組織内で説明します。接続構造オブジェクトを作成し、その構造を維持します。接続の維持にはコスト、時間、スペースがかかります。
4. なぜ 3 回?
(1) 3ウェイハンドシェイクは成功するのか?
--不確か。tcp は信頼性を保証しますが、通信時に相手に送信したデータが相手に確実に受信されることを保証します。ただし、接続の確立が成功するという保証はなく、失敗する可能性があります。
(2) なぜ 1 対 2 の握手ではないのでしょうか?
--できません。ハンドシェイクはSYN が 1 つだけ送信され、接続がすぐに確立されることを意味します。これは攻撃 (SYN フラッド) に対して脆弱です。SYN フラッド: クライアントが意図的に大量の SYN を送信すると、サーバーは対応する接続構造を維持する必要があるため、サーバーは瞬時に完全に占有され、通常の接続が失敗します。2 回目のハンドシェイク(SYN、SYN+ACK) についても同様です。SYN を複数回送信すると、サーバーは ACK 確認をクライアントに送信しますが、クライアントはそれを直接破棄し、費用をかけずに埋められる大量の構造をサーバーに維持させることができます。
(3) なぜ 3 回?
——理由1:ハンドシェイクの回数が奇数であると、接続が正常に確立された後に失われた最後のメッセージのコストがクライアントに転送される可能性があります。最後の確認は、クライアントがサーバーよりも前に接続を確立していることを確認するためにサーバーによって行われます。クライアントが意図的に大量の SYN を送信した場合、サーバーはそれを受信した後、短い半接続で接続構造を維持し、クライアントに SYN+ACK を返します。クライアントは確認のために ACK を受信してサーバーに返す必要があります。クライアントが ACK を受信しない場合、サーバーに ACK を送信することはできません。サーバーが受信しない場合は接続失敗とみなされ、サーバーは ACK を受信しません。短期間の半接続構造をクリアする; クライアントが ACK を受信してサーバーに返す場合、クライアントも自身で接続構造を維持する必要があり、サーバーはクライアントを水の中に引き込みます。クライアントのリソースも減少しているため、サーバーが SYN フラッドでいっぱいになります。これにより、少なくとも 1 つのクライアントが SYN フラッドでサーバーを転覆させることは困難になります (サーバーの攻撃に対する脆弱性を低コストで軽減するため) が、完全に回避できるわけではなく、多数のクライアントが攻撃した場合は不可能です。同時に。
理由 2 : クライアントとサーバーの両方が一連の IO 操作を実行し、最小限のコストで全二重を検証します。
では、クライアントハーフリンクが機能していないのでしょうか?
5. パケットロスの解決策 -タイムアウト再送信メカニズム
(2) データを繰り返し受信し、シリアル番号を重複排除することができます
(3) 残業時間はどうやって決めるのですか?
5. 接続管理の仕組み
1. 4回手を振る
4 回振る:一方がもう一方に FIN 切断要求を送信し、もう一方が応答に ACK を返します。(特別な状況では 3 回のウェーブが発生します。クライアントが FIN 切断要求をサーバーに送信し、相手が ACK で応答し、FIN が 1 に設定されているときに切断したいだけです。クライアントは 3 回目の ACK を送信します。これは 3 回です)
2. 4 つの手を振った状態 (ハンドシェイクを含む)
(1) CLOSE_WAIT セミクローズ状態
受け入れるかどうかに関係なく、クライアントが閉じていてもサーバーが閉じていない限り、サーバーは常に CLOSE_WAIT 状態になります (一方が閉じていて、もう一方が閉じていない、つまりハーフクローズ状態)。 :
(2)TIME_WAIT
接続が維持されている間にサーバーを直接閉じると、サーバーがアクティブに閉じる側となり、アクティブに閉じる側は最終的に TIME_WAIT (4 回の手を振るのが完了) に入り、時間を設定して接続が終了します。この期間が経過すると自動的に閉じます。
一定期間 TIME _WAIT を設定することの重要性:
① 最後の ACK が可能な限り正常に送信されるようにする:クライアントがこの妥当な時間内にサーバーから再送信 FIN を受信しない場合、サーバーは独自の ACK 応答を受信したと見なされます (この妥当な時間内であれば)。期間 に、クライアントはサーバーから再送 FIN を受信すると、送信した ACK 確認応答が失われたと考え、 ACK を再送する必要があります。(詳しくは下記(2)→②で説明します)
①MSL:最大伝送時間、往復は2MSL
②TIME_WAITの時間は なぜ2MSLなのでしょうか?
③TIME_WAIT状態によるバインド失敗の解決方法(ジョブ)
④関数 setsockoptはクラッシュ時に再起動可能
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
sockfd : 設定するソケット ファイル記述子。level : SOL_SOCKET層を設定します。optname : 設定の名前。通常は SO_REUSEADDR。optval: 値。オプトレン: 長さ
3. listen の 2 番目のパラメータ - backlog
リストの 2 番目のパラメーターはバックログと呼ばれ、基礎となる完全に接続されたキューの長さと呼ばれます。アルゴリズムは次のとおりです: n+1 (n はユーザーによって渡された値) は最大で維持できる接続の数を示します受け入れずに。たとえば、2 を渡すと、受け入れずに最大 3 つの接続を維持でき、残りのクライアントが要求した接続はハーフ接続として維持され、フル接続が終了すると、ハーフ接続がフル接続になります。
完全接続維持の意味!
(1) なぜ並ぶ必要があるのですか?
アイドル状態のときにリンクを受け入れて処理することで、サーバーが最下層からリンクを取得できるようにすることができます。プーリング技術に相当し、「接続プール(バッファプール)」を形成します。
(2) 行列が長すぎていけないのはなぜですか?
①長すぎると顧客エクスペリエンスに影響します。
②長すぎるとシステムリソースが占有され、サーバー効率の低下につながる可能性があります。サーバーの効率とサービス能力を向上させるために、長いリンクを維持するためにサーバーにハードウェア リソースを使用させることをお勧めします。