Обработка отброшенных пакетов TCP в C#

Главная причина для использования их или процентов состоит в том, чтобы позволить пользователю изменять размер текста, не повреждая дизайн. Если Вы разрабатываете со шрифтами, определенными в пкс, они не изменяют размер (в IE 6 и других), если пользователь выбирает размер текста - больше . Это очень плохо для пользователей с визуальными препятствиями.

Для нескольких примеров и статей о проектах как это (существует несметное число для выбора из), посмотрите последний выпуск Списка Независимо: Жидкие Сетки , более старая статья , Как Измерить текст в CSS или Dan Cederholm Пуленепробиваемый веб-дизайн .

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

так, как я лично презираю IE6, это в настоящее время только браузер, утвержденный для объема пользователей в нашей компании Fortune 200.

7
задан Nosrama 26 August 2009 в 22:59
поделиться

4 ответа

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

То, что вы видите, скорее всего, является результатом алгоритма Нэгла. Что он делает, так это вместо того, чтобы отправлять каждый бит данных по мере их публикации, он отправляет один байт, а затем ожидает подтверждения от другой стороны. Во время ожидания он объединяет все остальные данные, которые вы хотите отправить, и объединяет их в один большой пакет, а затем отправляет его. Поскольку максимальный размер для TCP составляет 65 КБ, он может объединить довольно много данных в один пакет, хотя это крайне маловероятно, особенно с учетом того, что размер буфера Winsock по умолчанию составляет около 10 КБ или около того (я забыл точное количество). Кроме того, если максимальный размер окна получателя меньше 65 КБ, он отправит только столько, сколько было объявлено последним размером окна получателя. Размер окна также влияет на алгоритм Нэгла с точки зрения того, сколько данных он может агрегировать перед отправкой, потому что он не может отправить больше, чем размер окна.

Причина, по которой вы видите это, заключается в том, что в Интернете, в отличие от вашей сети , для возврата этого первого подтверждения требуется больше времени, поэтому алгоритм Наггла объединяет больше ваших данных в один пакет. Локально возврат происходит мгновенно, поэтому он может отправлять ваши данные так быстро, как вы можете отправить их в сокет. Вы можете отключить алгоритм Naggle на стороне клиента с помощью SetSockOpt (winsock) или Socket.SetSocketOption (.Net), но я настоятельно рекомендую вам НЕ отключать Naggling на сокете, если вы не на 100% уверены, что знаете, что делаете. Это произошло по очень хорошей причине.

s на стороне клиента, используя SetSockOpt (winsock) или Socket.SetSocketOption (.Net), но я настоятельно рекомендую НЕ отключать Naggling на сокете, если вы не на 100% уверены, что знаете, что делаете. Это произошло по очень хорошей причине.

s на стороне клиента, используя SetSockOpt (winsock) или Socket.SetSocketOption (.Net), но я настоятельно рекомендую НЕ отключать Naggling на сокете, если вы не на 100% уверены, что знаете, что делаете. Это произошло по очень хорошей причине.

3
ответ дан 6 December 2019 в 23:11
поделиться

Это определенно не ошибка TCP. TCP гарантирует своевременную доставку в порядке и один раз.

Какие строки «отсутствуют»? Держу пари, это последние; попробуйте сбросить с передающей стороны.

Более того, ваш "протокол" здесь (я говорю о протоколе прикладного уровня, который вы изобретаете) отсутствует: вам следует рассмотреть возможность отправки # объектов и / или их длины, чтобы получатель знает, когда он фактически закончил их получать.

3
ответ дан 6 December 2019 в 23:11
поделиться

Что ж, в вашем коде есть одна ошибка, с которой вы начинаете, если вы подсчитываете количество вызовов Receive , которые завершились: вы, кажется, предполагаете, что вы ' Вы увидите, сколько вызовов Receive завершится, сколько вы сделали вызовов Send .

TCP - это протокол , основанный на потоке - вам не следует беспокоиться об отдельных пакеты или чтения; вам следует позаботиться о чтении данных, ожидая, что иногда вы не получите все сообщение в одном пакете, а иногда вы можете получить более одного сообщения за одно чтение. (Одно чтение также может не соответствовать одному пакету.)

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

4
ответ дан 6 December 2019 в 23:11
поделиться

Какова длина каждой струны? Если они не являются точно 1024 байтами, они будут объединены удаленным стеком TCP / IP в один большой поток, большие блоки которого вы читаете в своем вызове Receive.

Например, используя три вызова Send для отправки " A »,« B »и« C », скорее всего, будут приходить к вашему удаленному клиенту как« ABC »(поскольку либо удаленный стек, либо ваш собственный стек будут буферизовать байты, пока они не будут прочитаны). Если вам нужно, чтобы каждая строка приходила без объединения с другими строками, попробуйте добавить «протокол» с идентификатором, чтобы показать начало и конец каждой строки, или, альтернативно настройте сокет , чтобы избежать буферизации и комбинирование пакетов.

1
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: