Регулирование сокета из-за того, что клиент недостаточно быстро считывает данные?

StackOverflow https://stackoverflow.com/questions/1395064

Вопрос

У меня есть соединение клиент / сервер через сокет TCP, при этом сервер записывает данные клиенту так быстро, как только может.

Просматривая мою сетевую активность, производственный клиент получает данные со скоростью около 2,5 Мбит / с.

Новый облегченный клиент, который я написал, чтобы просто прочитать и сравнить скорость, имеет скорость около 5,0 Мб / с (что, вероятно, примерно соответствует максимальной скорости, которую может передавать сервер).

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

Это было полезно?

Решение

В TCP это клиент.Если окно TCP сервера заполнено - ему нужно подождать, пока не поступит больше подтверждений от клиента.Это скрыто от вас внутри стека TCP, но TCP обеспечивает гарантированную доставку, что также означает, что сервер не может отправлять данные быстрее, чем скорость, с которой их обрабатывает клиент.

Другие советы

TCP имеет управление потоком, и это происходит автоматически.Читайте об этом на http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control

Когда канал заполняется из-за управления потоком, операции записи в сокет ввода-вывода сервера не будут завершены до тех пор, пока управление потоком не будет освобождено.

Сервер записывает данные со скоростью 5,0 Мбит / с, но если ваш клиент является здесь узким местом, то серверу приходится ждать, пока данные в "Отправленном буфере" будут полностью отправлены клиенту или освободится достаточно места для размещения большего количества данных.

Поскольку вы сказали, что облегченный клиент мог принимать со скоростью 5,0 Мбит / с, тогда вам нужно будет проверить операции после получения в вашем клиенте.Если вы получаете данные, а затем обрабатываете их перед тем, как прочитать больше данных, то это может быть узким местом.

Лучше получать данные асинхронно, и как только один прием будет завершен, попросите клиентские сокеты снова начать прием данных, пока вы обрабатываете полученные данные в отдельном потоке пула потоков.Таким образом, ваш клиент всегда доступен для получения входящих данных, а сервер может отправлять их на полной скорости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top