title_parttitle_parttitle_part
静岡県浜松市であれこれソフトを開発している A.K.I Software のブログです。日々の開発日記やサーバー・セキュリティ関連の話題なども掲載。
<< 2024/03 >>12345678910111213141516171819202122232425262728293031
《《《 ネットワーク機器の購入は Amazon で! 》》》
Powered by BLOM PMailServer2 での iPhone mail のタイムアウトについて
小さくも大きくも閉じたりもしません
18/07/17 01:34 / PMailServer2

過去にもお問い合わせがあり、最近またお問い合わせがありましたので、きっちりと調査を行いました。

まず、本件の問題ですが、iPhone mail (iOS 標準メール)を使って、POP3 や IMAP4 でアクセスを行った際に、サーバー側でタイムアウトが記録される件です。

結論からして、90% くらいの確率で iPhone mail 側の問題だと思われます。

テストで利用した iOS は
1) iPhone4 7.1.2 (11D257)
2) iPhone7 11.4 (15F79)
です。

回線は Wi-Fi と一般的なプロバイダ経由の2パターンです。

サーバー側で、IMAP4 のタイムアウトは300秒(5分)に設定されています。

03:00:47 8 UID SEARCH UID 1:* UNSEEN
03:00:47 8 OK UID SEARCH Completed
03:00:47 9 UID SEARCH 1:* DELETED
03:00:47 9 OK UID SEARCH Completed
03:05:49 Client Timeout(4)

上記は一番発生する確率の高い箇所です。

このような場合、考えられるパターンはいくつかあるのですが、まず第一にパケットロスが発生して、PMailServer2 側が iPhone mail からのパケットを取りこぼしているパターンがあります。

ISP 経由の場合、途中の経路やネットワークの状況等で発生しなくもないのですが、Wi-Fi 経由でも発生する為、考えにくいです。(無論、1度発生したから取りこぼしたなんてことは無く、数日間の間テストした結果です)

次に POP3 や IMAP4 のコマンドは改行コードでコマンドの終端を示しますので、その箇所を取りこぼしている、つまり iPhone mail 側は、コマンドを送っているがコマンドの終端を認識出来ない為に、タイムアウトになっている。という可能性がありますので、デバッグ用コードを組み込んで確認しましたが、少なくとも 1byte も送られてきていませんでした。

次に上記の箇所で高確率で発生する(タイムアウトが頻繁に発生するのでは無く、タイムアウトが発生する場合に、上記の箇所で発生する確率が高いという意味です。タイムアウト自体が頻繁に発生する訳ではありません)ので、特定のパケット状況で発生するのでは無いかと思い、ルーター側で DFビットを強制OFF (いわゆる Path MTU Discovery Blackhole 問題対策)を設定してみましたが、状況は変わりません。

次に視点を変えて、その前のサーバー側の応答が送信に失敗している可能性も考えましたが、そもそも送信に失敗した場合は、その旨のエラーが出ますので、これも無いです。
(Winsock レベルではエラーが出ていないという意味で、TCP/IP スタックに問題があって、エラーが検知出来ない可能性も0ではありませんが、Intel NIC でそういう問題は聞いたことが無いです。致命的な問題ですし)

ということで
1)NIC レベルは問題無いだろう。
2)Path MTU Discovery 問題の無い。
3)送信にも失敗していない。
4)パケロスの可能性も非常に低い。

となると、結果的には、iPhone mail 側が次のコマンドを「送ったつもりで送れていない」「そもそも送っていない」
しか考えられないんですよねぇ。

で、正常に動いているパターンなんですが

01:41:16 14 UID SEARCH 1:* DELETED
01:41:16 14 OK UID SEARCH Completed
01:41:37 15 LOGOUT
01:41:37 * BYE IMAP4rev1 Server logging out
01:41:37 15 OK logout Complated.

タイムアウトになるのが、次に LOGOUT コマンドで終了する直前に発生しているようです。
(POP3 の場合は、QUIT です)

上記の事から、iPhone mail のセッション終了処理に問題があり(*1)それが原因でタイムアウトが発生しているという結論になります。
PMailServer2 側ではどうにもなりませんので、今後お問い合わせを頂いても、対処できませんのでご了承願います。

検索してみると、どうやら10年近く前から同様の問題が出ているようですが、Apple は直す気が無いようです。

困ったもんですなぁ。

(*1) iPhone mail の中身までは当然わかりませんが、なんとなく予想すると、Socket通信で切断(CloseSocket)する前に Shutdown という API で該当ソケットの送信のみを禁止、受信を禁止、両方禁止という処理を行うことができます。

同期処理の場合は問題でませんが、非同期処理の場合、これが前後する場合があります。
つまり、
LOGOUT 送信>応答を待つ>Shutdown>CloseSocket という順番になりますが、これが
Shutdown>LOGOUT送信>応答を待つ。という処理になると、最初の Shutdown でソケット通信自体はできなくなるので、LOGOUT も送れないし送信エラー処理が正しくされていない場合、送ったつもりになって、サーバーからの応答を待つ。当然サーバーは受信していないので応答しないし、CloseSocket も行われない。結果としてサーバー側でタイムアウトになるしか無い。というような気がしないでもありません。

[更新日付:2018/07/17 01:34:02]
トラックバックを見る(0)
Log Link [https://akisoftware.com/cgi-bin/blom.exe?akisoft+sl+9fb220a0e5502557bfddf91683deb9e53c295852]
TB Link [https://akisoftware.com/cgi-bin/blom.exe?akisoft+tb+9fb220a0e5502557bfddf91683deb9e53c295852]

記事へのコメント

コメントはありません

名前
コメントキー
 
コメントする時はキーを正確に入力して下さい
コメント
アドレスを含んだコメントはできません
© 2008-10 A.K.I Software all rights reserved.