トランスポート層 (Transport Layer)

IP 層で世界中のコンピュータがつながるようになるとして、その上で、さて個々 のアプリケーションがどのようにそれぞれを 区別して個別に 通信が できるか、については、もう少し細かい制御が必要となります。それがこの層 の役目になります。

TCP,UDP と並行処理のモデル

そもそもここで対象としている並行処理 とは何か、ということなので すが、そもそも今どきのコンピュータはマルチプロセス システムであることが本質であり、その各プロセスが個別に通信 を行えるようにするための仕組みを提供しています。つまり、同時にメー ルの送信・受信も出来るし、WWW のサービスも提供できるし、ということです。
最近の CPU はコア(演算制御部)が複数のものもありますが、古典的に CPU が1つであっても、ほとんどのOSでは複数の処理(粒度に応じてプロセスだっ たりタスクだったりスレッドだったり、呼び方が変わりますが、ここではプロ セスとしておきます)を、擬似的に同時並行で行っています。それはつまりど ういうことかというと、 ある一瞬では1つの処理 しかしていないの ですが、すごく短い時間で 処理をする権利(CPU資源) を複数の プロセスで 順番に交代で使う ことで、複数のプロセスが少しずつ処 理を進めていき、それを長い目(?)でみると同時並行処理されているように 感じられる、ということです。

以下のシミュレーション(?)で少しでも感じてもらえれば、と思います。A〜 Eがプロセス(計5つある)で、ある一瞬には1つしか動いていない(CPU を利用していることに対応)のですが、交代の時間間隔を短くとることで、ぼ ぼ同時に動いているように見ることができるでしょう(できますか?)。






そこで、並行処理のために、ポートという概念を導入し、これを識別子として 個別の通信を区別できるようにしています。
例えていうと、銀行で1番窓口は口座開設、2番窓口は税金等の支払い、3番 は住宅ローン相談、のように分かれて用意されていて、それぞれが同時に別の 処理をおこなうことができ、お客さんは自分の用事のある窓口にいけばよい、 という感じです。
IP 通信では、2者(通信の主体、ノード ということがあります) 間で通信をする場合には、まず通信したい、即ち何かサービスを受けたい方 (これをクライアント といいます)から通信される、即ち何かサー ビスをする側(これをサービスする者という意味でサーバ といいま す)にたいして接続要求をし、サーバが要求を受け付けた時点で通信が開始さ れます。これをサーバ・クライアント型通信 といいますが、サーバ/ クライアントといった種類を問わず、かならずポートを割り振ります。

例えば、SMTPサーバは通常25 番を使用しますし、HTTPサーバは 80 番です。つまりサーバの場合は、クライアントからのアクセス時 にどのサービスを受けたいかを指定しないといけないので、必然的にポートを 指定する必要があります。そして、一般的なサービスについては25や80のよう に一般的な固定化された番号を定義しています。これはウェルノウンポー ト(well-known port) と呼ばれます。

unix 系マシンの場合はたいてい /etc/servicesというファイルにそのポートが記されています。以下、 /etc/services からの抜粋です。

ftp-data        20/tcp
ftp             21/tcp
ssh             22/tcp
telnet          23/tcp
smtp            25/tcp
http            80/tcp          www
pop3            110/tcp         pop-3
ntp             123/udp
imap2           143/tcp         imap
https           443/tcp

同時に、これらのサーバに接続するクライアント側のアプリケーションでも、 実はポート番号が割り振られています。そうしなければ、要求元、すなわちサー ビスを受けたいクライアントノード上のアプリケーションが見分けられないか らです。とはいえ、クライアント側のポートは何でもよいため、通常は使用さ れていないポート (1024 より上)からOSが 自動的に割り振ります。
本来は(?理工系なら)ここで、IP のデータグラム(あるいはパケット=転送データの単位、は層に よって呼び名がかわります)の上でいかにして TCP のセグメン トが構成されているか、等に関連して IP ヘッダ等を解説すべきなので すが、かなり複雑なことに加えて C言語等のハードウェアに近いプログラミン グ技術の知識が必要になるので、詳細は略します。興味ある人は

http://www.itbook.info/study/p87.html
http://www.atmarkit.co.jp/fwin2k/network/baswinlan015/baswinlan015_02.html

などを参考にしてください。ヘッダのイメージを簡単につかむとすると、 下の図も参考になるかも、です。

これは講義の導入で示したものと同じことを説明しています。
net layer

TCP の通信モデル

これらをIP層の上で構成して、信頼性をもたせているわけです。言い替えると、 TCP は多少パフォーマンスはおちることがあっても、高信頼性の双方向通 信を確立させるためのプロトコルと言うことができます。ちなみに コネクションを張る、とは、データを流す前に繋ぎ元と繋ぎ先をお互い に確認することで、その後は安心して通信できるようにする、ということです。

その方法 3-way handshakeというもので、繋ぎ元から繋ぎ 先に(もちろんポートも指定して)まず「通信させてください」といった意味 合いのSYN フラグのたったパケットを投げます。そうすると、繋ぎ 先はポートが開いていれば「繋いでもいいよ、そちらも準備完了?」といった 感じの SYN/ACK というパケットを投げ返します。ちなみに接続を拒 否するときはRST パケットを投げます。そして、SYN/ACK をもらった繋ぎ元は再度「じゃ、よろしく」みたいな ACK パケット を投げる、という3段の手続きで、コネクションを確立するわけです。

TCP 3-way
handshake

さらにちなみに、SYN/ACK を投げたマシンはひたすら相手から ACK が再度返っ て来るのを待つわけで、その間はプロセスが生きたままなので CPUとメモリ資 源を消費しています。 攻撃者は対象コンピュータにIPアド レスを詐称したSYN パケットを送信します。対象コンピュータはSYN/ACKパケッ トを送信し、ACKパケットが帰ってくるのを待つわけですが、IPアドレスを詐 称しているのでACK/SYNパケットはどこにも届きません。あるいは詐称してい なくてもACK/SYN パケットを無視するというやり方もあります。 いずれにしても、ACK を返すのをほったらかしにして、じゃんじゃん SYN を投げていくと、投げられたほうは資源がどんどん無くなっていって、ついに は機能停止になってしまいます。これが俗に言う SYN flood DoS (Denial of Service) 攻撃の概要です。

UDP …コネクションレス型プロトコル

ネットワークのつなぎかた


講義用スタイル
印刷用スタイル (開いてから、ページを再度更新してください)