naoya さんの次の疑問点には yamaz さんが答えてくれるのが一番だと思いますが、私が元エントリ「最速配信研究会 - Web2.0とC10Kに関する数々の誤解」を読んだときに、昨年、lighttpd からコピペしつつ、libevent を使って試し書きしたサーバを思い出していました。

書き込み要求を 8081 ポートに、維持コネクションを 8082 ポートにしておいて、サーバでは、それぞれ別のソケットに listen しておき、8081 のソケットからの accept をイベントにしてレスポンスを作って、8082 のソケットで accept しておいて配列に貯めておいたソケットへ共通のレスポンスの書き出しを非同期でおこなっていくというやりかたです。

これは、MSIE6 では期待通り動きました。

ところが、firefox では同じホストでもポートが異なると別のサーバとみなすようで、XmlHttpRequest が動きませんでした。firefox でも動くようにするには、HTTP アプリケーション・レイヤで動くリバース NAPT (というのかどうか)をサーバとクライアントの間に挟まないといけなくて、めんどくさいと思ってこのやりかたはボツにしました。

ちなみに、サーバで 8082 のソケットを accept せずに listen したままで、8081 のソケットで accept できてから 8082 のソケットから accept を始めるというやりかたでも、linux 2.6系では動いていました。この乱暴なやりかたは 8082 へのコネクションにカーネルのトランスミッション・ブロックを消費するだけですので、リソースを最も消費しない実装になります。けれども、TCP を長時間 LISTEN 状態のままにしていていいものかどうか……。ネットワークに流れるのはステートレスの IP パケットにすぎず、TCP コネクションの状態はクライアントとサーバ双方のトランスミッション・ブロックの状態記録にすぎないので、別にかまわないといえばかまわないのでしょうけど。