Недавно передо мной стояла задача определить, почему скорость передачи трафика между нашим сервером приложений и конкретным единственным IP-адресом составляет 160 кбит/с, тогда как весь остальной трафик в обеих системах составляет 10 -100 Мбит/с.
Регулировка была уникальной для этих двух конечных точек, взаимодействующих друг с другом.
Я безуспешно проверил все очевидные решения по формированию и управлению трафиком.
Наконец, проанализировав некоторые перехваченные пакеты, я заметил, что флаг ECN устанавливается только при передаче между этими двумя конечными точками.
Оказалось, что клиент запрашивал явное уведомление о перегрузке (ECN )и устанавливал Congestion Experienced (CE )во всех пакетах SYN, заставляя сервер реагировать, снижая скорость передачи для уменьшения перегрузки. Флаг CE устанавливается в значащих цифрах поля дифференцированных услуг.
Вы можете проверить настройки своего Linux-сервера (/proc/sys/net/ipv4/tcp _ecn )с помощью следующей команды:
sysctl -a | grep _ecn
Установите TCP _ecn с помощью:
sysctl net.ipv4.tcp_ecn=2
Возможные значения::
0 - Disable ECN. Neither initiate nor accept ECN.
1 - Enable ECN when requested by incoming connections and also request ECN on outgoing connection attempts.
2 - Enable ECN when requested by incoming connections but do not request ECN on outgoing connections.Default: 2
Я использовал tcpdump и WireShark, чтобы убедиться, что код CE действительно передается.
Запустите захват с помощью tcpdump, сохраните его в файле pcap, запустите запрос, который хотите захватить, а затем нажмите Ctl+c, чтобы остановить захват:
tcpdump -I any -w my_capture.pcap
Затем вы можете открыть этот pcap в WireShark и использовать фильтры, чтобы увидеть, происходит ли это.
Все пакеты, использующие ECN:
tcp.flag.ecn==1
Все пакеты отправляются с перегрузкой:
ip.dsfield.ecn==3
Я не уверен, что это решит эту конкретную проблему, но ОП запросил какие-либо возможности. Надеюсь, что кто-то, кто наткнется на этот пост и не знает, что еще проверить, сочтет эту информацию полезной и не будет тратить дни на проверку файлов конфигурации.
В конце концов я установил сервер tcp _ecn на 0, и пропускная способность сразу же подскочила до нормального диапазона. Это временное исправление, пока мы определяем, почему клиент отправляет флаг CE в пакетах SYN. Я читал, что некоторые системы могут таким образом договариваться об использовании ECN, но это совсем другая тема.