JavaScriptをがんばるブログ

React,OSS,ソフトウェア開発が中心のブログです👨‍💻

マスタリングTCP/IP: UDPとTCP

自分用の読書メモです。 ここからトランスポート層に入ります。

6.3 UDP

6.3.1 UDPの目的と特徴

  • UDPはUser Datagram Protocolの頭文字
  • UDPは複雑な制御は提供せず、IPを用いてコネクションレスの通信サービスを提供する
  • アプリケーションから送信要求のあったデータを送信要求のあったタイミングで、そのままネットワークに流す
  • UDPはネットワークが混雑していても送信量を抑制するようなふくそうを回避する制御を行わない
  • パケットの到着順序が入れ替わったとしても直す機能が無い
  • これらの制御が必要なときには、UDPを利用するアプリケーションプログラムが行わなければならない
  • UDPは「アプリケーションを作ったユーザーの言うがままのプロトコル」と言う事が出来る
  • UDPコネクションレスのためいつでもデータを送信する事が出来る
  • UDPプロトコル自体の処理も簡単なため高速に動作する
  • UDPヘッダ http://www.infraexpert.com/study/tcpip12.html

次のような用途に向いている

  • 総パケット数が少ない通信(DNS, SNMPなど)
  • 動画や音声などのマルチメディア通信(即時性が必要な通信)
  • LANなどの特定のネットワークに限定したアプリケーションの通信
  • 同報性が必要な通信(ブロードキャスト、マルチキャスト)

6.4 TCP

  • UDPは複雑な制御は行わず、コネクションレスな通信サービスを提供するものだった
  • 言い換えれば、アプリケーション側に制御を任せ、トランスポートプロトコルとしては最低限の役割だけを果たすプロトコル
  • これに対してTCPはTransmission Control Protocolという名のとおり、「伝送、送信、通信」を「制御」するプロトコルと考える事が出来る
  • TCPUDPと事異なり、データを送信するときの制御機能が充実している
  • ネットワークの途中でパケットが喪失した場合の順序制御など、UDPでは行われ無い制御を行う
  • TCPにはコネクション制御があり、通信相手がいるかどうか確認されている場合にのみデータが送信されるため、無駄な通信を抑制できる
  • TCPのこのうような機能により、IPというコネクションレス型のネットワーク上で、信頼性の高い通信を実現する事ができる
  • http://atnetwork.info/tcpip/tcpip29.html

コネクション

  • 各種の機器や回線、あるいはネットワークの中で通信を行う2つのアプリケーションが情報の伝達のために保有して使用する仮想的な通信路
  • 一度コネクションを確立すると、通信を行うアプリケーションはこの仮想的な通信路を使って情報を送受信するだけで、情報伝達の保証を得る事になる

6.4.1 TCPの目的と特徴

6.4.2 シーケンス番号と確認応答で信頼性を提供

  • TCPでは、送信したデータが受信ホストに到達したとき、受信ホストは送信ホストにデータが到達した事を知らせます
  • これを確認応答(ACK)という
  • 通常、2人で会話をする場合には、話の区切り毎に相槌を打つ
  • 相手が何も返さ無い場合、話者はもう一度同じ話をして、相手にちゃんと話を伝えようとする
  • 相手が話の内容を理解しているか、相手にちゃんと伝わっているかを、相手の反応で判断する
  • 確認応答は会話の相槌に相当する
  • 話が伝わった場合に、「うん、うん」と肯定的に返事を返す事を肯定確認応答(ACK)という
  • 「えっ?」と言って、わからなかったり聞こえなかったりしたことを相手に伝える事を否定確認応答(NACK)という
  • TCPの場合には、肯定確認応答(ACK)でデータ到達の信頼性を実現する
  • データを送信したホストはでーたの送信後にこの確認応答を待つ
  • 確認応答があれば、データは相手のホストに到達したことになる
  • もし確認応答が戻ってこなければ、データが喪失した可能性がある
  • ある一定時間内に確認応答が返って来ない場合にはデータが喪失したと判断してもう一度同じデータを送信する
  • データが途中で失われても再送によりデータを届ける事ができ、信頼性のある通信が可能になる
  • 確認応答が来ないのはデータが喪失したときだけとは限らない
  • データは届いたが、それを伝える確認応答パケットが途中で失われた場合にも確認応答は戻って来ない
  • なんらかの理由で確認応答パケットが到着するまでに遅延が生じ、データパケットの再送後に確認応答パケットが到着する場合がある
  • 同じデータを重複して受信してしまう事になってしまう
  • 受信済みのデータを識別し、必要かどうかを判断する必要がある
  • これらの確認応答処理や、再送制御、重複制御などは、すべてシーケンス番号を使って行われる
  • シーケンス番号は、送信するデータ1オクテット毎に付けられる連続した番号
  • シーケンス番号の初期値 は0から始まるわけではなく、コネクションの確立時 に乱数で決める。以降はオクテットごとに1ずつ加算する
  • 受信側では、受信したデータパケットのTCPヘッダに書き込まれているシーケンス番号とデータ長を調べ、次に自分が受信すべき番号を確認応答として返送する
  • シーケンス番号と確認応答番号を使うことで、TCpでは信頼性のある通信を実現する

6.4.3 再送タイムアウトの決定

  • 再送せずに確認応答の到着を待つ時間を再送タイムアウト時間という
  • これを経過しても確認応答が到着しなかった場合データを再送する
  • 理想的な再送タイムアウト時間は「この時間が経過したら確認応答が返ってくることはない」といえる最小単位
  • この時間はネットワーク状況にによって変わってくる
  • 高速な回線だと短くなり、遅い回線だと長くなる
  • 混雑度によっても適正時間は変化する
  • TCPではパケットを送信するたびにラウンドトリップ時間と、その揺らぎを計測する
  • Round Trip Time RTT 往復時間のこと
  • 計測したラウンドトリップ時間と揺らぎの合計より少し大きな値を再送タイムアウト時間にする
  • ラウンドトリップ時間だけでなく、揺らぎまで考慮して再送タイムアウトを決 定するのには理由がある
  • ネットワークの環境によってはラウンドトリップ時間が大きく揺らぐことがあるから
  • 長い方に合わせる必要がある
  • これは到着するパケットが別々の経路を通って流れる時などに発生する
  • TCP/IPではできるだけ無駄な再送を行われないように制御してる
  • BSD系のUNIXWindowsなどは、タイムアウトを0.5秒単位で制御している
  • そのためタイムアウトの値は0.5秒の整数倍になる(ゆらぎの最小値も0.5秒になるため、最小再送時間は1秒になる)
  • ただし、最初のパ ケットはラウンドトリップ時間が分からないので、初期値は 6 秒程度
  • 再送しても確認応答されない場合には、もう一度送信
  • 確認応 答を待つ時間を 2 倍、4 倍と指数関数的に増やす
  • データの再送を無限に繰り返すことはしない
  • 特定の回数再送を繰り 返しても確認応答がない場合には、ネットワークや相手のホストに異常が発生し ていると判断し、強制的にコネクションを切断する
  • そして、アプリケーショ ンに、通信が異常終了したことを通知

6.4.4 コネクション管理

  • TCP はコネクション指向の通信を提供
  • コネクション指向では、デー タ通信に先立って、通信相手との間で通信を始める準備をしてから通信を行う
  • UDPコネクションレスなので、相手に通信してよいかどうかの確認を求 めることなく、いきなり UDP パケットでデータを送信する
  • これに対して、TCPはデータ通信前にTCPヘッダだけからなるコネクション確立要求のパケット(SYN パケット)を送信して確認応答を待つ
  • 相手から確認応答が送られてきた場合にはデータ通信が可能になるが、確認応答が送られてこなければ、データ通信を開始することはできない
  • また、通信が終了したときにはコネクションの切断処理を行う(FINパケット)

6.4.5 TCP はセグメント単位でデータを送信

  • TCP ではコネクションの確立時に、通信を行うデータ単位を決定する
  • これを最大セグメント長(MSS:Maximum Segment Size)と呼ぶ
  • 理想的 な最大セグメント長は、IP で分割処理されない最大のデータ長になる
  • TCPでは大量のデータを送信するときに、このMSSの値ごとにデータが区切られて送信される。また、再送処理も基本的にはMSS単位で行われる
  • MSS は、スリーウェイハンドシェークのときに、送受信のホスト間で決めらる
  • お互いのホストは、コネクション確立要求を送る際に、TCP ヘッダに MSS オプションを付け、自分のインタフェースに適したMSSを通知する
  • 両者の値のうち、小さいほうの値が MSS として利用される

6.4.6 ウィンドウ制御で速度向上

  • 一度に送信できるセグメント数
  • わんこそばみたく一杯づつ食べて盛って、ではきついよね?
  • 4杯つづ盛って渡してあげよう
  • jsonみたいな小さなファイルを並列ダウンロード https://twitter.com/Hiraku/status/692727959417819136

6.4.7 ウィンドウ制御と再送制御

  • 順番が逆
  • 3回同じ確認応答を受け取った場合に再送を行う「高速再送制御」
  • これのおかげで確認応答が失われても無駄な再送をしなくて済むようになっている

6.4.8 フロー制御(流量制御)

  • 受信側の受信能力に合わせてパケットを送信する
  • 受信側がウィンドウサイズをサイズを教えるので、それに沿ってデータグラムを送る

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版