MacOS X での RWIN 設定など


はじめに

ADSL や CATV などの所謂「ブロードバンド」が一般化して、常時高速接続が当たり前になってきています。しかし私たちが使っているコンピュータがネットワークとやり取りするパケットのサイズをどのように決めているかによって、せっかくの高速接続がそのパフォーマンスを十分に発揮していないケースがあります。Windows であれば Dr.TCP というアプリケーション、MacOS 9.* までであれば IPNetTuner というアプリケーションによって、コンピュータが扱うパケットのサイズを設定することでパフォーマンスの最適化を行うことができます。MTU とか RWIN ってなに、ということについては私が無知をさらけ出すのもアレなので、Net Land Do! さんのページや、Mac Clinic さんのページなどを参照してください。Mac Clinic では 前述の IPNetTuner の詳細な使い方が解説されています。

MacOS X での現状

さて、こんなページを読んでいる人がいるとすればその人は MacOS X を使っているでしょう。というわけで MacOS X における TCP/IP パラメータの変更手段について考察してみましょう。

GUI を具えたアプリケーション

IPNetTuner のように GUI から簡単に MTU や RWIN をいじれるソフトウエアがないか、というと、RWIN に関しては SetRWS というアプリケーションがあります。私はこれしか知りません。

SetRWS
SetRWS

SetRWS には、このスクリーンショットからもわかるように寄付を求めるダイアログがうるさいこと、スライダーのメモリが固定する値しか設定できないといった欠点があります。

12月28日追記

RMAC というアプリケーションが公開されました。GUI で様々なパラメータを変更できるもので、非常に便利だと思います。これで色々試してみて、一番うまくいった値を下記の方法で起動時に設定するという方法をとるといいかもしれません。「オプション」タブで「起動時に値を常に変更するようにする」というチェックボックスをオンにすると、設定した値が起動スクリプトに書き込まれ、以下で説明している項目を自動的に設定できるようになります。

システム標準のコマンド

なにしろ MacOS X は BSD です。ということはカーネルをチューンするコマンドや、インターフェースの設定を変更するコマンドが存在するはずです。ということでちゃんとそれは存在します。インターフェースの設定は /sbin/ifconfig、カーネルのチューンは /usr/sbin/sysctl です。細かい使い方については man ページで大概のことはカバーされていますが、では特に私が使用している ADSL 環境でどうすればいいのか、ということは man ページからはわかりません。ので、man ページの記述を参考に自分で試行錯誤してみるしかないわけです。

MacOS X のデフォルトの値では MTU=1500、RWIN=32768 になっています。自分のコンピュータのパラメータがどうなっているか、ということについては、SpeedGuide.net のページにある TCP/IP Analyzer で知ることができます。アクセスするだけで値を返してくれるので便利です。MTU については、Ethernet の MTU が 1500 であることから、ルータを介して ADSL に接続している場合 (私のように ACCA の 8Mbps サービスを利用していれば自動的にそうなりますが) この値を変更する必要はありません。もし変更したい場合はルータの MTU を変更するわけですが、これはルータに web ブラウザからアクセスすることで変更できる機種がほとんどだと思います。USB モデム等を利用していて自分のコンピュータの値を変更したい場合、まず ifconfig で自分のコンピュータのインターフェースを調べます。

[localhost:~] michiya% ifconfig -a
lo0: flags=8049 mtu 16384
        inet 127.0.0.1 netmask 0xff000000 
en0: flags=8863 mtu 1500
        inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
        ether 00:03:93:3e:9b:fc 
        media: autoselect (10baseT/UTP ) status: active
        supported media: none autoselect 10baseT/UTP  10baseT/UTP  100baseTX  100baseTX 

これで Ethernet インターフェースが en0 であることがわかります。そこで

sudo ifconfig en0 mtu 1460

などとすることによってインターフェースの MTU を変更することができます (1460 という値は適当です。自分の環境に応じて適宜変更します)。

一方 RWIN についてですが、これは sysctl で変更します。sysctl では色々なパラメータを設定することができます。私自身もちろんその内容を全部把握できているわけではありませんが、たとえば

[localhost:~] michiya% sudo sysctl -w net.inet.tcp.rfc1323=1
Password:
net.inet.tcp.rfc1323: 0 -> 1

などとすることによって、RWIN のスケールファクタを変更することができます。端的には RWIN の値をより大きくとれるようになる他、Timestamp などの拡張 TCP ヘッダを付加することになります。では、ここで問題の RWIN 値、つまり Receive Window Space を変更するにはどうするかというと、

[localhost:~] michiya% sudo sysctl -w net.inet.tcp.recvspace=64240
net.inet.tcp.recvspace: 32768 -> 64240

などとします。sysctl で値を指定すると、どのように変更されたかを返してくれているのがわかります。この他、udp の recvspace なども同様に変更することができます。このときにどのような値を設定すればよいか、という点についてはまだよくわからないというところが多く、正直さほど劇的な効果があるわけでもありません。一般的には、RWIN は MSS (MTU-40) の整数倍が適切であるとされていて、たとえば MTU=1500 であれば RWIN=(1500-40)*44=64240 あたりが妥当ではないかと思われますが、ここに拡張ヘッダが消費する数ビットがからんできたりもしますので、それぞれの環境に応じた試行錯誤が必要になってくるゆえんでもあります。

起動時に自動的に設定する

起動スクリプトの編集

前節で示した sysctl で値の変更は確かに可能なのですが、再起動するとデフォルトに戻ってしまいます。そこで起動時に自動的に設定する方法がないかを考えてみます。MacOS X では、起動時のさまざまなパラメータの設定を /etc/rc および /System/Library/StartupItems/SystemTuning/SystemTunig といったシェルスクリプトから自動的にコマンドを実行することによって行っています。したがって、これらのファイルに sysctl で設定したい項目を書き込んでしまえばいいということになります。たとえば /System/Library/StartupItems/SystemTuning/SystemTunig の末尾に

sysctl -w net.inet.tcp.rfc1323=1
sysctl -w net.inet.tcp.recvspace=64240

などと書き込んでしまえばおっけーです。

起動項目への追加

しかしこの方法は、本来システムだけが利用するファイルをユーザが書き換えることになり、何らかのトラブルの原因になる可能性がないとはいえません。*BSD の流儀でも余り推奨されていません。では MacOS X で安全な手段は、というと、/Library フォルダに StartupItems というフォルダを作ると、その中にある項目が起動時に実行されるという仕組みがあります。ので、/Library/StartupItems/SetRWIN というフォルダを作成し (これはユーザ権限で可能です) そこにシェルスクリプトを置けばいい、ということになります。ただし MacOS X では、シェルスクリプトを実行する際の初期設定を plist という拡張子のついた XML 書類で指定するのが普通です。そんなのわからないや、と私も思ったのですが、親切な方がちゃんとそれをつくってくれています。ありみかさとみさん作成になる「起動時に RWIN を設定する Startup Item」がそれです (12月28日追記:上の方で触れた RMAC は、設定内容にこの StartupItem を利用している旨ドキュメントに明記してあります)。これをいただいてきまして、ディスクイメージの中にある SetRWIN というシェルスクリプトの数値を適宜編集してフォルダごと /Library/StartupItems に放り込むだけです。再起動すればこのスクリプトで指定した値が自動的に取得されるという仕組みです。例えば私は以下のようにしています。

sysctl -w net.inet.tcp.rfc1323=1
sysctl -w net.inet.tcp.sendspace=32768
sysctl -w net.inet.tcp.recvspace=64240
sysctl -w net.inet.udp.recvspace=166400
sysctl -w net.inet.raw.recvspace=8192

ありみかさんによるこの起動項目にはJapanese.lproj がありますので、起動時にちゃんと「RWIN サイズを設定中」というメッセージが一瞬表示されます。カコイイ!

おわりに

現状で私が把握している TCP パラメータの変更や設定の方法はこれくらいです。おそらく近い将来 IPNetTuner のような詳細な設定を GUI から可能にするアプリケーションが出てくるとは思いますが、現状ここに述べたような方法で設定が可能です。

(12月29日追記)

RMAC を使えば以上説明してきたようなことは BSD なコマンドに触ることなく可能になります。現状では RMAC を使うのがもっとも安全で簡単な方法であろうと思います。このようなアプリケーションを作ってくださった Hi6 さんに感謝。

もちろんこのドキュメントは無知蒙昧な私が聞きかじりと経験則をまとめただけのモノで、内容に関しては全くの無保証ですが、わずかでも参考になればと思い恥を忍んで公開するものです。あまり信用しないでください。フィードバック、叱責その他は大歓迎です。メールをまでどうぞ。

Thanx to:
ありみかさとみさん
わたなべごうさん


Some Kind of Strangers...に戻る

目次に戻る