これはなに
TCPの勉強をしたので忘れないようにまとめる。
主にヘッダ、コネクション管理、再送制御、順序制御、輻輳制御について書く。
OSI参照モデルの話はみんな書いているので書かない。
今回は順序制御、再送制御編。
参考文献:WEB+DB PRESS plusシリーズ TCP技術入門
https://gihyo.jp/book/2019/978-4-297-10623-2
目次
1.順序制御の概要
2.シーケンス番号の割り振り
3.具体的な順序制御の仕組み
4.再送制御の概要
5.再送タイマーを用いる方法
6.重複ackを用いる方法
7.おわりに
8.参考文献
1.順序制御の概要
ヘッダ編でセグメントにシーケンス番号が振られていることは既に述べた。
このシーケンス番号を使って順番通りにセグメントを送信することを順序制御と言う。
2.シーケンス番号の割り振り
シーケンス番号は0,1,2,…と割り振られているかと思いきや、そうではない。
n番目のシーケンス番号は「n-1番目のセグメントのシーケンス番号+n-1番目のセグメントのデータサイズ」である。
3.具体的な順序制御の仕組み
送信側のシーケンス番号に対して、受信側が「次に受け取るべきセグメントのシーケンス番号」を確認応答番号として返すことで順序制御を行う。
送信側は次のシーケンス番号がわかっているので、想定通りの確認応答番号が返ってきたらセグメントが正しく受信されたことがわかる。
具体例を示す。
AとBが通信をしているとする。
- Aがシーケンス番号1で100バイトのデータをBに送ったとする
- Bは確認応答番号領域に101と書いて応答する
- Aは想定通りの101が返ってきたので次はシーケンス番号101のデータを送信する
やってることは単純。
「次に受け取るべきセグメントのシーケンス番号」を確認応答番号として返すというのがミソ。
後述の再送制御でこの特性を用いるので覚えておいてほしい。
4.再送制御の概要
通信において符号誤りが発生したり、パケットロスなどで正確にデータが届かないことがある。
TCPではそのような場合、失われたセグメントを再び送信する。
これを再送と言う。
TCPでは主に二種類の消失検知を実装している。
- 再送タイマーを用いる方法
- 重複ACKを用いる方法
5.再送タイマーを用いる方法
TCPでは通信が始まるとセグメント送信に対する応答までの時間を継続的に計測する。
これをもとに平均応答時間(RTT)を算出し、RTTを少し超える時間を再送タイマー(RTO)として設定する。
RTOを超えても応答がなかったらセグメントが消失したと判断し再送する。
6.重複ACKを用いる方法
次回に書くがTCPでは複数のセグメントを応答を待たずに送信してもよい。
なぜなら一つ一つ応答を待っていたら効率が悪いからだ。
このとき途中のセグメントが一つ消失したとする。
そうすると消失セグメント以降のセグメントに対する応答は全て消失セグメントのシーケンス番号になる。
なぜなら受信側は「次に受け取るべきセグメントのシーケンス番号」を確認応答番号として返すからだ。
つまり消失セグメントを受信しない限り受信側はなにを受信しても消失セグメントの番号を返し続ける。
この特性を用いて送信側はセグメントの消失を検知する。
具体的には3つ重複ACKを受信したら再送を行う。
7.おわりに
今回は順序制御と再送制御について書いた。
少しづつアルゴリズム的な部分が出てきておもしろいと思う。
次回はTCPの目玉の輻輳制御について書く。
より高度なアルゴリズムが出てくるのでお楽しみに。
次回:未筆
8.参考文献
WEB+DB PRESS plusシリーズ TCP技術入門
https://gihyo.jp/book/2019/978-4-297-10623-2