【问题标题】:The sever send SYN/ACK after receive SYN from client immediately服务器在收到客户端的 SYNC 后立即发送 SYN/ACK
【发布时间】:2018-07-02 16:45:34
【问题描述】:

我有时会发现来自客户端超时的请求。我在服务器端使用 tcpdump 来捕获一些特殊的 tcp 数据包,如下所示。似乎没有丢包。为什么服务器收到第一个 SYN 后没有回复客户端? enter image description here

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 220
CLOSE_WAIT 1
ESTABLISHED 496
FIN_WAIT1 42
FIN_WAIT2 2
TIME_WAIT 72588

sysctl -a | 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_available_congestion_control = cubic reno
net.ipv4.tcp_base_mss = 512
net.ipv4.tcp_challenge_ack_limit = 100
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_early_retrans = 3
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_fack = 1
net.ipv4.tcp_fastopen = 0
net.ipv4.tcp_fastopen_key = fc1980cc-2a3369bf-91223671-bb8e012f
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_frto = 2
net.ipv4.tcp_init_cwnd = 10
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_limit_output_bytes = 131072
net.ipv4.tcp_loss_init_cwnd = 1
net.ipv4.tcp_low_latency = 0
net.ipv4.tcp_max_orphans = 524288
net.ipv4.tcp_max_ssthresh = 0
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 524288
net.ipv4.tcp_mem = 761319   1015094 1522638
net.ipv4.tcp_min_tso_segs = 2
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_no_delay_ack = 0
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_orphan_retries = 0
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 = 4096    87380   6291456
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 = 1
net.ipv4.tcp_tso_win_divisor = 3
net.ipv4.tcp_tw_ignore_syn_tsval_zero = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_recycle_private_only = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096    16384   4194304
net.ipv4.tcp_workaround_signed_windows = 0

我曾尝试设置 tcp_tw_reuse tcp_tw_recycle 并增加 tcp_max_syn_backlog 。仍然出现错误:error=HTTP 599: Timeout while connected,headers=tornado.httputil.HTTPHeaders object at 0x7f74ed884860,reason='Unknown'

【问题讨论】:

  • 您的标题与您的问题相矛盾。离题。

标签: tcp tornado syn


【解决方案1】:

可能服务器的TCP连接积压已满。

man page of listen 说:

如果底层协议支持 重传,请求可能会被忽略,以便稍后重试 at 连接成功。

尝试增加服务器的listen()调用的backlog参数值。

【讨论】:

  • 我使用命令ss -lt,并找到信息“LISTEN 128 128 *.45828”。我只是重置“sysctl -w net.core.somaxconn=10000”来解决问题。这意味着服务器端处理 tcp 包的速度太慢。
  • 重置“sysctl -w net.core.somaxconn=10000”并重启服务器,然后我检查ss -lt,得到信息“LISTEN 2333 10000 *.45828”。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2020-05-05
  • 2023-03-23
  • 2015-07-04
相关资源
最近更新 更多