最近の 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などを参考にしてください。ヘッダのイメージを簡単につかむとすると、 下の図も参考になるかも、です。
![]()
これは講義の導入で示したものと同じことを説明しています。
![]()
その方法 は 3-way handshakeというもので、繋ぎ元から繋ぎ 先に(もちろんポートも指定して)まず「通信させてください」といった意味 合いのSYN フラグのたったパケットを投げます。そうすると、繋ぎ 先はポートが開いていれば「繋いでもいいよ、そちらも準備完了?」といった 感じの SYN/ACK というパケットを投げ返します。ちなみに接続を拒 否するときはRST パケットを投げます。そして、SYN/ACK をもらった繋ぎ元は再度「じゃ、よろしく」みたいな ACK パケット を投げる、という3段の手続きで、コネクションを確立するわけです。
さらにちなみに、SYN/ACK を投げたマシンはひたすら相手から ACK が再度返っ て来るのを待つわけで、その間はプロセスが生きたままなので CPUとメモリ資 源を消費しています。 攻撃者は対象コンピュータにIPアド レスを詐称したSYN パケットを送信します。対象コンピュータはSYN/ACKパケッ トを送信し、ACKパケットが帰ってくるのを待つわけですが、IPアドレスを詐 称しているのでACK/SYNパケットはどこにも届きません。あるいは詐称してい なくてもACK/SYN パケットを無視するというやり方もあります。 いずれにしても、ACK を返すのをほったらかしにして、じゃんじゃん SYN を投げていくと、投げられたほうは資源がどんどん無くなっていって、ついに は機能停止になってしまいます。これが俗に言う SYN flood DoS (Denial of Service) 攻撃の概要です。