第6章TCPとUDP
ポート番号
ポート番号とは
同一コンピュータ内で通信を行なっているプログラムを識別するときに利用される。
ポート番号の決め方
ウェルノウンポートのように静的に決めるのとOSに任せて動的に決める方法がある。
UPD(User Datagram protocol)
以下のような用途に向いている
総パケット数が少ない通信(DNS, SNMP, etc...)
動画や音声などのマルチメディア通信(即時性が必要な通信)
LANなどの特定のネットワークに限定したアプリケーションの通信
同報性が必要な通信(ブロードキャスト、マルチキャスト)
TCP(Transmission Control Protocol)
パケットが喪失した時の再送制御、順序が入れ替わった場合の順序制御などを行う。
コネクション制御により通信相手が確認された場合のみデータの転送を行う。
送信したデータが受信ホストに到達した時、受信ホストは確認応答(ACK)を行い、データが到達したことを知らせることでデータ到達の信頼性を実現している。
データを転送してもACKが無かった場合に再送する時間を再送タイムアウト時間と言い、TCPではパケットを送信するたびにラウンドトリップ時間(RTT)をその揺らぎを計測し、その合計より少し大きな値を設定する。
ネットワーク環境によってRTTが大きく揺らぐことがあるため、揺らぎまで含めて計測する。
BSD系UNIXやWindowsはタイムアウトを0.5秒単位で制御しているため、タイムアウトの値を0.5秒の整数倍となる。(最初は6秒程度になる。)
再送してもACKが無い場合は再送タイムアウト時間を指数関数的に増やし、特定回数再送を繰り返してもACKが無い場合はネットワークまたは相手のホストに異常が発生していると判断し強制的にコネクションを切断し、アプリケーションに異常終了したことを通知する。
コネクション管理
TCPではデータ通信前にTCPヘッダだけからなるコネクション確立要求パケット(SYNパケット)を送信して確認応答を待つ。
通信が終了した時はコネクションの切断処理を行う(FINパケット)。
最大セグメント長(MSS:Maximum Segment Size)はスリーハンドシェイクの時にお互いのホストがコネクション確立要求を送る際にTCPヘッダにMSSオプションを付け、自分のインターフェースに適したMSSを通知し、両者の値のうち小さい方がMSSとして利用される。
ウィンドウ制御で速度向上
TCPで1セグメントごとにACKを行う通信では、RTTが長くなると通信性能が悪化する。
ウィンドウという概念を取り入れてRTTが長くなっても性能が低下しないようにしている。
1セグメント単位ではなくもっと大きな単位でACKに対処すると転送時間が大幅に短縮される。
送信ホストが送信したセグメントに対するACKを待たずに複数のセグメントを送信することで実現。
ACKを待たずに送信できるデータのサイズをウィンドウサイズという。
大きな送受信バッファを用意し複数のセグメントを並列にACKすることで実現している。
ウィンドウ制御と再送制御
ウィンドウ制御をする時にセグメントが失われたら?
ACKが失われた場合
ウィンドウ制御をしない場合には再送しなければならないが、ウィンドウ制御をする場合にはある程度のACKが失われても再送する必要は無い。
セグメントが失われた場合
次に受信すべきシーケンス番号以外を受け取ったら、今までに受信したデータに対するACKを返す。
送信ホストでは、一度受け取ったACKと同じ物を3回連続で受け取った場合にはそのACKが示すデータを再送する。(高速再送制御)
フロー制御
送信側は受信側の受信能力に合わせてパケット送信量を制御する。
ウィンドウサイズを超えないようにデータを送る。
受信側のバッファが溢れそうになると、TCPヘッダのウィンドウサイズの値を小さくすることでデータ送信量を抑制する。
受信側のバッファがいっぱいになると、送信側は一旦送信を停止し、受信側はウィンドウ更新通知のパケットを送信することで通信が再開される。
このパケットが途中で喪失すると通信が再開できない可能性があるため、送信ホストは1オクテットのデータだけを含むセグメント(ウィンドウプローブ)を時々送信してウィンドウサイズの情報を得る。
輻輳制御
通信開始時にスロースタートというアルゴリズムに従いデータの送信量の制御を行う。
送信側で輻輳ウィンドウを定義し、輻輳ウィンドウを1セグメントに設定してデータパケットを送信し、ACKがあるたびに1セグメントずつ輻輳ウィンドウを大きくしていく。
タイムアウトによる再送時は輻輳ウィンドウは1にしてスロースタートをやり直す。
輻輳ウィンドウが大きくなるほどACKの数が増えるが、その分1つのACKによって拡大される率が小さくなり、1セグメントより小さいオクテット数となるので、結果として輻輳ウィンドウの大きさは直線的に増える。
Nagleアルゴリズム
送信側に送信すべきデータがあってもそのデータが少ない場合には送信を遅らせる処理。
全ての送信ずみデータのACKが確認されているかMSSのデータを送信できる場合のみデータセグメントを送信し、どちらにも当てはまらなければ送信を待つ。
ネットワークの利用効率は向上するが、ある程度の遅延時間が生じる。
ウィンドウシステムや機械制御などにTCPを使う場合には無効に設定する。
遅延確認応答
2 * 最大セグメント長のデータを受信するまでACKをしない。
そうでない場合はACKを最大0.5秒間遅延させる。
ピギーバック
TCPでACKと返事のデータパケットを1つのパケットとして送ること。
その他トランスポートプロトコル
UDP-Lite
チェックサムを計算する範囲をアプリケーションで決めることができるので、部分的にエラーを無視してデータをアプリケーションに渡すことができる。
SCTP(Stream Control Transmission Protocol)
メッセージ単位の送受信
マルチホーミング
複数のストリームの通信
メッセージの生存時間を定義できる
DCCP(Datagram Congestion Control Protocol)
UDPと同様データの到達性に信頼性は無いが、コネクション指向でコネクションの確立・切断処理を持っており、コネクションの確立・切断処理には信頼性がある。
輻輳処理を行うことができ、受信側はACKを返す。
UDPのデータフォーマット
送信元ポート番号
宛先ポート番号
パケットの長さ
チェックサム
TCPのデータフォーマット
送信元ポート番号
宛先ポート番号
シーケンス番号
確認応答番号
データオフセット
予約
コントロールフラグ
ウィンドウサイズ
チェックサム
緊急ポインタ
オプション