Мой коллега полагал, что это из-за физической дистанции, хотя я не думаю, что это имеет значение. Насколько я понимаю, после того, как вы выполнили начальное рукопожатие и поток данных начался, не имеет значения, где находится сервер, и результат должен быть почти таким же. Я что-то здесь упускаю? Как это действительно работает?
Вы оба были правы в какой-то момент истории, но ваше понимание в основном верно ... сегодня :). Есть несколько факторов, которые изменились между старым ответом вашего друга и возможностями, которые мы имеем сегодня.
- TCP Window Scaling
- Настройка буфера хоста
На разницу в результатах, которые вы видели, могли повлиять:
- Потеря пакета
- Параллельные TCP-передачи
TCP Window Scaling: эффект задержки полосы пропускания
Как упомянул ваш друг, более старые реализации TCP страдали от ограничений, наложенных первоначальным размером 16-битного окна приема в заголовке TCP (ссылка RFC 793: раздел 3.1 ); RWIN контролирует, сколько неподтвержденных данных может ждать в одном сокете TCP. 16-битный RWIN оценивает ограниченные интернет-тракты с продуктами с высокой пропускной способностью и задержкой (и многие современные высокоскоростные интернет-соединения будут ограничены 16-битным значением).
Для высоких значений RTT полезно иметь очень большой RWIN. Например, если ваш RTT пути из Малайзии в США составляет около 200 мс, исходный TCP RWIN будет ограничивать вас до 2,6 Мбит / с.
Максимальная пропускная способность = Rcv_Win / RTT
* Максимальная пропускная способность = 65535 * 8 / 0.200 *
Максимальная пропускная способность = 2,6 Мбит / с
RFC 1323 определил некоторые «параметры TCP» для преодоления этих ограничений; Одним из таких параметров TCP является «масштабирование окна». Он вводит масштабный коэффициент, который умножает исходное значение RWIN, чтобы получить полное значение окна приема; использование параметров масштабирования окна допускает максимальный RWIN в размере 1073725440 байт. Применяя те же расчеты:
Максимальная пропускная способность = Rcv_Win / RTT
* Максимальная пропускная способность = 1073725440 * 8 / 0.200 *
Максимальная пропускная способность = 42,96 Гбит / с
Имейте в виду, что TCP увеличивает RWIN постепенно в течение всей передачи, если потеря пакетов не является проблемой. Чтобы увидеть действительно большие скорости передачи по соединению с высокой задержкой, вы должны передать большой файл (чтобы у TCP было время увеличить окно), и потеря пакетов не может быть проблемой для соединения.
Потеря пакета
Интернет-каналы через Тихий океан временами оказываются перегруженными. Некоторые из моей семьи живут на Тайване, и мы обычно сталкиваемся с проблемами, когда мы используем Google Talk с ними. Я часто вижу потерю пакетов более 0,5%, когда я пингую их линию DSL из США; если вы видите что-то вроде 0,5% потерь для «медленного» сервера, это очень легко ограничит пропускную способность в одном сокете TCP.
Параллельные потоки TCP
К вашему сведению, некоторые сайты для тестирования скорости используют параллельные потоки TCP для увеличения пропускной способности ; это может повлиять на результаты, которые вы видите, потому что параллельные потоки TCP значительно увеличивают пропускную способность в случае потери пакетов в пути. Я видел, как четыре параллельных потока TCP полностью насыщали кабельный модем 5 Мбит / с, который страдал от постоянной потери пакетов на 1%. Обычно потеря в 1% снижает пропускную способность одного потока TCP.
Бонусный материал: Host Buffer tuning
Многие старые реализации ОС имели сокеты с ограниченными буферами; на более старых ОС (например, Windows 2000) не имело значения, позволял ли TCP запускать большие объемы данных ... их буферы сокетов не были настроены для использования преимуществ большого RWIN. Было проведено много исследований, чтобы обеспечить высокую производительность при передаче TCP . Современные операционные системы (для этого ответа мы можем назвать Windows Vista и более поздние «современными») включают улучшенные механизмы распределения буферов в свои реализации буфера сокетов.