にしのクエスト2

情報処理技術者試験と資格学校講師の日常

にしのクエスト2

ネスペちゃん01 「TCP」(3)データの送信と再送 その2

前回の続き。

データの転送は、

(1)データをセグメントに区切る。
(2)シーケンス番号をつけて送る
(3)受け取ったらシーケンス番号+データサイズを返信

こんな流れだよ、というのをやった。

f:id:koharuwest:20190608231544j:plain


3WAYが効率的だとはいえ、それでもいちいち確
認応答をしていたらめんどくさいので。

え?それでもめんどくさい?6手が3手になったの
に?


うんめんどくさい。ので、セグメントをまとめてい
くつか送り、まとめて確認応答する仕組みで効率化
することにした。

f:id:koharuwest:20190601223724p:plain


したんだ。


具体的には、


(応答確認)
1 シーケンス番号としてランダムな数字を送信(たとえば10)
2 応答はシーケンス番号に1をプラスして返す(11)


(送信側がまとめて送る)
3 シーケンス番号(11)にデータ(100バイト)を付け送信
4 シーケンス番号(101)にデータ(100バイト)を付け送信
5 シーケンス番号(201)にデータ(100バイト)を付け送信


(受信側がまとめて応答確認)
6 届いた印としてシーケンス番号にデータ量をプラスした値を返す
 (301)


こんな流れなんだけど、それをやると受け取り側がパンクしてバッフ
ァオーバフロー(データがあふれしまって処理できなくなること)を
起こす可能性がある。


なので、確認応答の時に受け取れるサイズ量「ウインドウサイズ」を
事前にやりとりしておく。こんな感じかにゃ?


(応答確認)
1 シーケンス番号としてランダムな数字を送信(たとえば10)
2 応答に1をプラスして返す(11)+ウインドウサイズ(500)


(送信側がまとめて送る)
3 シーケンス番号(11)にデータ(100バイト)を付け送信
  あと400!まだいける!
4 シーケンス番号(101)にデータ(100バイト)を付け送信
  あと300!まだいける!
5 シーケンス番号(201)にデータ(100バイト)を付け送信
  あと200!まだいけるはずだ!どう?


(応答確認)
6 正常に届いていれば、シーケンス番号にデータ量をプラスした値
  を返す(301)
  +ごめん、処理が遅延しててウインドウサイズ(0)ですわ。


7 じゃあ、しばらく待ってから送ろう・・・


なるほど、細かいなあ。


まあ、細かく言えば微妙に・・・なんだけどね。説明のためにわかり
やすく書いてみたにゃー。昔は通信回線が遅く、送信をいかに効率的
に、送信ミスなく送ることが重要視されたのにゃ。


TCPのお話はあと2回あります!より、効率化するスライディング
ウインドウについてやるにゃ。


え?まだやんの?