Подтвердить что ты не робот

Что означает сброс сокета?

Я действительно мало знаю о сокетах, кроме как читать и писать им, как если бы они были файлами. Я немного разбираюсь в использовании селекторов сокетов. Я не понимаю, почему вам нужно скрывать сокет, что на самом деле происходит там? Биты просто болтаются где-то в памяти, пока их не оттолкнут? Я читал некоторые вещи в Интернете о сокетах, но все это очень абстрактно и на высоком уровне.

Что на самом деле происходит здесь?

4b9b3361

Ответ 1

В процессе написания сетевого сокета и отправки данных существует определенное количество накладных расходов. Если данные были отправлены каждый раз, когда байт вошел в сокет, вы получите 40 + байтов заголовка TCP для каждого байта фактических данных. (Предположим, что вы используете сокет TCP, конечно. Другие сокеты будут иметь разные значения). Чтобы избежать такой неэффективности, сокет поддерживает локальный буфер, который обычно несколько превышает 1000 байтов. Когда этот буфер заполняется, заголовок обтекает данные, и пакет отправляется в пункт назначения.

Во многих случаях вам не нужно, чтобы каждый пакет отправлялся немедленно; если вы передаете файл, ранние данные могут быть бесполезны без окончательных данных файла, поэтому это хорошо работает. Однако, если вам нужно принудительно отправить данные, которые необходимо отправить немедленно, сброс буфера отправит любые данные, которые еще не отправлены.

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

Ответ 2

Вы не можете на самом деле сбросить сокет.

(Из Как заставить сокет отправлять данные в его буфер?)

Вы не можете заставить его. Период. TCP делает свое мнение о том, когда он могут отправлять данные. Теперь, обычно, когда вы вызываете write() в сокет TCP,
TCP действительно отправит сегмент, но нет никакой гарантии и никакого способа заставить это. Существует много причин, по которым TCP не отправляет сегмент: закрытое окно и алгоритм Нагле - это две вещи, чтобы сразу приходят в голову.

Прочитайте полный пост, он довольно подробно и многое прояснил для меня.

Ответ 3

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

Чем больше полезная нагрузка данных, тем меньше потерянная пропускная способность, потому что заголовок имеет (в основном) фиксированный размер. Кроме того, промежуточные системы, как правило, имеют ограничения производительности, основанные более значительно на скорости передачи пакетов, а не на общей скорости передачи данных.

Ответ 4

Я не использовал флеш для программирования сокетов. Я где-то помню, что есть режимы, которые вы можете установить, где потоковые ориентированные отправления пытаются уменьшить количество отправленных небольших пакетов. Однако вы должны использовать sendall(), чтобы убедиться, что все в буфере отправлено.

Функция shutdown() очень полезна, поскольку вы наматываетесь вниз. Конечно, вы должны использовать вызов close(), если вы не хотите, чтобы все зависало.

Посмотрите руководство Beej для получения дополнительной информации.