Почему небольшие TCP-соединения проходят успешно, а большие — нет?

Почему небольшие TCP-соединения проходят успешно, а большие — нет?

Иногда в системе Linux я наблюдаю следующее странное поведение:

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

Например, сейчас я проложил соединение через свой ноутбук ( -j MASQUERADE) и наблюдаю следующую вещь: если я делаю небольшое TCP-соединение (сервер отправляет мне мало данных), то происходит следующее:

# nc 86.57.151.3 80
GET /404
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

/proc/net/ip_conntrack был tcp 6 431998 ESTABLISHED src=192.168.99.9 dst=86.57.151.3 sport=49104 dport=80 src=86.57.151.3 dst=93.125.21.218 sport= 80 dport=49104 [ASSURED] mark=0 use=2до того, как я набрал «GET /404».

Но когда я делаю большую связь:

root@localhost:~# nc 86.57.151.3 80
GET /

Он зависает. До того, как я ввожу "GET /", он показывает ESTABLISHED ASSURED, как обычно, но после того, как я нажимаю Return, он переходит на tcp 6 0 CLOSE_WAIT src=192.168.99.9 dst=86.57.151.3 sport=56991 dport=80 src=86.57.151.3 dst=93.125.21.218 sport=80 dpo rt=56991 [ASSURED] mark=0 use=2. Пакет с не получен. Когда я наконец нажимаю Ctrl+C, он отправляет FIN на сервер, и Wireshard жалуется, что FIN сервера "Out-of-order". Как будто упакованный ответ где-то потерялся.

Когда я делаю то же самое nc 86.57.151.3 80/ GET /с роутера, все работает.

Как устранить неисправность?

решение1

Это проблема с MTU и отфильтрованными сообщениями ICMP.

Обходной путь — настройка MTU на клиентском устройстве или использование ограничения TCP MSS на маршрутизаторе:

iptables -t mangle -A FORWARD -o ppp4 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Связанный контент