ネットワークって。。。#22(TCPとUDP)
今回は、TCPの話。。。
前回のUDPとは違って、盛り沢山なので、複数回に分けて、解説していきます。
TCPの目的と特徴
TCPは、Transmission Control Protocolの略で、その名の通り、伝送、送信、通信を制御するプロトコルです。
通信の信頼性を確保するには、データの破損や喪失、重複、順序の入れ替わりなどを防がなければなりません。
例えば、読書。。。
あるページが破れていたり、ページが抜けていたり、同じページが繰り返されてたり、ページが入れ替わってたり。。。
これじゃ、まともに読めませんよね。。。
そんな感じです。。。多分笑
TCPでは、これらの問題を解決するために、色々な仕組みが提供されています。
確認応答
TCPでのネットワーク通信の際は、送信したデータが受信側に到達すると、受信側は、送信側にデータが到達したことを知らせます。(確認応答)
受信側が、正常に受信できた場合は、肯定確認応答(ACKっていいます)、受信できなかった場合は、否定確認応答(NACKっていいます)を送信します。
例えば、会話のなかで、、、
話の区切りで、納得したら、相槌を撃ちますよね。これがACK、
理解できなかったり、聞き取れなかったりすると、もう一度話を求めますよね。これがNACKのイメージです。。。
更には、何も反応が返ってこなかったら、話し側は、もう一度同じ話をしようとしますよね。
TCP通信でも、一定時間、ACKもNACKも返ってこない場合、もう一度同じデータを送信します。
シーケンス番号
まず、データ通信はパケットとかセグメントという単位で行われます。
ちなみに、ネットワークって。。。#4で述べた、レイヤ3(ネットワーク層)で、パケットという単位、レイヤ4(トランスポート層)で、セグメントという単位で通信が行われます。
1つのデータを一度に送れればいいのですが、データ量が大きい場合など、一度に送れないのが一般的で、いくつかの単位(パケット、セグメント)に分けて送信が行われます。
例えば、引越しの時。。。
1つの馬鹿でかいダンボールに全ての荷物を入れるのではなく、いくつものダンボールに分けて荷物を入れて、運びますよね。
この1つ1つの段ボールが、パケットとかセグメントとかいうイメージです。。。
で、TCP通信する際は、セグメントという単位に分けて送信するので、順番を間違えたりしないように、通信の信頼性を保証する必要があります。
また、送信したデータが届いているのに、ネットワークが混んでいたりして、ACKもNACKも返ってこなくて、再送した場合に、データの重複を防がなければなりません。
これらの通信品質を保証するのが、シーケンス番号です。
シーケンス番号は、データ送信が発生するごとに、1ずつカウントアップされていきます。
データ送信、確認応答には全てシーケンス番号が含まれており、順番保証や再送制御、重複制御が行われます。
送信側が、シーケンス番号:1000で送信すると、受信側は、次のシーケンス番号:1001を付けて確認応答します。
もし、この確認応答が送信側に届かない場合は、送信側はもう一度、シーケンス番号:1000のデータを送ってきます。受信側は、すでにシーケンス番号:1000のデータを受信しているので、このデータを破棄し、再度、次のシーケンス番号:1001を付けて確認応答します。
こんな感じで、TCP通信では、このシーケンス番号を見て、送信側、受信側は、通信が正常であることを確認します。
再送タイムアウトの決定
前章で、TCP通信では、一定時間、ACKもNACKも返ってこない場合、もう一度同じデータを送信しますと述べました。
この一定時間が、再送タイムアウト時間です。
再送タイムアウト時間といっても、ネットワークの環境や、その時の混み具合によって、早かったり、遅かったり、環境によって変える必要があるような気がしますよね。
では、この再送タイムアウト時間、どうやって決まっているのでしょうか?
TCPでは、そういった環境の違いなどに対応するため、通信するたびに時間を計測し、動的に再送タイムアウト時間を計算しています。
具体的には、ラウンドトリップ時間(RTT:Round Trip Time)と呼ばれる、通信にかかる往復時間と、その揺らぎ時間(複数回の通信のラウンドドリップ時間の差)を合計した時間よりも少し大きな値を再送タイムアウト時間としています。
で、この再送タイムアウト時間。。。
1回目の再送タイムアウト時間です。
つまりは、1回再送してもまだ応答がない場合、2回目の再送では、再送タイムアウト時間は2倍、それでもまだ応答がない場合は、更に2倍(元の再送時間の4倍)と指数関数的に増やしていきます。
ただし、再送は無限に繰り返されるわけではなく、特定の回数(リトライ回数)、再送しても応答がない場合は、通信が異常と判断し、強制的に通信のコネクションを切断します。
子供の頃にこんな経験がありました。。。
学校から帰ってきた時、母親が買い物に出かけてて、家には誰もいなくて。。。
ピンポン押しても、応答がなく、、、しばらく経って、再びピンポン押して、、、やっぱり応答がなく、、、それを何度か繰り返して、、、そして諦めて友達の家に行きました。
後日、同じようなことが何度かあり、繰り返しているうちに、何秒経って、応答がなかったら誰もいないと判断できるようになりました笑
送信タイムアウト時間と再送って、こんな感じです。。。多分笑
まとめ
- TCPは、Transmission Control Protocolの略で、データの破損や喪失、重複、順序の入れ替わりなどを防ぎ、伝送、送信、通信を制御するプロトコル。
- TCPでのネットワーク通信は、送信したデータが受信側に到達すると、受信側は送信側にデータが到達したこと(確認応答)を知らせる。
- TCPのデータ送信、確認応答には全てシーケンス番号が含まれており、順番保証や再送制御、重複制御が行われ、通信品質を保証する。
- TCPでの再送タイムアウト時間は、ラウンドトリップ時間(RTT:往復時間)+揺らぎ時間+αで動的に計算される。
今回は、以上になります。
最後まで読んで頂き、ありがとうございました。
【参考書籍】