Буфер сокета TCP для каждого потока

835
amer m

Создает ли ядро ​​linux буфер для каждого TCP-соединения, например, когда у нас 1000 tcp-соединений, ядро ​​создает буфер 1000 сокетов и сохраняет пакеты отдельного потока в своем буфере сокетов? ИЛИ все потоки TCP совместно используют один большой буфер сокета TCP. Это означает, что все пакеты хранятся в общем буфере сокета TCP.

Спасибо амер

0

1 ответ на вопрос

1
David Schwartz

Полученные пакеты хранятся в буфере до тех пор, пока они не будут обработаны, но после обработки они отбрасываются. Переданные пакеты сохраняются в буфере до тех пор, пока они не могут быть переданы, но затем они отбрасываются.

Для каждого TCP-соединения есть некоторая информация о состоянии, содержащая основную информацию о TCP-соединении. Также имеется буфер исходящих данных уровня приложения, которые еще не были подтверждены другой стороной, и буфер данных, которые были получены, но еще не прочитаны локальным приложением. Но они содержат байты данных уровня приложения, а не пакеты.

Спасибо за эту полезную информацию. Имеет ли исходящий буфер уровня приложения общий доступ ко всем исходящим потокам этого приложения или каждый поток имеет свой собственный буфер. Исходя из этого примера, у нас будет 1000 буферных сокетов tcp или один общий буферный сокет tcp, при условии, что приложение основано на tcp. amer m 7 лет назад 0
Само приложение может использовать общие буферы, но ядро ​​будет иметь отдельный исходящий буфер для каждого соединения, которое содержит неподтвержденные данные. Если памяти недостаточно, вы можете уменьшить размер буферизации ядра и сделать больше буферизации в приложении, где вы можете реализовать совместное использование буфера. Пропускная способность TCP может немного снизиться, но это может быть не так важно, в зависимости от вашего варианта использования. David Schwartz 7 лет назад 0
Из вашего объяснения я понимаю, что окно перегрузки TCP работает в буфере TCP уровня приложения, где этот буфер используется всеми потоками, инициированными из одного и того же приложения, такими как все потоки FTP совместно используют один и тот же исходящий буфер tcp. Кажется ли это противоречит концепции, что ядро ​​создает буфер сокета tcp для каждого соединения tcp !!? Спасибо amer m 7 лет назад 0
Нет нет нет. Вы совершенно не поняли меня. Ядро запускает окно перегрузки TCP, используя только свой буфер, который нельзя использовать совместно. Приложение может использовать общие буферы, если оно хочет, но большинство этого не делает. David Schwartz 7 лет назад 0
В журнале сетевого стека Linux есть IP-стек, буферы Qdisc и кольцевой буфер. У меня возникло недоразумение между буфером TCP, в котором работает окно перегрузки, и очередью отправки сокета TCP (буфер) или очередью приема сокета TCP, где, как мне кажется, ядро ​​создает одну очередь на TCP-соединение, НО у меня нет ресурсов, которые бы указали это. Можете ли вы объяснить это мне? Спасибо amer m 7 лет назад 0
Существует ядро ​​отправки и получения очереди для каждого соединения TCP. Он содержит данные приложения, а не пакеты. Очередь отправки содержит данные, которые еще не были подтверждены другой стороной. Очередь приема содержит данные, которые еще не были приняты локальным приложением. Алгоритмы перегрузки TCP и другие используют эти очереди. David Schwartz 7 лет назад 0