アプリケーションを扱うサーバ(PC)上では、Webサービスやメールサービス、ネットワークの監視など数多くのサービスが実行されており、様々なアプリケーションが存在する。そして、ウェブを閲覧するためのHTTPやメールを送信するためのSMTP、ネットワークを監視するためのSNMP、SSLなど、様々なアプリケーション層のプロトコルが存在している。
インターネット層(レイヤ3)まで配送したパケットをアプリケーション層に届けるには、それをつなげるためのインターフェースが必要になり、「ポート番号」がそれを担う。つまり、「ポート番号」がパケットとアプリケーションの仲介役となる。よく「http:80番ポート」などの記述を目にすると思うが、これは各々のアプリケーション層のプロトコルが何番の「ポート番号」を与えられているのかを示す。それぞれのアプリケーション層のプロトコルには、そのサーバ上において、固有の「ポート番号」が割り当てられる。
余談だが、このポート番号は、あらかじめ決まっている「ウェルノーンポート」(0〜1023番)と、アプリケーションにより決められている登録ポート(1024〜49151番)、自由に使える「ダイナミックポート」(49152〜6553番)がある。
さてこのレイヤには、代表的な2種類のプロトコルがある。「TCP(Transmission Control Protocol)」と「UDP(User Datagram Protocol)」だ。両方とも、ポート番号はフレーム内に含まれているが、性格が全く違う。
TCPは「コネクション型」で、信頼性を求めるために使用するプロトコルだ。送信する相手にポート番号を教え、こちらと送信相手とで仮想的なネットワークをつないでデータが正しくデリバリされているか確認し合う。通信開始時には「スリーウェイハンドシェーク」と呼ばれる手順が使われる。
図の通り、まず接続する側(クライアント側)から「SYNパケット」と呼ばれる接続要求を意味するパケットを相手側(サーバ側)に送る。接続可能な場合、サーバ側は接続許可を意味する「ACKパケット」と、クライアント側への接続を要求するSYNパケットを送り返す。それを受け、クライアント側ではACKパケットをサーバ側へ返す。
この作業には「シーケンス番号」が付けられるので、パケット損失が発見でき、再送要求が掛けられ、重複制御もできる。これにより確実な通信が可能となる。TCPはウェブ閲覧のためのHTTPプロトコルを利用する際や、信頼性の高い通信を行う際に用いられる。
逆に、UDPにはこれらの作業がない。よって確実な通信よりも速さを求める時に使用される。ストリーミングやVoIPなど、速度が求められる通信や、同報性が必要な通信に適している。TCPは確実だが、1つのパケットを送るにも最低3回のやり取りが必要となるので、当然通信効率は悪くなる。