このページでは、TCPの3ウェイハンドシェイク・シーケンス番号・ウィンドウ制御と、UDPの特徴、ポート番号によるアプリケーションへの振り分けがわかります。
- 一言で言うと:
- 「届けるだけ」のIPを補って、確実に届ける(TCP)か、速さを優先する(UDP)かを選ぶ層の話
- もう1つの役割は、ポート番号で、ノードの中のどのアプリケーションに渡すかを決めること
確実に届ける(TCP・TCPヘッダ・3ウェイハンドシェイク)→ 速く届ける(UDP)→ アプリに渡す(ポート番号によるアプリケーション間の通信)
覚え方の軸
- TCPとUDPは「書留郵便か、普通郵便か」
- TCPは、コネクション型。届いたか確認し(ACK)、順番をそろえ(シーケンス番号)、落ちたら再送する。確実だが遅め
- UDPは、コネクションレス型。確認も再送もしない。速いが、信頼性は低い
- TCPは「始めに3回あいさつ」
- SYN → SYN+ACK → ACK の3ウェイハンドシェイクでコネクションを作る
- TCPヘッダの3つの番号は「何番目か・次は何番か・いくつまとめて送れるか」
- シーケンス番号(何番目のデータか)、ACK番号(次に受け取るべき番号)、ウィンドウサイズ(ACKなしで続けて送れる量)
- 使い分けは「全部確実に届く必要があるか」
- TCPは、HTTP、FTPなど(1文字でも欠けたら困る)
- UDPは、DHCP、NTP、SNMPなど(短いやりとり、多少落ちても困らない、速さ優先)
TCPとUDP:確実に届けるか、速く届けるか(★)
- トランスポート層:
- IPを補い、データ送信の品質や信頼性を上げるための層
- プロトコルには、TCPとUDPがある
① TCP
- TCP:
- 下位層のIPは、データ通信の安全性を保証しないコネクションレス型通信
- その補完のために、送達管理、伝送管理の機能を持ったコネクション型プロトコル
- TCPを使うプロトコル:
- HTTP、FTPなど、データがすべて確実に伝わることが求められるプロトコル
- TCPヘッダの項目:
- 送信元ポート番号、宛先ポート番号、シーケンス番号、ACK番号、データオフセット、予約、コードビット、ウィンドウサイズ、チェックサム、緊急ポインタ、オプション(可変長)、パディング
TCPヘッダの主な項目(★)
| 項目 | 中身 |
|---|---|
| シーケンス番号 | TCPスタックが上位層から受け取ったデータが、MSS(受信可能な最大セグメントサイズ)より大きい場合は、TCPセグメントの最大長に収まるように分割する。シーケンス番号は、分割前のどの部分だったかを表す数値 |
| ACK番号 | ACK応答のときに使う、次に受信すべきシーケンス番号 |
| ウィンドウサイズ | 受信ノードからの確認応答(ACK)なしで、連続して送れるデータ量。大きくすると伝送効率が上がるが、受信ノードの能力によってはオーバフローなどの弊害も出る |
- シーケンス番号の例え:
- 長い手紙を何枚かに分けて送るときの「ページ番号」。順番がばらばらに届いても、並べ直せる
- ACK番号の例え:
- 「3ページまで受け取ったよ。次は4ページをちょうだい」の「4」
- ウィンドウサイズの例え:
- 「返事を待たずに、まとめて何ページまで送ってよいか」。多いほど速いが、受け手の机(バッファ)からあふれると困る
- チェックサムの対象:
- IPヘッダのチェックサム(ヘッダチェックサム)の対象は、ヘッダ部分だけ
- TCPヘッダとUDPヘッダのチェックサムの対象は、データ部分も含む
例題(ウィンドウサイズと速度)
- 問題:
- ウィンドウサイズが64,000バイト、往復の時間(送ってからACKが返るまで)が20ミリ秒のとき、最大でどれだけの速度で送れるか
- 考え方:
- ACKを待たずに送れるのは、往復1回あたり64,000バイトまで
- 速度 = ウィンドウサイズ ÷ 往復時間
- 答え:
- 64,000バイト × 8 = 512,000ビット
- 512,000ビット ÷ 0.02秒 = 25,600,000ビット/秒 = 25.6Mbps
- 検算:
- 25.6Mbps × 0.02秒 = 512,000ビット = 64,000バイトで、元に戻る
- わかること:
- 回線がどれだけ速くても、ウィンドウサイズが小さいと、遠い相手(往復時間が長い)とは速く通信できない
② TCPでのコネクション確立(3ウェイハンドシェイク)
- 3ウェイハンドシェイク:
- TCPでコネクションを確立するために、コネクションの確立要求パケット(SYN)と確認応答パケット(ACK)をやりとりすること
3ウェイハンドシェイクの流れ(★)
- SYN:
- クライアントからサーバへ、SYN(つないでいいですか)を送る
- SYN+ACK:
- サーバからクライアントへ、①に対するACKと、サーバからのSYNを送る(いいですよ、こちらからもつないでいいですか)
- ACK:
- クライアントからサーバへ、②に対するACKを送る(いいですよ)
- 3ウェイハンドシェイクの例え:
- 電話で「もしもし、聞こえますか」→「はい、聞こえます。そちらも聞こえますか」→「はい、聞こえます」。お互いに確かめてから本題に入る
- TCPコネクションの識別:
- 宛先IPアドレス、宛先TCPポート番号、送信元IPアドレス、送信元TCPポート番号の4つで識別する
- セキュリティとのつながり:
- 3ウェイハンドシェイクを悪用するのが、SYN Flood攻撃(SYNだけ大量に送り、ACKを返さない)やSYNスキャン
③ UDP
- UDP:
- 送達管理をしない、コネクションレス型通信
- だから、TCPでやりとりしていたシーケンス番号やACK番号などは扱わない
- データ落ちが起きても再送しないので、高速な分、信頼性は低い
- UDPヘッダの項目:
- 送信元ポート番号、宛先ポート番号、セグメント長、チェックサムの4つだけ(TCPよりずっとシンプル)
- UDPを使うプロトコル:
- DHCP、NTP、SNMPなど
- UDPの例え:
- 普通郵便やチラシのポスティング。届いたかは確かめないが、手軽で速い。動画のライブ配信のように、1コマ落ちても再送より先に進むほうがよい通信にも向いている
- 注意(新しい情報):
- DNSは、ふつうの問合せはUDP 53番だが、応答が大きいときやゾーン転送ではTCP 53番も使う
- 最新のHTTP/3は、TCPではなく、UDPの上で動くQUICというプロトコルを使う(UDPで速さを出し、確実に届ける仕組みはQUICが持つ)
- 試験では、上の分類(TCPはHTTP・FTP、UDPはDHCP・NTP・SNMP)で覚えておけばよい
④ アプリケーション間の通信
- トランスポート層のもう1つの役割:
- アプリケーション間の通信を実現すること
- 各アプリケーションは、トランスポート層のヘッダ(TCPヘッダ、UDPヘッダ)にある「宛先ポート番号」を見て、自分宛てのデータかどうかを判断する
アプリケーション間の通信の流れ
- 送信側:
- トランスポート層のTCPで、パケットに、宛先のポート番号を指定したTCPヘッダを付ける
- ネットワーク層に渡されたパケットには、宛先のIPアドレスを指定したIPヘッダが付く
- 受信側:
- IPヘッダのIPアドレスで、受信側のノードにパケットが届く
- TCPヘッダの宛先ポート番号で、そのパケットを使うアプリケーションに届く
- 例え:
- IPアドレスで「マンション」に届き、ポート番号で「何号室(どのアプリ)」かが決まる
混同しやすいペア
- TCP / UDP
- TCPは、コネクション型。送達管理・伝送管理をする。確実だが遅め(HTTP、FTP)
- UDPは、コネクションレス型。再送しない。速いが信頼性は低い(DHCP、NTP、SNMP)
- シーケンス番号 / ACK番号
- シーケンス番号は、分割したデータが分割前のどの部分かを示す
- ACK番号は、次に受信すべきシーケンス番号
- ウィンドウサイズ / MSS
- ウィンドウサイズは、ACKなしで連続して送れるデータ量
- MSSは、受信できる最大のセグメントの大きさ(これより大きいデータは分割する)
- SYN / ACK
- SYNは、コネクションの確立要求
- ACKは、確認応答
- 3ウェイハンドシェイク(TCP) / ハンドシェイク(TLS)
- TCPの3ウェイハンドシェイクは、SYN・SYN+ACK・ACKでコネクションを作る
- TLSのハンドシェイクは、サーバ認証、暗号方式の決定、鍵の共有をする
- IPのチェックサム / TCP・UDPのチェックサム
- IPのヘッダチェックサムは、ヘッダ部分だけが対象
- TCP・UDPのチェックサムは、データ部分も対象
- IPアドレス / ポート番号(アプリケーション間の通信)
- IPアドレスは、どのノードに届けるかを決める
- ポート番号は、ノードの中のどのアプリケーションに届けるかを決める
- TCPヘッダ / UDPヘッダ
- TCPヘッダは、シーケンス番号、ACK番号、ウィンドウサイズなど項目が多い
- UDPヘッダは、送信元・宛先ポート番号、セグメント長、チェックサムの4つだけ