加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TCPv4/v6处理ICMP差错的几种情况

(2008-10-16 21:35:41)
标签:

杂谈

分类: MSN搬家

TCPv4处理ICMP差错的几种情况

TCPv4处理ICMP的入口是tcp_ctlinput函数,这个函数中将差错分为4个大类处理:

1、  报文过大,并且报文被置上DF标致,导致中间节点发回PRC_MSGSIZE差错。

2、  放弃连接差错,这种差错会导致在三次握手时的TCP连接立即放弃建连尝试。

3、  忽略的差错,这种差错TCP并不理会,也不认为是差错。

4、  其他差错,即软差错,这种差错不会立即导致TCP断开连接。但是,只要TCP在通信中断连,那么这种差错会作为原因返回给APP

 

以下是对这四种差错的分析:

1、  报文过大差错,我们可以看到,如果ICMP协议能够带回精确的PMTU,那么TCP会使用它,如果MTU296还要小,那么TCP则使用全局变量tcp_mssdflt中的默认MTU值代替。

值得注意的是,tcp_maxmtu是什么?tcp_hc_updatemtu又是什么?notify函数指针干了什么?

tcp_maxmtutcp_hc_updatemtu都在ICMP带回了确定的PMTU时才会被调用,tcp_maxmtu会返回路由协议收敛回来的MTU与路由出接口MTU中较小的一个。而ICMP差错中带回的MTUtcp_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、  忽略的差错,这种差错TCP并不理会,也不认为是差错。

 

ICMP差错

说明

PRC_REDIRECT_NET

网络禁止访问

PRC_REDIRECT_HOST

主机禁止访问

ICMP_SOURCEQUENCH

中间节点由于某种原因要求源端减速

 

3、  其他差错,即软差错,这种差错不会立即导致TCP断开连接,但TCP会将这个错误记录在SocketINPCB上。这个处理是在tcp_notify中进行的:

 

 

BSD7.0tcp_notify中的注释可以看出,除了状态在在三次握手时的连接,需要考虑在超过3次重传后要放弃连接外,其他情况均将错误记录为软差错(soft error)。而这个软差错在TCP正真断开连接的时候才报告给APP

 

TCP断开连接时,会tcp_drop函数被调用,并将错误码存入socketerrno中。

 

TCPv6处理ICMP差错的几种情况

TCPv6TCPv4处理ICMP的差错大同小异,主要存在2点区别:

1、  TCPv6需要ICMPv6重定向差错,而不是想TCPv4那样忽略。

 

如果是重定向消息,那么TCP会出发路由改变通知。

 

2、  除了要根据ICMPv6中带回的MTU重新计算MSS外,还需要将PMTU的变化通知给哪些对此感兴趣的APP

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有