概略はなんとなく知っていると思うんですが、こんなイメージです。
- IPの上にTCPとUDPが乗っている。
- TCPは通信内容に信頼性があるけど遅い。
- UCPは一方的な通信で信頼性がないけど速い。
- TCPの上にHTTPやSMTPが乗っている。(つまりHTTPはTCPとIPを使っている「上位プロトコル」である)
- UDPはストリーミング動画の配信などに使うといい(途中の1秒くらい不達になっても気にならないから)
で、これ以上の情報を手に入れようとすると、いわゆる入門サイトでは突っ込んで無かったりします。
詳しくて信頼性の高い情報を手に入れるには、RFCを読むのが一番です。
- RFC 793 Transmission Control Protocol
- RFC 768 ユーザデータグラムプロトコル
- RFC 791 インターネットプロトコル
検索すれば、日本語訳も見つかります。感謝感激です。
これを読んだおかげで、次のことがわかりました。
- TCPとUDPには発信元ポートと着信先ポート番号を入れる領域が定義されていること
- UDPの発信元ポートは、すべて0を入れても良いと規定されていること
しかし、30年近く前にこんなもんを考えていた人がいるという事には、歴史の重みを感じます。
さて、今日調べたのは、表題にある通り、「何故、1つのアプリが複数のポートを使うのか」という課題です。
FTPは、コマンド用のポート(21)とデータ用のポート(20)を分けていますが、どちらもTCPです。
どうしてこれが分かれているのかを考察すると、「パッシブモード」の存在が浮かびます。
ポート21をあけて、「そっちのポートに繋ぐから番号教えてよ」という通信をするわけです。
DNSはもっとテクニカルな事をしていて、「512バイトまでのIPパケットは分断されない」という特性を使って、
UDPで「壊れにくくて効率的な通信」をする事で、軽快に動作するように作られているらしい。
TCPも併用するんだけど、その理由は「512バイト以上の通信がしたくなった時」らしい。
DBにトランザクションをはるかはらないか、みたいな使い分けに近いイメージが沸きました。
で、いまだにわからないのが、「何故、1つのアプリが複数のUDPポートを使うのか」です。
ゲームなんかでは、UDPポートを100個使うからルータでNATの範囲指定してくれ、とか言われます。
なんで100個も使う必要があるのか? 1個のポートで済ませるのとどう違うのか?
というのが疑問に残りました。
想像としては、着信ポート毎に挙動を変えることにすれば、
パケットの中身を精査しなくても挙動を変える事が出来るので、プログラミングに便利だという事です。
でも、そもそも到達するか不明な物に対して、そんな事をする意味があるのかわかりません。
セカンドベストのためのノウハウだとか言うなら、そういうものだと納得するしか無いけど。
もう一つの想像としては、受信バッファや受信速度がポートあたりいくらと決まっているとかで、
ポートを分散させる事が負荷分散に繋がるのではないか、という想像です。根拠は全然ありません。
疑問が解明したら続くかも。