Мій колега вважав, що це через фізичну відстань, тоді як я не думаю, що це має значення. Я розумію, що після того, як ви виконали початкове рукостискання і розпочався потік даних, не має значення, де розташований сервер, і результат повинен бути майже однаковим. Я чогось тут пропускаю? Як це насправді працює?
Ви обидва мали рацію в якийсь момент історії, але ваше розуміння здебільшого правильне ... сьогодні :). Є кілька факторів, які змінилися між старішою відповіддю, яку дав ваш друг, та можливостями, якими ми сьогодні володіємо.
- Масштабування вікон TCP
- Настройка буфера хосту
На різницю результатів, які ви побачили, може вплинути:
- Втрата пакету
- Паралельні передачі TCP
Масштабування вікон TCP: ефект затримки пропускної здатності
Як згадував ваш друг, старші реалізації 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
FYI, деякі веб-сайти для тестування швидкості використовують паралельні потоки TCP для збільшення пропускної здатності ; це може вплинути на результати, які ви бачите, оскільки паралельні потоки TCP різко збільшують пропускну здатність у випадку, якщо у вас є певна втрата пакету на шляху. Я бачив чотири паралельних потоки TCP повністю насичують кабельний модем 5 Мбіт / с, який страждав від 1% постійної втрати пакету. Зазвичай втрати на 1% знижують пропускну здатність одного потоку TCP.
Матеріал бонусу: налаштування буфера господаря
Багато старих реалізацій ОС мали сокети з обмеженими буферами; зі старшою ОС (як Windows 2000), неважливо, чи дозволяв TCP велику кількість даних у польоті ... їхні буфери сокетів не були настроєні, щоб скористатися великим RWIN. Було проведено багато досліджень, щоб забезпечити високу ефективність передачі TCP . Сучасні операційні системи (для цієї відповіді ми можемо назвати Windows Vista, а пізніше "сучасні") включають в себе кращі механізми розподілу буферів у своїх реалізаціях буфера сокета.