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