macos tcp接收缓冲区默认64kb偏小,需按链路特性调优至512kb并启用rfc1323;须同步确保千兆全双工、匹配mtu及禁用awdl,避免mbuf耗尽。

macOS 的网络套接字缓冲区(主要是 TCP 接收缓冲区)默认值偏小,尤其在高延迟、高带宽或 USB 扩展坞等链路下,容易导致接收窗口过早收缩、ACK 频繁触发、吞吐下降。调优目标不是“越大越好”,而是匹配实际路径特性——让单次 ACK 能覆盖更多数据,减少往返等待。
确认当前缓冲区大小
终端执行以下命令查看实时设置:
- 接收空间:sudo sysctl net.inet.tcp.recvspace → 默认通常为 65536(64KB)
- 发送空间:sudo sysctl net.inet.tcp.sendspace → 默认一般为 131072(128KB)
- 是否启用 RFC1323 扩展:sudo sysctl net.inet.tcp.rfc1323 → 必须为 1 才能支持大窗口缩放
合理增大接收缓冲区
对千兆有线、M 系列扩展坞或局域网 NAS 场景,建议设为 512KB 左右:
- 临时生效(重启失效):sudo sysctl -w net.inet.tcp.recvspace=524288
- 同时启用时间戳与选择性确认:sudo sysctl -w net.inet.tcp.rfc1323=1
- 若需长期生效,写入 /etc/sysctl.conf 文件(无则新建),添加两行:
net.inet.tcp.rfc1323=1
配合 MTU 与链路状态协同调整
缓冲区效果依赖底层链路稳定。若 MTU 不匹配或协商为百兆半双工,再大的 recvspace 也无效:
- 先确保网口运行在 1000baseT/Full 模式(用 ifconfig enX | grep media 验证)
- MTU 建议设为 1472 或实测值(如 ping -D -s 1452 成功,则 MTU=1480)
- USB 网卡或 RTL8156B 类扩展坞,建议同步禁用 AWDL:sudo ifconfig awdl0 down
避免过度分配与内存压力
过大的 recvspace 可能挤占内核内存,尤其在连接数多时易触发 mbuf 耗尽。不建议超过 1MB:
- 观察 mbuf 使用:sudo sysctl kern.ipc.mbstat,关注 clusters in use 是否持续 >90%
- 若出现 “mbuf exhausted”,需同步调大 kern.ipc.nmbclusters(如设为 131072)
- 高并发短连接场景,可减小 MSS(net.inet.tcp.mssdflt=1448)降低单连接开销











