Буфер, на который ссылаются сокеты BSD и документация POSIX, а также, по-видимому, на то, что вы читали, представляет собой буферизатор , а не для каждой системы или для каждого приложения. Это то же самое, что вы можете установить с помощью SO_SNDBUF
. Когда этот буфер заполнен, send
заблокирует.
Но вопрос в том, зачем этот буфер заполнить?
Под ядром, которое может видеть ваше приложение, ядро обычно имеет нечто вроде кольца передающих буферов на сетевой адаптер. Когда сетевой адаптер завершает установку данных на буфере из проводника, он вытягивает еще один из кольца. Когда на кольце есть место, он вытягивает другой буфер передачи из одного из буферов сокета. Или, если слишком много буферов, ожидающих, оно отбрасывает некоторые из них, а затем тянет одно. Итак, эта часть - это общесистемная (или, по крайней мере, NIC-wide).
Итак, просто зная, что ваш размер буфера отправки действительно не говорит вам все, что вам действительно нужно, и чтобы по-настоящему понять это, вам нужно задавать вопросы, специфичные для вашего ядра. Если это Linux или * BSD, сетевой стек является открытым исходным кодом и довольно хорошо документирован (в Linux, если я правильно помню, и если мои знания в 2,4 раза по-прежнему полезны, поиск SO_SNDBUF
и txqueuelen
даст вам хорошие отправные точки); иначе это может быть не так. Конечно, Linux предоставляет всю информацию, которую можно найти где-то в файловой системе /proc
, поэтому, узнав, что вы хотите найти, вы можете ее найти. * BSD не раскрывает столько же, но там много чего. Даже Windows имеет множество счетчиков производительности, которые имеют значение.
Вы ищете полностью общий, переносимый ответ или практический ответ для определенной платформы? – abarnert
Между тем, это действительно не вопрос Python; «Сокет» Python - это всего лишь тонкий слой над дескриптором файла (BSD) или дескриптором (WinSock) WSA, и, пометив эту специфику Python, вы ограничиваете число людей, которые будут видеть и отвечать на это. – abarnert
@abarnert просто удалил тег python. – user3571278