![路由器 NAT 承受的回显请求和答复之间的 ICMP 最大延迟](https://linux22.com/image/725622/%E8%B7%AF%E7%94%B1%E5%99%A8%20NAT%20%E6%89%BF%E5%8F%97%E7%9A%84%E5%9B%9E%E6%98%BE%E8%AF%B7%E6%B1%82%E5%92%8C%E7%AD%94%E5%A4%8D%E4%B9%8B%E9%97%B4%E7%9A%84%20ICMP%20%E6%9C%80%E5%A4%A7%E5%BB%B6%E8%BF%9F.png)
我试图降低我的服务器(arch linux vm)的网络速度netem
sudo tc qdisc add dev eth0 root netem delay 1600ms
延迟 1600ms 时,客户端不会收到回应数据包,尽管数据包是由服务器端生成的。但是它可以承受1500ms
延迟。如果延迟小于该值,客户端就会收到回应。
但是在 RFC 中是否指定了回显请求和回显答复之间的任何固定最大延迟?
我已经使用ping
以及scapy
来生成ICMP
回显请求数据包并tcpdump
检查传入的回显回复数据包。所以这不是ping
程序的问题。
所以我认为在中间路由器的某个地方,ECHO reply
数据包由于延迟而被丢弃。那么普通路由器承受的回显请求和回复之间的最大延迟量是多少?
答案1
有建议RFC 5508 “ICMP 的 NAT 行为要求”关于路由器应该保留 ICMP 数据包状态多长时间,但不能保证任何人都会遵守它们。
答案2
语境:ICMP 不是有状态协议。
如果你坐在路由器后面,该路由器会将你的流量进行 NAT,并且你正在 ping 路由器另一端的设备,那么路由器需要跟踪你的ICMP 回显请求为了让各自的ICMP 回应如果 ICMP 不是有状态的,该怎么做?只需在 NAT 表中写入一个条目并保留一段时间即可。
您的路由器供应商认为 1500ms 是功能性(ICMP 工作)和安全性之间的一个很好的折衷方案:
1) 路由器可以快速释放内存,而不必为单边 ICMP 保留数百万个条目。2
) 路由器会阻止可能用于探测、指纹识别等的不需要的 ICMP 回显答复。
附注:Windows 的默认 ping 超时时间为 4 秒,而许多 Linux 发行版的默认 ping 超时时间为 10 秒(参考两个操作系统中的默认“ping”工具)。