WebDAVへのアクセスが遅い

http://blog.rino-server.jp/?p=322
ここの追記部分から。

Linux機で動いているApache2(WebDAV)にWin7pro64のネットワークフォルダのショートカットからアクセスした時の動作。
サーバ側の認証はApache2によるIPアドレスベースの認証。SSLは未使用。

現象(概要)
フォルダをダブルクリックしてすぐに開ける時と、開けない時がある。
開けない時はエクスプローラが固まってからエラーがでる。エラーコード0x80070035(ネットワークパス見つかりません)。
でも、もう一度ダブルクリックするとすぐ開ける。

現象(詳細)
すぐ開ける時とすぐ開けない時の違い。パケットキャプチャ

1,TCPの3wayハンドシェイクが確立
2,クライアントからOPTIONS / HTTP/1.1のリクエストを送る。
3,サーバから2へのACKが帰ってくる。
4,サーバからHTTP/1.1 200 OKのリプライを送ってくる。

ここまではどちらも同じ。こっからが違う。
すぐ開ける時
5,クライアントからPROPFIND /desktop.ini HTTP/1.1 を送る。
チョイ略(404が帰ってきたりして、リトライしてる?)
6.最終的にクライアントからPROPFIND / HTTP/1.1 を送る。
7サーバからリプライが返ってくる。→開ける

開けない時
5.クライアントから4へのAckを送る。
6.サーバからFYN,ACKがかえってくる。
7,クライアントから重複(Duplicate)ACK(5と同じシーケンス、応答確認番号)を送る。
8,6と7を約60秒(計7回)繰り返す。
9,クライアントからACK,RSTを送る。
10,新しいTCPセッションを生成して、開ける時の5-7が行われています。

4へのDuplicateACKの送信は開けない時には必ず発生している。

この時点での疑問
・4を受け取った後に返すパケットは何が正しい?
→開けない時の5と6は悪くないと思う。(TCP的に考えて。)
→じゃぁ、その後のDuplicateACKは何?これはOSが送らせてるのか、それとももっと上層のアプリが送らせてるのか。この辺は詳しくないのでさっぱりわからない。
・開けない時の7を送ってる理由は?
・開ける時と開けない時に異なるパケットを送ってる理由は?
・9のACK,RSTを送るトリガーは?
→HKLM\SYSTEM\CurrentControlSet\Services\WebClient\ParametersのSendReceiveTimeoutInSecな気がする。
http://technet.microsoft.com/ja-jp/library/ee155455.aspx#EDA
・ぐぐるとでてくる net useは?
→登録しようとすると、開けない時と同じパケットのやり取りがある。そもそも右クリのネットワークの場所を追加すると同じじゃないのか。詳しく調べて無いから分からない。

解決策
・フォルダ開いた時点でOPTIONSではなくPROPFINDを送ってやる。
→WIndowsの設定は不明。専用クライアントを入れてる。
→CarrotDAVなら接続した時点でPROPFINDを投げてる事を確認。
→できればアプリ使わずにWindowsのデフォルト状態でやってみたい。

まとめ
正直、何が悪いのかわからん。
クライアント側からDuplilcateACKを送ってる事から考えたらサーバが変なパケット送ってるととれないこともないけど、サーバが返してるパケットみても、それに対するクライアントのACKみてもTCP的にはおかしくなさそう。
少なくとも、今ある疑問点を解決しないと判断つかなそう。
Microsoft-WebDAV-MiniRedir調べてみようと思う。あんま気は進まないけど。。
進展あれば更新します。

コメントを残す

メールアドレスが公開されることはありません。