Назад | Перейти на главную страницу

TCP Duplicate Ack без потери пакетов

У меня есть отправитель с IP-адресом 192.168.2.250, работающий со встроенной ОСРВ, и получатель с Linux 4.9.x на IP-адрес 192.168.2.1.

Приемник настроен как беспроводная точка доступа, а отправитель напрямую подключен к получателю через Wi-Fi.

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

Кто-нибудь знает, что может вызывать поведение получателя?

Изменить: вы не видите быстрых повторных передач от отправителя, потому что я отключил их, чтобы доказать, что в потоке не отсутствуют данные (и пропускная способность сильно выросла из-за этого). Одним из объяснений может быть то, что пакеты TCP обнаруживаются не по порядку. Могу ли я сделать Linux более устойчивым к выходящим из строя пакетам? Например, если не отправлять дублирующие подтверждения немедленно.

выход sysctl net | grep tcp

net.ipv4.tcp_abort_on_overflow=0
net.ipv4.tcp_adv_win_scale=1
net.ipv4.tcp_allowed_congestion_control=cubic reno
net.ipv4.tcp_app_win=31
net.ipv4.tcp_autocorking=1
net.ipv4.tcp_available_congestion_control=cubic reno
net.ipv4.tcp_base_mss=1024
net.ipv4.tcp_challenge_ack_limit=1000
net.ipv4.tcp_congestion_control=cubic
net.ipv4.tcp_delack_seg=1
net.ipv4.tcp_dsack=1
net.ipv4.tcp_early_retrans=3
net.ipv4.tcp_ecn=2
net.ipv4.tcp_ecn_fallback=1
net.ipv4.tcp_fack=1
net.ipv4.tcp_fastopen=1
net.ipv4.tcp_fin_timeout=60
net.ipv4.tcp_frto=2
net.ipv4.tcp_fwmark_accept=0
net.ipv4.tcp_invalid_ratelimit=500
net.ipv4.tcp_keepalive_intvl=75
net.ipv4.tcp_keepalive_probes=9
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_limit_output_bytes=262144
net.ipv4.tcp_low_latency=0
net.ipv4.tcp_max_orphans=16384
net.ipv4.tcp_max_reordering=300
net.ipv4.tcp_max_syn_backlog=128
net.ipv4.tcp_max_tw_buckets=16384
net.ipv4.tcp_mem=332494433366498
net.ipv4.tcp_min_rtt_wlen=300
net.ipv4.tcp_min_tso_segs=2
net.ipv4.tcp_moderate_rcvbuf=1
net.ipv4.tcp_mtu_probing=0
net.ipv4.tcp_no_metrics_save=0
net.ipv4.tcp_notsent_lowat=4294967295
net.ipv4.tcp_orphan_retries=0
net.ipv4.tcp_pacing_ca_ratio=120
net.ipv4.tcp_pacing_ss_ratio=200
net.ipv4.tcp_probe_interval=600
net.ipv4.tcp_probe_threshold=8
net.ipv4.tcp_recovery=1
net.ipv4.tcp_reordering=3
net.ipv4.tcp_retrans_collapse=1
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=15
net.ipv4.tcp_rfc1337=0
net.ipv4.tcp_rmem=4096873806291456
net.ipv4.tcp_sack=1
net.ipv4.tcp_slow_start_after_idle=1
net.ipv4.tcp_stdurg=0
net.ipv4.tcp_syn_retries=6
net.ipv4.tcp_synack_retries=5
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_thin_dupack=0
net.ipv4.tcp_thin_linear_timeouts=0
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_tso_win_divisor=3
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
net.ipv4.tcp_use_userconfig=0
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_wmem=4096163844194304
net.ipv4.tcp_workaround_signed_windows=0

По какой-то причине .250 отправляет старые значения ACK для уже полученных SEQ. См. Пакет № 551: .1 состояния SEQ=290541. В пакете №552, .250 говорит ACK=267181. Следовательно, поскольку .250 номер подтверждения (267181) меньше, чем .1 порядковый номер (290541), .1 предполагает, что .250 потерян # 551, потому что все пакеты между # 552 и # 558 используют устаревшие SEQ=267181 и отправлять еще один ACK для каждого полученного пакета с устаревшим номером ACK.

Если ОСРВ не сообщает об отсутствии потерь, мы можем только предположить, что ее планировщик отдает приоритет отправке данных, а не обработке подтверждений.