初心者にも分かる【TCP/UDP】〜違いや共通点、使い分け、ポート番号について〜

TCP/IPとは

TCP/IPとは、レイヤー3のIPとレイヤー4のTCP/UDPを組み合わせて通信を行う取り決め(プロトコル)のことで、現在のインターネット通信の一般的な通信モデルです。

更に上位レイヤー(http,dns,ftp,ntp等)のプロトコルは、このTCP/IP通信にカプセル化されて相手先に情報が送られます。

また、更に下位レイヤー(物理ケーブル/Ethernet等)は、伝送メディアによって変わりますが、このTCP/IP通信をカプセル化します。

TCP/UDPとは

TCP/UDPはクライアントとサーバ間での通信チャネルの提供通信管理を行う、レイヤー4のプロトコルです。通信チャネルというのはいわゆるポートのことで、同じIPアドレスであってもTCP/UDPのポートが異なれば、提供されるサービスが異なります。

早い話が、TCP/UDPを使うことで、ある1台のサーバの1つのIPアドレスで、複数のサービス(http/dns/メール等)を提供できるようになります

サーバのポート番号

例えば、192.168.1.1のIPを持つサーバにおいて、HTTPサービス(Apache/TCP port 80)DNSサービス(Bind/UDP port 53)SMTPサービス(Postfix/TCP port 25)が動作させることができます。

クライアントから192.168.1.1のTCP80番ポートへ接続すれば、HTTPサービスが提供されます。
クライアントから192.168.1.1のUDP53番ポートへ接続すれば、DNSサービスが提供されます。
クライアントから192.168.1.1のTCP25番ポートへ接続すれば、SMTPサービスが提供されます。

このとき、(サーバ側ではなく)クライアント側のポート番号が何番かというのはあまり意味がありませんが、例えば同一クライアントからHTTPサービスへ2つのTCPコネクションを張りにいくこともありますので、サーバ側で、同一クライアントの2つの通信を識別するのに役に立ちます

なお、HTTPはTCP80番ポート、DNSはUDP53番ポート、SMTPはTCP25番ポート、というのはWell-Known-Port(ウェルノウンポート)と呼ばれ、一般的に使われるポート番号です。この割り当てはIANAが行なっており、 IANAのページに公開されています。ただし、この決め事は絶対ではありません

例えば下図のように、HTTPは234番でもいいですし、DNSはUDPじゃなくTCPでもよく、さらに53番じゃなく106番にしても構いません

これはWebサーバやDNSサーバ、メールサーバの設定で変更可能ですし、アプリケーション開発者が自由に決めても構いません

クライアントのポート番号の範囲

クライアントのポート番号は基本的には higher port と呼ばれる、番号の後ろのものが使われます。

Windowsについては、Vista以降はIANAの勧告に従い、Ephemeral Port (49152~65535)が使われます。設定はコマンドプロンプトの以下コマンドで確認できます。(49152+16384-1=65535であることに注意)

C:\>netsh interface ipv4 show dynamicport tcp
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\>netsh interface ipv4 show dynamicport udp
プロトコル udp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384

Linuxについては32768~60999が使われています。これはカーネルパラメータに定義されており、sysctl -a で確認できます。

# sysctl -a
~~~
net.ipv4.ip_local_port_range = 32768    60999
~~~

 TCPとUDPの使い分け

TCPは特に、高信頼性(3wayハンドシェイクによる通信前の打診、ackによる相手の受信確認や再送処理、等)や 通信効率の最適化機能(Windowによるフロー制御や輻輳制御)を提供します。そのため、UDPと比べて負荷がかかります。

一方、UDPは送信相手に通信チャネルとチェックサムを提供するのみのシンプルな構成のため、負荷が軽いですが、 信頼性や通信の効率性を提供する機能はありません。通信も一方的です。

TCPは、Web通信、メール通信、ファイル転送などの、信頼性を求められる通信に向いています。TCPは片方向ずつコネクションを確立します。つまり、TCP synではクライアントからサーバへのコネクションの開始の打診、TCP syn/ackではsynに対する承認と、サーバからクライアントへのコネクションの開始の打診、TCP ackでは直前のsynに対する承認を行います。

一方、UDPは音声や動画などのリアルタイムアプリケーションや、syslogやDNS、NTP、SNMP、TFTPなどの簡易なプロトコルに向いています。(ただし、最近では動画サイトはTCPを利用することがほとんどです。)

なお、UDPはsyslogのように1方向のものもあれば、DNSやNTPのように双方向のものもあります

ちなみに完全な余談ですが、若手の頃、ある人が『TCPは恋人のメール(LINE)の仕方、UDPは夫婦のメール(LINE)の仕方、と覚えろ』と言っていたのを今、しみじみと感じています。つまり、、、

TCP(恋人のメールの仕方)の場合

---7/23(月)---
0:11 A子『ねえ、まだ起きてる?』(syn)
0:11 B男『ん?起きてるよー』(syn/ack)
0:12 A子『よかった!まだ起きてるんだ!今日さー、〜〜〜』(ack、通信開始)

UDP(夫婦のメールの仕方)の場合

---7/23(月)---
17:45 B男『これから帰ります』
---7/24(火)---
19:23 B男『これから帰ります』
---7/25(水)---
17:35 B男『これから帰ります』
17:45 A子『卵買ってきて』
---7/26(木)---
20:56 B男『これから帰ります』

ソケット

TCPでは、『クライアントのアプリケーション』と『サーバのアプリケーション』間での データのやり取り(通信)を規定しています。

下図は、クライアントのInternetExplorer(クライアントのアプリケーション)がサーバのApache(サーバのアプリケーション)にTCPでデータのやり取りをする イメージ図です。(Apacheは代表的なWebサーバソフトウェアです。)

『192.168.1.1:50001 ⇔ 10.0.0.1:80』というような、送信元IPアドレス:送信ポート、 宛先IPアドレス:宛先ポートの組合せのことをソケット(socket)と呼びます。

クライアントのアプリケーション(ブラウザ)もサーバのアプリケーション(Apache)も、このソケットという単位で通信を管理しています。そのため、クライアントのポート番号さえ異なれば1つのクライアントで同時に同じサーバポートにアクセスすることもできます

通信をこのように管理するゆえ、【TCP/IP】という言葉があるのです。(UDP/IPとはあまり言わないですが、TCP/IP通信と呼ぶものの中にはUDPも含めていることが多いです。)

アプリケーションはこのソケットを識別子として仮想回線を張り、TCPコネクションを確立します。このとき、IPのルーティング経路は、行きと帰りで違っていても問題ありません。RIPやOSPF等の動的ルーティングプロトコル等で途中で経路が変わっても、このコネクションが切れることはありません

なぜなら、レイヤー3以下で動作するNW機器ではTCPコネクションは認識しておらず、クライアント/サーバのホスト間だけで認識しているためです。

ただし、ファイアウォール等のレイヤー4以上のNW機器では TCPコネクションやUDPの往復を管理する機能(ステートフル・インスペクション)があるので、経路の途中にファイアウォールがある場合は行きと帰りを同じ経路で往復させる必要があります

余談ですが、ソケットはアプリケーション開発においても、ソケットAPIという APIが提供されています(WindowsのソケットAPIは特にWinsockと呼びます)。

プログラマはプログラム上で通信が必要な場合はこのソケットAPIを呼び出すだけでよいので、通信に関するプログラムを書く必要がなくなります。

さらに余談ですが、WinsockはOSのバージョンによって段々と変わってきています。特に大きな変化としては、Windows XP SP2以降で、RAWソケットを禁止したことです。

通常のソケットはデータ送信をする際にTCP/UDPのヘッダは自動で生成、出力されますが、RAWソケットを使うと、Ethernetヘッダ、IPヘッダも含め、全て利用者が手動で生成できます。これが結局悪いことばかりに使われたため、セキュリティのためにMSが禁止にした、というのが実情のようです。

TCP/UDP の勉強については、以下の書籍がお薦めです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

Comment

  1. koike90s より:

    管理人様

    とても素晴らしい内容でわかりやすかったです。
    私も自己研鑽のためにブログを始め、勉強記録をつけているのですが、
    貴サイトに記載してある内容は今後も活用していきたく存じます。

    可否含めて可能な範囲のご確認をさせていただければと存じますので、
    一度お話させていただくこと可能でしょうか。

    もし可能であれば記載いたしましたメールアドレスにお返事いただければと存じます。

    以上、よろしくお願いいたします。

    koike90s