7日目:TCP:コネクション型伝送、TCP:信頼性の高いデータ伝送、TCP:フロー制御、TCP:接続管理

いい加減にして!ボジを盗む

今日見た詩は灰色です

空は灰色、
道路は灰色、
建物は灰色、
雨は灰色、
死んだ灰の中で、
2人の子供が通り過ぎ、
1人は真っ赤もう1人は
薄緑-
「感じ」1980年7月


ポイントへ

1. TCP:コネクション型通信

1. TCP:概要(RFC:793、1122、1323、2018、2581)

ここに画像の説明を挿入します

説明:

いわゆるメッセージなしの境界
送信者は2つの小さなメッセージを送信し、受信者は1つの大きなメッセージを受信するか、またはその逆です。
送信バッファと受信バッファ
タイムアウト再送信またはエラー検出再送信の場合、送信速度と受信速度の一致に一貫性がありません

MTU:
最大伝送ユニット、最大データ伝送ユニット、最大ネットワーク伝送パケット。最大イーサネットMTUは1500B
です
。MSS 最大セグメントサイズアプリケーションプロセスは、トランスポート層のTCPエンティティに配信されたセグメント、及びTCPセグメント(セグメント)にMSSのTCPヘッダ情報のサイズに応じてセグメント化される処理

したがって、(メッセージはバイトストリームに変換し、そして個々のMSSに分割)
MSS + TCPヘッダー情報+ IPヘッダー情報<= MTU(Ethernet MTU1500Bなど)、(「断片化に問題はありませんか?」どの断片化...)

それ以外の場合、IPデータグラムが送信されるデータリンクレイヤーのMTUが大きいため、データグラムを送信できません。
このネチズンの共有も参照できます:MSSとMTUの関係


2.TCPセグメント構造

ここに画像の説明を挿入します

説明をしてください:
16
ビットの送信元ポート、16ビットの宛先ポート、32ビットのシリアル番号、確認番号。
したがって、スマートで同じことが得られます:オプションの32ビット;チェックサムなど16ビット
バイトシーケンス番号:
アプリケーション層がメッセージに引き渡すために、各層のMSSと各TCPセグメント(セグメント)の本体を分割しますこの部分はペイロード部分(MSSに対応)であり、バイトストリーム全体のペイロードの最初のバイトのオフセット(オフセット)はバイトシーケンス番号です。

3. TCPシリアル番号、確認番号

ここに画像の説明を挿入します

受信者が順不同で処理するセグメントは、キャッシュまたはドロップすることができ、規制はありません。に応じて...
ここに画像の説明を挿入します
説明:

  • ホストA→ホストBSeq = 42、ACK = 79、データ= 'C':
    ホストA、ネゴシエートされた初期シーケンス番号はSeq = 42であり、ホストBの初期シーケンス番号は79から始まり、バイトCはエコーする必要があります
  • 次に、ホストB→ホストA Seq = 79、ACK = 43、データ= 'C':
    ホストBは以前にSeq42を受信したため、処理後にACK = 43を確認します。同時に、ACK = 43は、ホストBが42以前を受信したことを意味し、ホストAが43から開始することを期待しています。
    …それだけです

4. TCPラウンドトリップ遅延(RTT)とタイムアウト

RTTを適切に設定し、測定/推定します。

  • Q:TCPタイムアウトを設定するにはどうすればよいですか?
    RTTより長いしかしRTTの変化
    短すぎる:タイムアウトすぎる不要な再送信
    長すぎるセグメント損失に反応するには遅すぎる、マイナス

  • Q:RTTを見積もる方法は?
    SampleRTT:メッセージセグメントが送信されてから確認を受信するまでの時間を測定します
    再送信がある場合は、この測定を無視し
    ますSampleRTTが変更されるため、推定RTTはよりスムーズになります
    現在のSampleRTT

TimeoutIntervalは、適応測定と計算され
ここに画像の説明を挿入します
、現在EstimatedRTT計算:
`

" EstimatedRTT =(1-α)EstimatedRTT + αSampleRTT ":
等号左側は現在の平均RTTであり、等号の右側の推定RTT最新の平均RTTです。他のすべてのサンプリングの前時間、もう1つ(1-α)、現在の平均への寄与は指数関数的に減少します。
`
推定:調整推定。
ここに画像の説明を挿入します
このDevRTT(偏差RTT)は、標準偏差と非常によく似ています。これは、SampleRTTとEstimatedRTTの間の偏差/変化値です
。DevRTT=(1-β)DevRTT +β(| SampleRTT-EstimatedRTT |):平滑化された値の差を計算します。 RTTと実際の(加重)移動平均)


次に、RDTを実行しているTCPを見てください

2. TCP:信頼性の高いデータ転送

TCPはIPの信頼できないサービスに基づいてrdtを確立しました

  • パイプラインセグメント(•GBNまたはSR)
  • 累積確認(GBNなど)
  • 単一の再送信タイマー(GBNなど)
  • 順不同で受け入れることができますか、標準はありません

再送信は、次のイベントによってトリガーされます

  • タイムアウト(最も早い未確認のセグメントのみが再送信されます:SRのように)
  • 繰り返し確認
    • 例:ACK50を受信した後、3つのACK50を受信した(冗長確認応答)

まず、簡略化されたTCP送信者について考えます:(以下のポイント1)

  • 繰り返しの確認を無視する
  • フロー制御と輻輳制御を無視する

1. TCP送信者(簡略版

次の図についての私の説明:

最初に、TCP接続を確立します。点線から始めて、初期化次のシーケンス番号とSendBase、そこにある
(最初の送信者として、最初のバイトのシーケンス番号て送信は、初期シーケンス番号からです)

次に、イベントを待ち
その後、時計回りに見ては
したがって、待機が始まり、アプリケーションプロセスがデータに到達し、セグメントを作成して、ウィンドウのフロントシーケンスを送信します。
次に、下位層を見つけて、IPカプセル化データグラム
送信の最前線のスライディングウィンドウを送信します:NextSeqNum NextSeqNum + = length(Data)
はカウントされず、タイマーが開始されます

タイムアウトの場合、SRのような未確認のセグメントの最小数のみを送信
します、一度にすべての未確認のものを渡すのではありません
`
ACKを受信し、ACKの値がyの
場合、y> SendBaseの場合、SendBase = yです。これは
送信ウィンドウの後端を位置yにスライドするの同じ
です。タイマー操作用のタイマー、写真を見てください
ここに画像の説明を挿入します


1.1TCP送信者イベント:(上の図の説明へのppt)

アプリケーション層からデータを受信します。

  • nextseqでセグメントを作成する
  • シーケンス番号nextseqは、メッセージセグメントの最初のバイトのバイトストリーム番号です。
  • 実行されていない場合は、タイマーを開始します
    • タイマーは、最も古い未確認のセグメントに関連付けられています
    • 有効期限間隔:TimeOutInterval

タイムアウト:
再送信後の最も古いセグメント
タイマーを再起動します

確認の受領:

  • 未確認のセグメントを確認する場合
  • 確認されたメッセージのシーケンス番号を更新しますまだ確認されていないメッセージセグメントがある場合は、タイマーを再起動します
    ここに画像の説明を挿入します

1.TCPの送受信画像を実現するための擬似コードを楽しみましょう

	NextSeqNum = InitialSeqNum
	SendBase = InitialSeqNum
	loop (forever) {
    
    
		switch(event) 
		event: data received from application above 
			create TCP segment with sequence number NextSeqNum 
			if (timer currently not running) 
				start timer 
			pass segment to IP 
			NextSeqNum = NextSeqNum + length(data) 
		event: timer timeout
			retransmit not-yet-acknowledged segment with smallest sequence number start timer 
		event: ACK received, with ACK field value of y 
			if (y > SendBase) {
    
     
				SendBase = y
			if (there are currently not-yet-acknowledged segments) 
				start timer 
				} 
	} /* end of loop forever */
	
	/*注释:• SendBase-1: 最后一个累积确认的字节例:
			• SendBase-1 = 71;
			y= 73, 因此接收方期望73+ ;
			y > SendBase,因此新的数据被确认
 	*/

最後に、別の画像に移動
して、順番に受信した最上位バイトを確認します。
ここに画像の説明を挿入します


2. TCPACKを生成するための推奨事項[RFC1122、RFC 2581]

ここに画像の説明を挿入します

3.高速再送信

高速再送信:タイマーが切れる前にメッセージセグメントを再送信します


繰り返しのACKによるメッセージセグメントの損失の検出

  • 送信者は通常、多数のセグメントを継続的に送信します
  • メッセージセグメントが失われると、通常、複数のACKが繰り返されます(受信されます)。

送信者が同じデータに対して3つの冗長ACKを受信した場合(下図に示すように3つの冗長ACK50)、

  • シーケンス番号が最小のセグメントを再送信します。
  • 確認されたデータに続くデータが失われたものと想定

ここに画像の説明を挿入します
ここに画像の説明を挿入します
•最初のACKは正常です。
•このセグメントの2番目のACKが受信されます。これは、受信者がこのセグメントの後にシーケンス外のセグメントを受信したことを意味します。
このセグメントの3番目と4番目のACKが受信されたことを意味します。レシーバーこのセグメントを受信した後、2つまたは3つのシーケンス外のセグメントが失われる可能性が非常に高くなります

3.1高速再送信アルゴリズム:

ここに画像の説明を挿入します

dup:重複:形容詞まったく同じ、冗長

3、TCP:フロー制御

受信者は送信者を制御し、受信者のバッファがオーバーフローするの

防ぐために送信者が送信しすぎたり速すぎたりすることを許可しません

ここに画像の説明を挿入します
TCPソケットレシーバーバッファー:TCPソケットレシーバーバッファー
ここに画像の説明を挿入します

その場合、TCPは全二重であるため、次のようになります。

  • 受信者は、 TCPセグメントヘッダーのrwndフィールドにある空きバッファサイズ送信者に「アドバタイズ」します
    (個別の確認メッセージではなく、エクスプレスボックスの小さなマーク「空きバッファスペース」)
    • RcvBufferサイズはソケットオプションによって設定されます(通常のデフォルトサイズは4096バイトです)
    • 多くのオペレーティングシステムは、RcvBufferを自動的に調整します
  • 送信者は受信者が圧倒されないように、未確認(「実行中」)バイト数
    受信者から送信されるrwnd値を制限します。

受信ウィンドウと受信バッファを確認します(受信ウィンドウ&&受信バッファフィールド)
ここに画像の説明を挿入します


4、TCP:接続管理

正式にデータを交換する前に、送信者と受信者は握手して通信関係を確立します。

  • 接続を確立することに同意します(各当事者は、相手が接続を確立する意思があることを知っています)
  • 接続パラメータに同意する
    ここに画像の説明を挿入します

1.接続を確立することに同意します

ここに画像の説明を挿入します

双方向ハンドシェイクの失敗シナリオ:
半接続、
左側のクライアントホストプロセスは、acc_conn(x)タイムアウトにより、新しい接続要求(req_conn(x))を再送信
し、サーバーホストプロセスが半接続を維持する結果になります
ここに画像の説明を挿入します

2. TCP 3ウェイハンドシェイク(2ウェイハンドシェイクソリューション)

TCPにはフラグビットSYNがあります。
SYN = 1は接続要求を表します
Seq = xはxバイトからの送信を表します
ここに画像の説明を挿入します

通常、最初のデータ転送と3番目のハンドシェイクは一緒に行われます。

2.1スリーウェイハンドシェイクソリューション:半分の接続と古いデータの受信の問題

ここに画像の説明を挿入します

固定シーケンス番号ではなく、TCPセグメントのシーケンス番号として初期化シーケンス番号を使用します
これにより、古い接続のデータ新しい接続のデータ干渉するの
効果的に回避できます。



2.2スリーウェイハンドシェイク:FSM(有限ステートマシン)

いくつか送って見てください〜
ここに画像の説明を挿入します

3.TCP:接続を閉じます

  • クライアントとサーバーはそれぞれ独自の側で接続を閉じます(両方向の接続は別々に削除されます)
    FINビット= 1でTCPセグメントを送信します(FIN = 1は接続を閉じることを意味します)
  • FINを受信したら、ACKで応答し
    ます。FINセグメントを受信すると、ACKはそれ自体が送信するFINセグメントと一緒に送信できます。
  • 同時FIN交換を処理できます

面白いことがいくつかありますが
、FINの確認が届かない場合はどうなりますか?
FINがまったく通過できない場合はどうなりますか?
誰かがFINを偽造して相手に送信した場合はどうなりますか?
ハハハ

TCP接続の解放は完全はなくタイマーメカニズムを使用して接続を切断します。
ここに画像の説明を挿入します


この記事の終わり

おすすめ

転載: blog.csdn.net/m0_46156900/article/details/113826344