На моєму сервері є один великий файл. Я вважаю, що завантаження з декількох ниток може отримати 20 Мбіт, але одна нитка може отримати 10 Мбіт / с, хтось може це пояснити?
На моєму сервері є один великий файл. Я вважаю, що завантаження з декількох ниток може отримати 20 Мбіт, але одна нитка може отримати 10 Мбіт / с, хтось може це пояснити?
Відповіді:
Зазвичай це відбувається тому, що десь між вами та іншим сервером є брандмауер, що обмежує кожен потік HTTP до 10 Мбіт / с. Коли ви використовуєте багатопотокові, ви отримуєте 2x 10Mb (по одному для кожної нитки).
Це пов’язано з вашим ping між вами та сервером та розміром вікна / розміром вікна tcpip, який використовується вашим завантажувальним програмним забезпеченням.
В основному, якщо у вас 100мс пінг-сервер і запитують пакети 100кб, ви можете отримати лише 10 пакетів в секунду, використовуючи 1 з'єднання, навіть якщо швидкість вашого інтернету нескінченна.
TCP найкраще працює, коли ви "тримаєте трубку повною" - коли програма, що надсилає, постійно надсилає буфери досить швидко, щоб постійно відсилати стек TCP відправника з даними, щоб він міг завжди мати дані "в польоті" в мережі та коли приймач додаток постійно читає з приймача TCP стек досить швидко, щоб вікно TCP приймача ніколи не заповнювалося (знову-таки, тому відправляючий стек TCP завжди може зберігати дані "в польоті" в мережі).
Я міг би уявити погано написане однопотокове додаток відправника, який передає один буфер до стеку TCP, чекає, коли він повністю Acked, а потім передає інший буфер. Це означає, що як тільки кінець першого буфера "в польоті" в мережі, відправляючий стек TCP голодує для передачі даних, що означає, що труба стікає і не поповнюється доти, доки Ack не повернеться і додаток, що надсилає. передає йому новий буфер.
Я також міг уявити погано написаний однопотоковий приймач, який не читає з приймаючого стека TCP досить швидко, і таким чином дозволяє буферам стека TCP заповнюватися, що означає, що вікно TCP заповнюється, що призводить до надсилання стека TCP на припинити надсилання, поки вікно не відкриється. Збільшення розміру вікна TCP приймача може трохи допомогти, але справжнім рішенням для цього є швидше зчитувати дані.
Ну, це, мабуть, тому, що ви можете передати стільки даних лише за одне з'єднання. Однак у багатопотоковій програмі ви можете мати два з'єднання, що приймають дані одночасно, і подвоювати кількість інформації, яку ви можете отримати. Для цього є деякі обмеження, наприклад, швидкість роботи сервера, з якого ви завантажуєте ... Шапки з двох, хто написав багатопотоковий завантажувач, записати їх непросто.