我的 MacOS 出现了网络问题,需要排除故障。我知道 TCP 套接字具有内部超时功能,如果远程方没有响应,它将关闭连接(但也不会正常断开连接)。是否有任何命令/工具可用于检查此超时的确切值?
答案1
在 macOS 上,你可以使用以下命令查看所有系统设置的 tcp 值
$ sysctl net.inet.tcp
从 tcp_var.h、tcp_subr.c 和 tcp_timer.c 解释:
- net.inet.tcp.keepidle = 保持活动空闲计时器
- net.inet.tcp.keepintvl = 发送 keepalive 的间隔
- net.inet.tcp.keepinit = 建立 syn 的超时时间
- net.inet.tcp.mssdflt = 默认 TCP 最大段大小
- net.inet.tcp.v6mssdflt = IPv6 的默认 TCP 最大段大小
- net.inet.tcp.minmss = 最小 TCP 最大段大小
- net.inet.tcp.minmssoverload = 每秒允许低于 MINMSS 大小的 TCP 段数
- net.inet.tcp.rfc1323 = 启用 rfc1323(高性能 TCP)扩展
- net.inet.tcp.rfc1644 = 启用 rfc1644 (TTCP) 扩展
- net.inet.tcp.do_tcpdrain = 在 mbufs 不足时启用 tcp_drain 例程以获得额外帮助
- net.inet.tcp.pcbcount = 活跃 PCB 数量
- net.inet.tcp.icmp_may_rst = 某些 ICMP 不可达消息可能会中止 SYN_SENT 中的连接
- net.inet.tcp.strict_rfc1948 = 确定是否严格遵循 RFC1948
- net.inet.tcp.isn_reseed_interval = 重新播种 ISN 密钥的秒数
- net.inet.tcp.background_io_enabled = 后台 IO 已启用
- net.inet.tcp.rtt_min = 允许的最小 rtt 值
- net.inet.tcp.randomize_ports = 随机化 TCP 端口号
- net.inet.tcp.tcbhashsize = TCP 控制块哈希表的大小
- net.inet.tcp.msl = 最大段生存期
- net.inet.tcp.always_keepalive = 假设所有 TCP 连接都为 SO_KEEPALIVE
- net.inet.tcp.broken_peer_syn_rxmit_thres = 在其余尝试期间,TCP 禁用 rfc1323 和 rfc1644 之前重新传输的 SYN 数
- net.inet.tcp.pmtud_blackhole_detection = 路径 MTU 发现黑洞检测
- net.inet.tcp.pmtud_blackhole_mss = 路径 MTU 发现黑洞检测降低 MSS
我相信,如果设置了 SO_KEEPALIVE,则默认情况下会在关闭连接之前发送 8 个 keepalive。时间以毫秒为单位。
答案2
对于 Linux,你可以使用:
$ sysctl -a | grep net.ipv4
答案3
我不确定这是否是您要找的,但您可以使用以下方法检查保持活动值:
$ netstat -o
答案4
在 Linux 上,建立 TCP 连接的初始超时时间未配置为以秒为单位的值。相反,有一个硬编码初始 RTO(重传超时)1 秒,可配置重试次数(带指数退避)。引用内核文档:
tcp_syn_retries- INTEGER
重新传输主动 TCP 连接尝试的初始 SYN 的次数。不应高于 127。默认值为 6,这对应于距离最后一次重传还有 63 秒,而当前的初始 RTO 为 1 秒。这是最后的超时 主动 TCP 连接尝试将在 127 秒后发生。
据说,具体默认值可能因发行版而异。您可以cat /proc/sys/net/ipv4/tcp_syn_retries
查看当前配置的值。
如果你正在使用systemd-sysctl.service
,您可以通过在 /etc/sysctl.d/*.conf 中创建文件来覆盖此设置,例如:
sudo bash -c 'echo "sys.net.ipv4.tcp_syn_retries = 4" >> /etc/sysctl.d/local.conf'
sudo reboot