こんにちは。Internet Explorer サポートの鶴巻です。
本日は WinInet (Internet Explorer のコンポーネント) を使った FTP 通信のプログラムを作成している際に、まれに 12 秒間通信が遅延する現象についてご紹介します。
詳細は下記に記載していますが、この動作自体は Windows OS 側の制限に基づくものであり Internet Explorer が直接影響している現象ではありませんが、WinInet をご利用いただいている際に遭遇する現象であるため本ブログでのご紹介となります。
■ 現象について
WinInet を使った FTP 通信のプログラムを作成している場合に、InternetConnect 関数の呼び出し時に 12 秒間時間がかかる現象が発生する場合があります。
WinInet で HTTP 通信を実施する場合には、実際には HttpSendRequest 関数などを呼び出した際に通信が開始される動作となりますが、FTP 通信の際には InternetConnect 関数の呼び出し時に FTPサーバーとの接続が行われます。
InternetConnect function
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa384363(v=vs.85).aspx
—– 抜粋 —–
For FTP sites, InternetConnect actually establishes a connection with the server;
この際、FTPサーバーの URL としてホスト名ではなく IP アドレスを指定しているにもかかわらず、特定のネットワーク構成の場合に名前解決に 12 秒間の時間を要する現象が発生し FTP 通信に想定よりも時間を要することがあります。
■ 原因
複数のネットワーク アダプターを持つコンピューターにおいて、LmHosts と呼ばれるファイルを使用して NetBIOS 名を解決しようとすることに起因します。
この NetBIOS 名の名前解決に 12 秒間の時間を要します。
詳細につきましては下記のサポート技術情報をご参照ください。
High CPU usage for 12 seconds on a multiple-network-adapters computer in Windows Server 2012 R2 or Windows Server 2012
https://support.microsoft.com/en-us/kb/3091403
この現象は Windows Vista / Windows Server 2008 以降の OS 上で発生する可能性のある現象となります。
なお、Windows 10 および Windows Server 2016 では上記修正がすでに含まれているため同様の現象は発生しません。
■ 対処策
Windows 8.1 / Windows Server 2012 / Windows Server 2012 R2 環境では、上記の KB3091403 のサポート技術情報から修正プログラムをダウンロードすることで回避することができます。
一方、残念ながら Windows 7 / Windows Server 2008 R2 以前の環境には修正プログラムの用意がないため、以下のいずれかの方法での対処をご検討ください。
(1) LmHosts 参照の無効化
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LmHosts の参照を無効化することで回避することが可能です。
< 設定手順 >
1. [ネットワーク接続] 管理画面を開きます。
2. 任意のネットワークアダプタをダブルクリックして、[プロパティ] を開きます。
3. [インターネット プロトコル バージョン 4 (TCP/IPv4)] を選択し、[プロパティ] をクリックします。
4. [詳細設定…] をクリックします。
5. [WINS] タブを選択し、[LMHOSTS の参照を有効にする] のチェックを外します。
* 設定の変更後、OS 再起動は必要ありません。
(2) タイムアウト時間の短縮
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LmHosts を使用している場合には、LmHosts の参照タイムアウトを短縮することで、遅延の発生時間を短縮することが可能です。
< レジストリ設定 >
場所:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\parameters
名前:LmhostsTimeout
種類:REG_DWORD
既定値 : 6000 (ミリ秒)
設定可能最小値 : 1000 (ミリ秒)
* 最小値の 1000 を設定した場合、タイムアウト値は 2 倍の 2 秒となります。
* 設定の反映には、OS 再起動が必要です。
* レジストリ値の直接の変更は十分にご確認ご検証の上、万一に備えバックアップを取得したうえでご実施ください。
本記事に記載の内容が少しでもトラブル回避のお役に立てますと幸いです。