第 7 章 TCP と UDP TCP は、電子メール(SMTP)や WWW(HTTP)の

第 7 章 TCP と UDP
TCP は、電子メール(SMTP)や WWW(HTTP)の通信路として使われており、インターネッ
トの根幹をなしていると言っても過言ではない。また、UDP はマルチメディア系のデータ配
送などのために最近では出番が増えている。この章では、これらのプロトコルについて説明が
なされている。
7.1 TCP や UDP はなぜ必要か?
第 6 章にあるように、IP を使えばインターネット内で 2 つのホストが通信することができる。
だが、、IP アドレスだけの接続では、クライアント C 上で行われている通信を区別することは
できない。しかし、実際にインターネットを使う場合には、サービス(アプリケーション)や
処理ごとに、例えば WWW の通信とメールの通信を、それぞれ独立した通信として区別する必
要がある。このように、IP 上でホスト内の複数の通信を区別するために、TCP や UDP という
プロトコルが必要になってくるのである。
また、特に TCP が必要な理由は信頼性のある通信を提供するためである。IP では、パケッ
トの到着やその順序が保証されないために、IP で通信している際にある場所の通信が混んでき
てルータが処理できなくなると、処理の追いつかないパケットは失われてしまう。TCP は、正
しく送ることができなかったパケットについて再送するための仕組みをもっているし、順序の
違うデータの順番を入れ替えて、送った順序に戻す機能も備えている。
7.2 TCP と UDP の特徴
TCP ストリーム通信 コネクション型通信
送信するデータ(パケット)た、順序だてて相手に届けられる通信。電話のように通信する前
に相手とコネクション(接続)を確立してから通信する方式で、たとえばパケットが紛失して
も再送する機能を持っているために信頼性の高い通信ができる。
UDP データグラム通信 コネクションレス型通信
TCP と異なり、送信するパケットの順序や到達性を保証しない通信。通信する前に相手とコネ
クション(接続)関係を確立しないで通信する方式で、途中でパケットの紛失などが発生して
も再送しないために信頼性の低い通信となる。
7.3 ポートとは何か?その原理と役割
ポートとは、ホストの中の各々の通信を区別する番号のことである。
例えば、TCP でコネクションを確立する時や UDP でパケットを送るときに、通信相手のホ
スト上でのサービスを指定する際にポート番号を指定する。IP アドレスとポート番号の 4 つの
で一つの組であるコネクションを表す。
また、代表的なサービスに対しては、ポート番号があらかじめ割り当てられており、これら
のことをウェルノウン・ポート番号という。
7.4 TCP:データを失わないための信頼性通信
(1)シーケンス(順序)番号と確認応答(ACK)
TCP では、全ての番号にシーケンス番号と呼ばれる数字がついている。そして、通信に際し、
受けとったパケットのシーケンス番号を相手に返すことによって、パケットが正しく届いたか
どうかの確認をしている。この相手に返す確認を確認応答(ACK)と呼んでいる。
確認応答がある一定時間内に返ってこなかったり、同じ確認応答が繰り返し到着したりした
場合には、TCP ではパケットに損失が起きたと考えてパケットの再送を行う。この仕組みによ
って確実にパケットが伝達され、信頼性のある通信を実現している。
(2)TCP のパケット・フォーマット
(3)TCP におけるコネクションの確立
①まず、コネクションを要求する側がビットの立ったパケット(シーケンス番号は初期値 N)
を送る(SYN:N)
②これを受け取った通信相手は、応答として SYN:M を立てたパケット(シーケンス番号は初
期値 M)に「N+1」を ACK 番号に入れて返す。
③この応答を受け取ったコネクション要求側は、ACK ビットを立てたパケット(シーケンス
番号は「N+1])に「M+1」を ACK 番号に入れて返すことによって接続は確立する。
(4)TCP の動作状況を管理する状態遷移
7.5 TCP:効率よく通信するために
(1)TCP の通信によるパケットの流れ
TCP における通信の基本は、シーケンス番号と確認応答であるが、これをそのまま実現して
もよいが、少し ACK を返すのを待てば、次のパケットと一緒に ACK を返すことができるよう
になる。こちらの方が効率がよいため主に使われている。これを「遅延 ACK」と呼ぶ
(2)スライディング・ウィンドウとフロー制御
TCP で、ある程度まとまった大きさのデータを一気に転送する際に、受信側の処理が追いつ
かず受信側でパケットが破棄されるのを回避し効率よくデータ転送を行うために、フロー制御
という仕組みが備えられている。
TCP では、受信者がパケットを受信した際に、送信者に対して ACK を返すことで転送の信
頼性を確保している。しかし、パケットを送るたびに ACK が返ってくるのを待っていると、
データの送信に時間がかかってしまう。これを避けるために、ACK が返ってくるのを待たずに、
複数のパケットを送れば、一定時間に送ることのできるデータ量をふやすことができる。送受
信のさいには、バッファと呼ばれるメモリに一時的にパケットを蓄えるが、受信者側が受け取
りきれないほどの大量のデータを送ると、受信者側のバッファが溢れてパケットが破棄されて
しまい、再送が必要になってしまう。これを回避するために、TCP では受信者があとどれくら
いのパケットを受け取ることができるかという情報を送信者に伝え、送信者はそれを越えてパ
ケットを送らないようする。この送受信の調整をフロー制御と呼ぶ。
TCP のフロー制御では、「ウィンドウ」という考え方を導入してフロー制御を実現している。
ウィンドウとは、送信先から ACK が返ってくる前に送ることのできるデータの大きさのこと
である。送信側では、受信側から通知してきたウィンドウの大きさをオファード・ウィンドウ
として保持している。そして、オファード・ウィンドウの大きさから「送信したが ACK の来
ていないデータの大きさ」を引いたものが、今すぐ送信可能なデータの大きさとなり、利用可
能ウィンドウと呼ばれる。
(3)スロー・スタートと輻輳制御
ウィンドウ通知では、受けて側の受け取り能力を送り手に伝えるので、送信者の間のネット
ワークが LAN のように高速で空いている場合には、効率のよいデータ転送を実現する。しか
し、WAN を越えて通信する場合に、間に低速な回線があったり混雑している回線があった場
合には、ウィンドウが大きすぎて中継点の混雑(輻輳)を余計にひどくさせることになる。これ
を解決するために輻輳制御と呼ばれる制御をする。
TCP の輻輳制御では、最初ウィンドウの大きさを小さくしておいて、相手に正しくパケット
が届いたという ACK が返ってくるたびにウィンドウの大きさを大きくしていく。パケットが
途中のルータで破棄され相手に届かなくなると ACK が返ってこなかったり、シーケンス番号
が重複したりするので、送信側ではウィンドウの大きさが過大であったことがわかる。それに
よって、TCP はウィンドウの大きさを調節するが、このウィンドウは、前述のオファードウィ
ンドウとは異なる輻輳ウィンドウと呼ばれるものである。オファードウィンドウが受信者の情
報に基づく制御であったのに対し、輻輳ウィンドウは送信者側の検出した輻輳情報にもとづく
制御である。
TCP では、スロースタートと輻輳回避という、二つの手法を用いてこの輻輳ウィンドウの大
きさを制御する。
一つ目は、スロースタートと言い、輻輳ウィンドウの大きさが小さいときに使われる制御法
である。最初輻輳ウィンドウはパケット一つ分の大きさに設定され、パケットが一往復する間
に輻輳ウィンドウの大きさを倍増させていく。その後、パケットに破棄が起こった時点で輻輳
ウィンドウを1に戻して、もう一度同じことを繰り返す。
しかし、これだけでは簡単に輻輳を起こしては輻輳ウィンドウの大きさを小さくすることの
繰り返しになってしまう。そこで、前回輻輳の起きたウィンドウの大きさの半分を基準として、
その基準よりウィンドウが小さい場合には通常のスロースタートを、それより大きい場合には、
1パケット分の ACK が返ってくるたびに、1/(輻輳ウィンドウのパケット数)だけ広げる輻
輳回避という別のアルゴリズムで処理する。
このスロースタートと輻輳回避の二つの使い分けによって、適切なフロー制御が素早く行わ
れているのである。
7.6 UDP:軽量でデータ転送が速い
UDP のパケット・フォーマットは送受信のポート番号以外、データグラム(パケット)の
長さと、チェックサムというデータの損失を調べるための情報だけであり、TCP のそれと比べ
ると非常に単純になっている。
また、TCP と違い、コネクションを確立する必要がないため、データの損失よりデータの到
着スピードが重要であるマルチメディア・データの交換などに用いられている。