如何在 linux/macos 中检查 TCP 超时?

gri*_*yvp 12 mac-osx tcp

我的 MacOS 出现网络问题,需要进行故障排除。我知道 TCP 套接字有内部超时,如果远程方没有响应(但也没有正常断开连接),它将关闭连接。我可以使用任何命令/工具来检查此超时的确切值吗?

fuz*_*Tew 16

您可以使用以下命令查看所有系统设置的 tcp 值

$ sysctl net.inet.tcp
Run Code Online (Sandbox Code Playgroud)

从 tcp_var.h、tcp_subr.c 和 tcp_timer.c 解释:

  • net.inet.tcp.keepidle = 保持活动空闲计时器
  • net.inet.tcp.keepintvl = 发送 keepalives 的间隔
  • net.inet.tcp.keepinit = 建立同步超时
  • 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。时间以毫秒为单位。


小智 5

对于 linux,您可以使用:

$ sysctl -a | grep net.ipv4
Run Code Online (Sandbox Code Playgroud)