标签:
杂谈 |
分类: MSN搬家 |
TCPv4处理ICMP差错的几种情况
TCPv4处理ICMP的入口是tcp_ctlinput函数,这个函数中将差错分为4个大类处理:
1、
2、
3、
4、
以下是对这四种差错的分析:
1、
值得注意的是,tcp_maxmtu是什么?tcp_hc_updatemtu又是什么?notify函数指针干了什么?
tcp_maxmtu和tcp_hc_updatemtu都在ICMP带回了确定的PMTU时才会被调用,tcp_maxmtu会返回路由协议收敛回来的MTU与路由出接口MTU中较小的一个。而ICMP差错中带回的MTU比tcp_maxmtu计算的MTU更小的话,那么就将这个更小的MTU存入主机缓存(HC)。最后notify函数中会取用HC中的MTU计算MSS。
1、
TCP在三次握手过程中,如果收到以下几种差错,将会放弃继续尝试这个连接:
ICMP差错 |
说明 |
ICMP_UNREACH_NET_PROHIB |
网络禁止访问 |
ICMP_UNREACH_HOST_PROHIB |
主机禁止访问 |
ICMP_UNREACH_FILTER_PROHIB |
由于管理原因被过滤 |
ICMP_UNREACH_PROTOCOL |
协议不可达 |
ICMP_UNREACH_PORT |
端口不可达 |
ICMP_TIMXCEED |
TTL超期 |
2、
ICMP差错 |
说明 |
PRC_REDIRECT_NET |
网络禁止访问 |
PRC_REDIRECT_HOST |
主机禁止访问 |
ICMP_SOURCEQUENCH |
中间节点由于某种原因要求源端减速 |
3、
从BSD7.0的tcp_notify中的注释可以看出,除了状态在在三次握手时的连接,需要考虑在超过3次重传后要放弃连接外,其他情况均将错误记录为软差错(soft error)。而这个软差错在TCP正真断开连接的时候才报告给APP。
在TCP断开连接时,会tcp_drop函数被调用,并将错误码存入socket和errno中。
TCPv6处理ICMP差错的几种情况
TCPv6与TCPv4处理ICMP的差错大同小异,主要存在2点区别:
1、
如果是重定向消息,那么TCP会出发路由改变通知。
2、