■ TCPおさらい
しーけんす。
うむ。
しーめんす、はドイツの電機メーカー。▼ link
で?
いやあの、「で?」とか言われましても。
わりと有名ですよね?
で?
それでその。
シーケンスとシーメンスは似てる、と…。
で?
はぅっ。
あはは、おかしいね、と…。
さて、意気揚々と始まった3分間ネットワーキング、第40回だが。
まず、前回のおさらいといこう。
うわ、何事もなかったかのように進められてる。
TCPヘッダをもう一度見てもらおう。
送信元ポート番号(16) | 宛先ポート番号(16) | ||
シーケンス番号(32) | |||
確認応答番号(32) | |||
データオフセット(4) | 予約(6) | 制御ビット(6) | ウィンドウ(16) |
チェックサム(16) | 緊急ポインタ(16) | ||
オプション |
[Table39-01:TCPヘッダ]
前回は、この中の6ビットの制御ビットを使って、事前に通信路を作り出すことをやったわけだ。
制御ビット。
主にSYNとACKとFINでしたっけ。
そうだ。
この事前の通信路の設定方法をスリーウェイハンドシェイクというんだったな。
SYN → ACK+SYN → ACKという流れで、お互いに通信する許可を得るんでしたよね。
うむ。
それにより、お互いが確かに通信可能である、ということを確かめたわけだ。
でした。
よって、今回は実際にデータがどのように送られるか、という話をする。
ここでの最初のキーワードは、シーケンス番号だ。
しーめんす…。
■ MSS
まだ言うか。
くどいぞ、ネット君。
ううぅ。なんか悔しいんです。
悔しがってどうする。
ともかく、シーケンス番号だ。シーケンスは順番、順序の意味がある。
順序?
そうだ。データを送る順序だ。
だが、これの説明をする前に、MSSの話をしておかないとな。
えむえすえす?
うぅ、疑問が解決する前に、さらに疑問が。
TCP/IPでは、データが長い場合は分割して送信する。
これは前も話したよな。
ええっと…。
第38回でそんな話をしてたような。
うむ。
その分割するサイズの事がMSSだ。イーサネットでは、約1460バイトになる。
[Figure40-01:MSS] ▼
切り分けたデータが、セグメントなんですね。
その切り分けた単位でデータを転送する、ということですか。
うむ。そういうことだ。
これが転送一回分ということだな。
ははぁ。
それで、シーメンス番号はどうなったんです?
…。
あぅ、ごめんなさい…。
■ シーケンス番号
ただこのセグメントをバラバラに送ったのでは、TCPの沽券にかかわる。
正確・確実がTCPの謳い文句だからな。
正確、確実ってことは。
バラバラに送らない?
うむ。
元のデータと同じ順序で送る。その時使うのが、シーケンス番号だ。
シーケンスは順番・順序でしたっけ。
データの順番ってことですか。
うむ。
実際には、最初のスリーウェイハンドシェイク時にシーケンス番号を決定する。これは言葉より動きを見たほうが早い。
[Figure40-02:シーケンス番号の決定] ▼
MSSがスリーウェイハンドシェイクで決定されるのはわかりましたけど。
このシーケンス番号やら、確認応答番号やらは何に使うんですか?
そうだな、これだけではちょっとわかりづらいな。
まず、スリーウェイハンドシェイクが終わった段階で、これから使うシーケンス番号と確認応答番号が決定されたわけだ。
はい。
そして、転送するデータに番号をつける。
データの1バイト目がシーケンス番号で決定された値にだ。
先ほどの例でいえば、2001番になる。
[Figure40-03:データとシーケンス番号]
はぁ。
■ 確認応答
うむ。
で、やはり言葉より動きの方が説明しやすいので、そちらで見てもらおう。
[Figure40-04:確認応答]
ははぁ。
第38回で説明していた確認応答で使うんですね。
そうだ。
シーケンス番号は送るデータの先頭バイト番号。確認応答番号は次に送って欲しいデータの先頭バイト番号になる。
ははぁ〜。
[Figure40-05:シーケンス・確認応答の流れ]
流れ的には、上のようになる。
データを分割したとしても、順番に、確実に送るための制御法だ。
ただ、「受け取りましたよ」ではなく。
次にもらう予定のデータの番号まで伝えるのですね。
そうだ。
それによって、受信側がどのデータまで受け取ったかわかる。
どのデータまで受け取ったかわかる。
確かにそうですけど。
うむ。「受け取りました」ではなく、「何番までのデータを受け取りました」と返ってくる。
ものすごく「確実」だろ?
ははぁ、確かに。
この「何番までのデータを受け取りました」は特にフロー制御で重要だ。忘れないよう。
それはそれとして、エラーの場合の説明をしよう。
[Figure40-06:エラー・確認応答の流れ]
このように、データが相手に届かなかった、確認応答が届かなかった際は、再送を行う。
はい、確実に送るための制御でしたね。
そうだ。
ポイントは、同じものをすぐ送るという点だ。
?
当たり前のような気がしますけど?
そうかな?
とりあえず、順番に送っておいて、後で確認応答がなかったデータだけ送りなおす、でもいいはずだ。
あ〜、そうですね。
そう言われれば、それでもいいような気がしますね。
そうだろう。だが、そうしない。
それは、元のデータ順に送るためだ。
ははぁ。
TCPの謳い文句、「正確・確実」の「正確」のためですね?
うむ、その通り。
ちなみに、一定時間待つってのはどのぐらい待つんですか?
これはRTTという値から判断する。
RTTは、これまで送ったデータに対し、確認応答が返ってくるまでにかかった時間から算出する。
はぁ。なんか論理的におかしいような。
確認応答が返ってくるのにかかった時間から算出って、いきなり返ってこなかったらどうするんですか?
うむ。
初期値を約3秒にしておき、その後確認応答が返ってくるのにかかった時間から動的に変更する。
3秒なら3秒でいいじゃないですか。
確かにそうだが。
だが、回線のスピード。例えば64Kbpsでの3秒と、100Mbpsでの3秒は同じ3秒での意味合いが違うだろう?
あぁ、なるほど。
遅い回線なら3秒待つのは普通でも、早い回線では3秒も待たなくてもいいってことですか。
そうだ。
早い回線なら3秒もまたなくても、データの損失・確認応答の損失に気がつくわけだ。「今まで最低でも500μ秒で帰ってきてたのに、おかしい」というようにな。
なるほど。
さて、今回は普通に送った場合の話だった。
次回はもうちょっと複雑になる。
複雑…、ですか。
大丈夫だ。
ネット君ならわかる。
そうですか?
えへへ。
露骨なおだてにひっかかったところで、また次回。
いい気分のまま終わらせてくださいよ。
3分間ネットワーキングでした〜♪
- ドイツの電機メーカー
- シーメンス[simens]のこと。
- シーケンス
-
[sequence]
シークエンス、とも言う。
- MSS
-
[Maximum Segment Size]
最大セグメント長。
- MSSのサイズ
-
平均的なイーサネットの場合、最大パケット長(MTU)は1500バイト。
ここから、IPヘッダ(20バイト)、TCPヘッダ(20バイト)を引いて、1460バイト。
- ランダムに決定される
-
シーケンス番号・確認応答番号ともに、32ビット。
つまり0〜42億9496万7296の中から任意。
- RTT
- [round trip time]
- ネット君の今日のポイント
-
- 大きいデータは分割して転送する。
- 分割するサイズのことをMSSという。
- 転送されるデータには順番に番号がつけられる。
- データを転送する際には、シーケンス番号に送るデータの先頭番号を入れる。
- 確認応答を送る際には、確認応答番号に次に受け取る(予定の)データの先頭番号を入れる
- 転送エラーが発生した際には、今送ったものと同じものを送る。
- エラーが起きたかどうかは、確認応答が一定時間(RTT)返ってこなかったことによって判別する。
- 参考リンク
-
- シーメンス 日本法人http://www.siemens.co.jp/▲