メモ

「500マイル離れるとメールが送信できなくなる」問題は2025年には解決したのか?


バニラアイスを買ったときだけ車のエンジンがかからなくなる」や「ライターを点火するとPCモニターが消灯する」など、原因が突き止められるまでは怪現象としかいいようのない事象が世の中には存在します。その1つとしてネットで知られている「500マイル(約800km)以上離れた所にメールを送信できない」問題について、再調査が行われました。

can an email go 500 miles in 2025?
https://flak.tedunangst.com/post/can-an-email-go-500-miles-in-2025


そもそもの「500マイル離れた所にメールを送信できない」という話は、かつてノースカロライナ大学で学内のメールシステムの一部を担当していたトレイ・ハリス氏が、1994年から1997年のどこかで体験した話を、2002年になってまとめたものです。

The case of the 500-mile email
https://www.ibiblio.org/harris/500milemail.html

話のきっかけは、ハリス氏が統計学部の学部長から「メールが送信できない」と相談を受けたことでした。しかも送信できないのは「送信先が500マイル以上離れているときだけ」という条件付き。メールに「距離に応じて届く・届かないが決まる」などという仕組みはないため困惑したハリス氏ですが、あちこちにメール送信を試行した結果、本当に「500マイル少々までしか送信できない」ことが判明します。


さらに調べを進めたハリス氏は、SMTPポートに対してtelnetを試したところ、Sun OSのsendmailバナーが返ってきたことから、問題が発生するようになったという数日前に「業者がやって来てサーバーにパッチを当ててリブートしていた」ことに原因があると推測しました。

つまり、すでにサーバーには安定版のSendmail 8が入っていたのですが、業者の作業によってOSに同梱されていた旧バージョン・Sendmail 5へとダウングレードされてしまったのではないかというわけです。偶然にも、SunOS同梱のSendmail 5はSendmail 8のsendmail.cfファイルに対応していたので、ハリス氏がsendmail.cfファイルに書き込んでいたルールは多くがそのまま残ったものの、新たな設定の一部は無視されていたようです。一方で、多くの設定ではデフォルト値の設定がなかったことから「0」になってしまったようです。

このとき「0」扱いになった設定に、「リモートSMTPサーバー接続時のタイムアウト」も含まれていて、ハリス氏が試してみたところ、当該環境と一般的な負荷のもとだと、タイムアウトが「0」に設定されていた場合、3ミリ秒を少し過ぎたところで切断されることが確認されました。

そして、当時のノースカロライナ大学のネットワークは100%スイッチングされていて、近くのネットワークのリモートホストに接続するまでの時間は「目的地までの光速による距離」で決まっていたとのこと。換算すると、リモート接続が切断される「3ミリ秒」は「およそ558マイル(約900km)」となり、この部分の設定が問題だったことが分かった……というわけです。

元になったエピソードからおよそ30年、話をハリス氏がネットに書き込んでから23年が経過した2025年。開発者のテッド・アナングスト氏は「技術が進歩して、500マイル以上離れた所にでもメールは送れるようになったのか?」という調査を行いました。ただし、まったく同じ環境で試すことはできないため、アナングスト氏は「すぐにタイムアウトするような、ノンブロッキング接続を行うコード」を書くところから始めています。以下が当該コード。

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <poll.h>
#include <netdb.h>
#include <err.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>

int
connect_wait(int s)
{
    struct pollfd pfd[1];
    int error = 0;
    socklen_t len = sizeof(error);

    pfd[0].fd = s;
    pfd[0].events = POLLOUT;

    error = poll(pfd, 1, 3);
    if (error == -1)
        return -1;
    if (error == 0) {
        errno = ETIMEDOUT;
        return -1;
    }
    if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len) == -1)
        return -1;
    if (error != 0) {
        errno = error;
        return -1;
    }
    return 0;
}
int
main(int argc, char **argv)
{
    struct addrinfo hints, *res, *res0;
    int error;
    int save_errno;
    int s;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    error = getaddrinfo(argv[1] ?: "www.openbsd.org", "www", &hints, &res0);
    if (error)
        errx(1, "%s", gai_strerror(error));
    s = -1;
    for (res = res0; res; res = res->ai_next) {
        s = socket(res->ai_family, res->ai_socktype | SOCK_NONBLOCK,
            res->ai_protocol);
        if (s == -1)
            continue;

        error = connect(s, res->ai_addr, res->ai_addrlen);
        if (error == -1 && errno == EINPROGRESS)
            error = connect_wait(s);
        if (error == -1) {
            warn("connect failure");
            close(s);
            s = -1;
            continue;
        }
        break;  /* okay we got one */
    }
    if (s == -1)
        return -1;
    printf("it's a live one!\n");
    freeaddrinfo(res0);
}


まずはいろいろな大学に接続を試みましたが、思ったような結果が出ず、アナングスト氏は「同じデータセンターでホストされているのではないか?」と推測。

そこで反対に、pingに現実的な時間がかかる学校を探す方向に転換。およそ500マイル離れたメイン大学やデイトン大学で、見事に接続がタイムアウトすることを確認しました。テスト開始前にアナングスト氏が予想したとおり、「2025年でも同じようなことになる」という結果になりました。

ちなみに、アナングスト氏は「カーネルは3ミリ秒を1カーネルティックとして10ミリ秒に切り上げるので、実際のタイムアウトは10ミリ秒~19ミリ秒になる」と説明しています。

また、詳細については疑問に感じる部分が多々あるはずだということで、ハリス氏が自らFAQを作成・公開しています。

FAQ on the 500-mile email
https://www.ibiblio.org/harris/500milemail-faq.html

ハリス氏によると「タイムアウト前に応答を得なければいけないので、3ミリ秒ではなく6ミリ秒にすべき話なのでは?」という点については、「無関係で面白くないと思ったので、詳細を省いた部分の1つ」だとのこと。

「Sendmail 5がSendmail 8のsendmail.cfファイルを読み込むはずがない」という点も、ハリス氏は「確かにそれはそう」と認めつつも、実際にSendmail 8向けのsendmail.cfファイルをSendmail 5で読み込めたという事実がある以上、SunOSに同梱されていたSendmail 5がなにか特別仕様だったと結論付けざるを得ないと述べました。

そもそも、元ネタはシステム管理者が集まるメーリングリストの「お気に入りの不可能なタスク」というスレッドに投稿した、同僚と共有する内輪話であり、こんなにも広がるとは思っていなかったので詳細を書かなかった部分があるとのこと。また、当時のメモやログをもう持っていないことから、改めて詳細を書くことも難しいと説明しています。

この記事のタイトルとURLをコピーする

・関連記事
Windows 7には「壁紙を単色にすると起動が遅くなる不具合」が存在していた - GIGAZINE

「全世界のTCP接続のうち20%が正常な接続ではない」という分析結果をCloudflareが公開 - GIGAZINE

南極からインターネットを使用して判明した「低速回線NGなサイト」とは? - GIGAZINE

Mastodonでリンクが共有される度に猛烈な負荷がリンク先のサーバーに襲いかかるという報告 - GIGAZINE

PHP標準のアプリケーションサーバー「PHP-FPM」から「NGINX Unit」に乗り換えるだけで約8倍も応答速度が改善したというテスト結果 - GIGAZINE

in メモ, Posted by logc_nt

You can read the machine translated English article Will the problem of not being able to se….