路由器如何对待ttl超时的tcp报文?

haitanshangdeyu 2011-06-17 12:48:26
最近在做一个用tcp报文探测路由的程序,想问一个问题,
路由器对待ttl超时的icmp报文会返回一个icmp超时消息,那假如报文是tcp的呢?路由器会怎么做呢?也会返回ICMP超时消息么?还是直接丢弃不响应呢?
个人感觉回复TCP报文不太现实……向各位大侠请教,希望在说出结果的时候能说下为什么~~

另外,还想问下,如果是探测中途遇到的主机,比如说代理服务器,但是并不是目的节点,那他会给回复什么样的消息呢?


感激不尽!
...全文
572 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopoy 2011-06-20
  • 打赏
  • 举报
回复
你说的这种情况的话,我暂时能想到的就只有二种方法了,一是看它是否支持SMNP来检测网络结构了。另一种方法是利用路由器交换路由线路的RIP协议。这个我只是略懂一点点,就只提基础的,避免因为我的错误理解带来你实际应用上的失误 /:^]
支持SMNP的话,可以从目标机或者紧接着目标机的MIB SMNP数据库里获取信息,目标机的IpGroup组里的ipAdEntAddr这个表,或者其他机的ipRouterDest和ipRouterNextHop。
使用RIP来获取路由路径的话,也是有点问题的,因为一些中途的路由器会不给你传递RIP消息过去,这样就很尴尬了。但是request可以发到目标机的之前的那个路由上的话,一般都可以得到目标机的IP了,虽然是藏在一大堆IP里面。
haitanshangdeyu 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaopoy 的回复:]

唔,我又傻掉了,太晚了看的晕晕的。
超时的话,如果是那个路由器直接抛弃TLL小于1的包,而不返回ICMP的情况,在本机上的话,一般就没办法了。我也只是比较稍微了解一些,这个路由器的IP,若想知道的话,应该得有路由我们的封包给它的那个路由器的控制权,才能从路由表中得到它的IP。
另外,实际中出现这种超时的情况,有几个常见的场景,一是网络环境自己都清楚,这儿是为了找出停机的哪一个点,这样碰到超时……
[/Quote]

恩……
我做的就是想在本机上探测一个不知道网络环境的拓扑中的IP恢复,就是想要把traceroute中的*.*.*.*恢复出来。所以第一个常见的场景就不适用了……呵呵。
第二个场景中,我每次探测都会发3个数据包,这样应该能克服掉这个问题吧?你觉得呢?
第三个场景中,我用的是自己编程发送TCP报文,端口是由我自己来定义的,如果真是你说的这种问题,那是不是换个端口或者对路由器进行一下端口扫描,等发现开放的端口之后,便可以获得它的IP了呢?

我程序已经做出来了,但是效果很差。本来想的使用TCP报文的话,很多问题都可以解决,比如说,路由器对ICMP报文的限速,或者对traceroute探测报文的屏蔽等等。但是事实证明只有对很少的部分网址才有用,大部分结果还是测试不出来。比如说,针对百度的119.75.217.109探测中,第13跳的IP就不能显示。我进行抓包,发现根本都没有ICMP响应包。应该就是你最开始说的那种情况了。在这样的条件下,想获取IP,真的好难……
xiaopoy 2011-06-18
  • 打赏
  • 举报
回复
唔,我又傻掉了,太晚了看的晕晕的。
超时的话,如果是那个路由器直接抛弃TLL小于1的包,而不返回ICMP的情况,在本机上的话,一般就没办法了。我也只是比较稍微了解一些,这个路由器的IP,若想知道的话,应该得有路由我们的封包给它的那个路由器的控制权,才能从路由表中得到它的IP。
另外,实际中出现这种超时的情况,有几个常见的场景,一是网络环境自己都清楚,这儿是为了找出停机的哪一个点,这样碰到超时无法获得IP的路由器其实是解决了问题。二是tracroute这次就真超时了,再试也许就行。三就是被那个路由器主动的把连接处理掉了,可能是因为协议访问的端口问题等被限制之类的原因,因为traceroute会自动更换封包中的端口(总是用不存在的端口去访问,以避免真的被目标机上的哪个程序接受到),所以这个问题其实也很少碰到。
xiaopoy 2011-06-18
  • 打赏
  • 举报
回复
把TTL加1,然后多出来的那一个就是了 /:^]!
oyljerry 2011-06-17
  • 打赏
  • 举报
回复
一个前提概念:路由器是2/3层设备只有IP,ICMP等包,不会处理TCP包.
haitanshangdeyu 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaopoy 的回复:]

没看完帖子,再补充下。ttl和代理服务器是没有关系的。除非这个代理服务器,完全要当透明的,特地对TTL进行了处理,因为一般的路由器或其他形式的中转机器,总是修改一下TTL,这样想维持TTL不变,一般而言就得在得到要代理出去的包时先递增一下TTL再发包了。
[/Quote]

上个问题弄明白了,想再问一下~~
如果使用TCP报文进行路由探测,但是探测结果还是出现超时无法显示IP,那我应该如何做才能获取这个路由器的IP呢?有什么好方法么?
haitanshangdeyu 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaopoy 的回复:]

ttl越界了肯定返回一个icmp啊。
这是IP协议网络层的,不是TCP 传输层的。关于ICMP,要理清一个概念的,ICMP是使用IP协议来实现它的功能的。但是,ICMP协议和IP、TCP、甚至应用程序都能产生关系,这是指它是服务于这几个层需求的,而ICMP自己,是在IP协议上面实现的,一句话说,ICMP利用IP协议满足了IP/TCP/Apps的因特网连接的控制消息传递的需求。
[/Quote]

大侠所言甚是,让我如梦初醒……太感谢了!!
xiaopoy 2011-06-17
  • 打赏
  • 举报
回复
没看完帖子,再补充下。ttl和代理服务器是没有关系的。除非这个代理服务器,完全要当透明的,特地对TTL进行了处理,因为一般的路由器或其他形式的中转机器,总是修改一下TTL,这样想维持TTL不变,一般而言就得在得到要代理出去的包时先递增一下TTL再发包了。
xiaopoy 2011-06-17
  • 打赏
  • 举报
回复
ttl越界了肯定返回一个icmp啊。
这是IP协议网络层的,不是TCP 传输层的。关于ICMP,要理清一个概念的,ICMP是使用IP协议来实现它的功能的。但是,ICMP协议和IP、TCP、甚至应用程序都能产生关系,这是指它是服务于这几个层需求的,而ICMP自己,是在IP协议上面实现的,一句话说,ICMP利用IP协议满足了IP/TCP/Apps的因特网连接的控制消息传递的需求。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧