blog

TCP/UDPの疑問「何故、1つのアプリが複数のポートを使うのか」

2009-11-22 00:15:22 ネットワーク Comments: 0
概略はなんとなく知っていると思うんですが、こんなイメージです。
  • 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個のポートで済ませるのとどう違うのか?
というのが疑問に残りました。

想像としては、着信ポート毎に挙動を変えることにすれば、
パケットの中身を精査しなくても挙動を変える事が出来るので、プログラミングに便利だという事です。
でも、そもそも到達するか不明な物に対して、そんな事をする意味があるのかわかりません。
セカンドベストのためのノウハウだとか言うなら、そういうものだと納得するしか無いけど。

もう一つの想像としては、受信バッファや受信速度がポートあたりいくらと決まっているとかで、
ポートを分散させる事が負荷分散に繋がるのではないか、という想像です。根拠は全然ありません。

疑問が解明したら続くかも。

1 1 件中 1 ~ 1 件目