FreeBSD QandA 1926

FreeBSD QandA

Q. LAN 経由での Windows から FreeBSD へのデータ転送が、その逆に比べ
   圧倒的に遅いです。Windows 同士だとこのような現象は起りません。

A. 最大の理由は「Winsock2 は 2 packet 送信すると ack を待ってしまうか
   ら」です。

   Windows の TCP/IP 層はデフォルトでは 2 packet 送信する度にAck を待っ
   てしまいます。unix は TCP Window size にゆとりがある場合は「きっと
   向うはまだ送ってくるだろうから」と安心して piggy bag できる packet 
   がないか調べるために、10msec ほど沈黙します。当然一方向の通信 (RPC 
   とか) の場合 piggy bag などできるパケットが存在しませんので、この
   10msec の間、全くデータが転送されることがなくなります。

   Windows 同士の場合、受け側も「2packet 受け取ったら速攻で ack を返さ
   ねばならぬ」と思い込んでいるので、この「待ち」がほとんどありません。

   FreeBSD でこの問題を解決するには、sysctl で

   # sysctl -w net.inet.tcp.delayed_ack=0

   とすることです。こうすれば piggy bag できるかどうか悩むことなく、
   FreeBSD は ack を即座に返すようになります。

   ただし、この設定は「特定のコネクション相手」単位では設定できません。
   全体に有効になってしまいます。で、他の unix マシンと通信する場合、
   これは ack を投げすぎることになるので、逆にパフォーマンスを落す可能
   性が高いです。

   なお、この現象は [管理番号 1582] に似ていますが、異なる現象です。
   しかし、Winsock2 に起因するところは同じです。ただし、Windows 2000 
   (と多分 Windows Me) の Winsock2 では発生しないようです。

同一グループへのリンク

グループ名: winsock


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。