tcp/ip ---------- traceroute

article/2025/10/14 5:11:38

Ping通过发送ICMP回显请求和应答报文来完成,traceroute通过发送UDP报文的TTL和判断对方回复的ICMP报文来完成

 

Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由,还可以使用IP路由选项

 

 

在Ping程序中,我们描述了IP记录路由选项(RR)。为什么我们不使用这个选项,仍然要开发一个这个应用程序呢?

1、  首先,原先并不是所有路由器支持记录路由选项,因此该选项在某些路由上不能使用(然而traceroute程序不需要中间路由器具备任何特殊的或可选的功能)

2、  其次,记录路由一般是单项的选项,发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有信息,然后全部返回给发送端(traceroute程序只需要目的端运行一个UDP模块---其他不需要任何特殊的服务器应用程序

3、  最后,IP首部中留给选项的空间有限,不能存放当前大多数的路径。(我们知道,只能放9个,这是远远不够的)

 

 

ICMP报文和TTL

Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期),常为255.

每个处理数据报的路由器都需要把TTL减1或减去数据报在路由器中停留的秒数。由于大多停留小于1秒,所以TTL最终成为计数器,每经过一个路由器即减1(即使停留时间大于1秒,许多实现依旧是减1)

TTL字段是为了防止数据在选路时无休止的在网络中流动。例如路由器瘫痪或者两个路由器之间的连接丢失时,选路协议回去检测丢失的路由并一直进行下去。

当路由器收到一份IP数据报的TTL字段是0或1时,则路由器不转发该数据报,将该数据包丢弃并给IP源地址发一份ICMP”超时“信息。

Traceroute的关键在于收到的包含这份ICMP信息的IP报文的信息源地址是该路由器的IP地址

 

 

因此,大致的traceroute的执行过程

1、  它发送一份TTL字段为1的IP数据报给目的主机。

2、  处理这份数据报的第一个路由器将TTL减1,丢弃该数据报,并发回一份超时ICMP报文。这样一来,就得到了该路径中第一个路由器的地址。

3、  接着我们发送TTL为2的IP数据报,直到数据报达到目的主机。

4、  目的主机如果接收到TTL为1 IP数据报,是不会丢弃的也不会产生ICMP数据报,这是因为已经到达了最终的目的地。

 

那我们如何判断是否已经到达了主机了呢?

Traceroute发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(即目的主机不可能使用这个端口号),这样一来,数据报到达目的主机时,目的主机的UDP模块产生一份”端口不可达”错误的ICMP报文。

这样,traceroute要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束

 

 

现在来贴出在局域网中的实例:

 

                                                            

操作环境如下:

                                                            

这是书上的,下面是现在我的电脑上的:

 

                         

 

可以看出,这里设置的TTL=30。书上的traceroute发送40个字节数据,而我这里发送了60个字节。

         书上的40字节包括20字节IP首部, 8字节UDP首部,12字节用户数据(12字节包括每发一个字节增加的数据序列号,TTL副本,发送数据报的时间)

         我通过tcpdump观察了一下我的主机上的数据:

 

                       

 

     我这里发送了包含32字节的用户数据,所以总长为60字节。(不过我并不清楚这32字节里有什么…网上搜到的也都是抄书的依旧是40字节…)

 

         输出的以后每行都是以TTL为首。对于每个TTL值,发送3份数据报,这个可以从每行最后三列看出来,每份时间不同。

         每次接收到一份ICMP报文就计算打印往返时间,如果5秒内仍未收到3份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。

        

         下面我们给出在svr4上运行tcpdump的结果:

                                                              

         我们发现,目的主机的端口号每发送一个数据就加一,我们也可以通过命令行选项来改变端口号。

         可以看出,在数据报的ttl为1或0时,tcpdump会打印出来提醒我们报文的异常。

         因为在bsdi收到数据报后ttl变为0,那么它就会返回一个ICMP超时报文

 

既然这里提到了超时报文,索性将两种超时报文贴出来:

            

他们的code字段不同。

         我们这里讨论的ICMP是在TTL为0的时候产生的,code为0

         还有一种,主机在组装分片时可能发生超时,这时主机就会发送一份组装报文超时的ICMP报文,code字段为1。

 

         这里我们计算一下在SLIP链路下,各数据报的大小。

         发送出的UDP数据报按书上看是42字节(12字节的数据,8字节UDP首部,20字节IP首部以及2字节的SLIP帧)。

与ping不同的地方在于返回的数据报大小是变化的。返回的ICMP报文包含发生差错的数据包的IP首部和紧随IP首部的8个字节数据(这里是UDP首部),这样一来就是58个字节(20+8+20+8+2 自带IP首部加上ICMP首部加上数据加上2字节SLIP帧)

 

关于traceroute书上还提几点要注意的地方:

1、  首先,并不能保证现在的路由也是将来其他数据包会经过的路由,甚至两份连续的IP数据报都可能采用不同的路由。(对于一个给定的TTL,若其路由发生变化,traceroute将会打印出新的IP地址,因此我们很容易发现路由的变化)

2、  其次,不能保证ICMP报文的路由与traceroute发送出去的UDP数据报采用同一路由,这样的话往返时间就不能真正体现数据包发出和返回的时差了

3、  最后,返回的ICMP报文的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与IP记录路由选项不同(因为路由选项记录的是发送接口地址),这样的话,从A主机到B主机运行traceroute得到的结果可能就是不同的

也就是说,从slip到svr4会是这样的:

 

 

 

IP源站路由选项:

         通常IP路由是动态的,即每个路由器都要判断数据报下面该转发到哪个路由器。

源站路由(source routing)的思想是由发送者指定路由。可采用以下两种方式:

1、  严格的源路由选择。发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么就会返回一个“源站路由失败”的ICMP差错报文

2、  宽松的源站路由。发送端指明了IP数据包经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器

 

 

源站路由选项的格式:


这个格式与ping使用的记录路由选项格式基本一致,不同之处在于对于源站选路,我们必须在发送IP数据报之前填充IP地址清单,而且只需要为所需要的IP地址数分配空间并进行初始化,并让路由器填充各项,数量通常小于9。

而对于记录选项来说,必须尽可能的分配空间。

 

对于宽松源站选路:code=0x83   ;        严格选站则为 code=0x89

 

源站路由选项实际称呼为:源站及记录路由,这是因为数据报沿路由发送过程中,对IP地址清单进行了更新。下面为步骤:

1、  发送主机从应用程序接收源站路由清单,将第一个表项去掉(它是数据报的最终目的地址(注:这里的最终目的地址并非数据报最后一个地址,而是数据报下一个地址)),将剩余的项移到第一项中,并将原来的目的地址(这才是最后一个地址)作为清单的最后一项。而指针仍然指向清单第一项(即指针值为4)(结合下图,第一步指针已经指向R2了)

2、  每个处理数据报的路由器检查其是否为数据报的最终地址(注:…)。如果不是,则正常转发数据报(在这种情况下,必须制明宽松路由选站,否则不能接收到该数据报,因为宽松路由选站允许两站之间经过其他路由)

3、  如果该路由为最终目的(注:…),且指针不大于路径的长度,那么(1)由ptr所指定的清单中下一个地址就是数据报的最终目的地址(2)由外出接口相对应的IP地址取代刚才使用的源地址(3)指针加4

 

下面用实例解释上述过程:

 

 

我们假定主机S上的发送应用程)序发送一份数据报给D,指定源路由为R1, R2和R3,在传递过程中,长度字段恒为15(三个IP字段加上3个首部字节):

1、根据第一步,R1被去掉,R2取代其位置,指针指向R2,即值为4

2、到达R1,即最终路由,R2现在成了目的地址,路由外出接口相对应的IP地址R1取代刚才的源地址R2,指针指向R3,即加4

 

         当一个应用程序接收到由信源指定路由的数据时,在发送应答时,应当读出接收到的路由,并提供反向路由

        

宽松的路由选站实例:

         使用traceroute的-g选项,可以为宽松路由选站指明一些中间路由(可指定8个,最后一个规定为目的主机)

         这里给出书上的例子:

         先是用traceroute测试到达某目的主机的过程:

        

         然后是使用宽松路由得到的结果:

 

 

两者对比,我们发现其中的一些路由器丢失了。

 

书上还有部分关于路由选站,因为我好像看不懂,决定以后再看。。。


http://chatgpt.dhexx.cn/article/gFGArkYs.shtml

相关文章

TraceRoute实现

网络课上老师布置了第二个作业,写一个TraceRoute的程序。 Traceroute的工作原理: Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1…

tcp client

Mina 自定义硬件通讯协议框架搭建(TCP Client) 2018.03.04 18:49:29字数 1057阅读 2323 Apache MINA 是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。 使用背景 大三读完,出去…

traceroute的工作原理

MyySophia5个月前 traceroute的工作原理 是利用ICMP差错控制报文中的TTL超时会回向源点发送一个时间超时报文。例如A 主机 traceroute B主机,A会封装一些分组,这些分组很特殊,例如第一个分组的TTL设置为1 ,第二个分组的TTL设置为…

TCPTRACE的使用说明

主要的配置项介绍 Listen on Port :本机监听的端口,后面请求服务时使用; Destination Server :目标服务器的地址 Destination Port :目标端口 完成后,在地址栏中输入 http://127.0.0.1:8080(或 http://loca…

tcptrace

http://download.csdn.net/tag/tcptrace TcpTrace 0.8.1.717 http://www.soft82.com/download/windows/tcptrace/ 用tcpTrace查看SOAP请求/应答消息 使用说明 12. 五月 2009 23:17 by 螵蛸in Server技术 // Tags: tcpTrace, SOAP // 评论 (0) 对于开发Web服务应用…

tracert/traceroute原理

一、路由追踪程序traceroute/tracert Traceroute是Linux和Mac OS等系统默认提供的路由追踪小程序,Tracert是Windows系统默认提供的路由追踪小程序。二者的功能相同,都能探测数据包从源地址到目的地址经过的路由器的IP地址。Traceroute/Tracert的实现都借…

tcpTrace的使用

tcpTrace是一款小巧的获取请求报文和响应报文的工具,使用非常简单。 比如我现在有一个服务地址是http://localhost:8080/springmvc/handle.do,那么我们在tcpTrace中的配置如下: listen on port:8081(这个端口号可以自己设定&…

Tracetcp/Tcptrace的使用

Tracetcp是一个类似于Tracert的工具,可以直接在命令后加端口进行指定端口测试。 使用Tracetcp要求 1. 安装winpcap , 下载链接:https://www.winpcap.org/install/ 2.下载tracetcp软件,下载链接: https://github.com…

traceroute详解

traceroute详解 1.traceroute基本概念 traceroute (Windows系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器。TTL值可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP呼叫报文的TTL值和观察该报文被抛弃的返回信息&#x…

如何使用TCP Traceroute

与发送UDP或ICMP ECHO数据包的传统跟踪路由不同,TCP跟踪路由使用TCP数据包,因此可以绕过最常见的防火墙过滤器。 请遵循以下说明以运行TCP Traceroute: 对于Windows用户对于Mac用户对于Linux用户 对于Windows用户, Windows没有…

TCP/IP 网络:Traceroute程序

Traceroute是一个用来探索TCP/IP协议的工具,他通过ICMP协议可以让我们看到IP数据报从一台主机传送到另一台主机所经过的所有路由。 使用方法: traceroute [参数] [主机名] windows下命令为 tracert [] [] [-n]:显示的地址是用数字表示而不是符号[-v]…

hdfs创建文件报错 mkdir: Cannot create directory /Flink. Name node is in safe mode.

据资料是说hdfs刚刚启动,还在验证和适配,所以进入安全模式,等一会儿就好了,然后我等了几分钟并没有好 然后找到了解决安全模式的办法: 用户可以通过dfsadmin -safemode value 来操作安全模式,参数value…

network_tcp三次握手

TCP是TCP/IP的传输层控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 首先需要了解几个名词:tcp标志位,有6种分别为:SYN(synchronous建立联机) 、ACK(acknowledgement 确认) 、PSH(push传送) 、FIN(finish结束)、 RS…

mysql1396错误

波尔,被控制的电脑通讯端口是多少? 1222nervSNIR&Dnetwork 1239nmsdNMSD 1243Sub-7木马 1245Vodoo 1248hermes 1269MavericksMatrix 1492FTP99CMP(BackOriffice.FTP) 1509StreamingServer 1524ingreslock后门 1313bmc_patroldb 1314pdps 1321pipPIP …

NetFlow

 NetFlow是一种数据交换方式。Netflow提供网络流量的会话级视图,记录下每个TCP/IP事务的信息。也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读。Netflow由Cisco创造。 工作原…

failed to create network error response from daemon filed to setup ip tables问题

问题 今天在环境上搭建平台,执行docker-compose up -d 报错 Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b649822bbcff -j RETURN: iptables: No chai…

Devtools 热部署

文章目录 前言使用步骤 1.引入库2.配置总结 前言 在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊 一、使…

内网渗透的那些net命令|Net config|Net

Net命令 Net命令是一个命令行命令,Net命令有很多函数用于实用和核算计算机之间的NetBIOS连接,可以查看我们的管理网络环境,服务,用户,登陆等信息内容 Net使用方法 显示当前域的计算机列表net view 查看指定计算机的共享资源列表net view \test 查看共享的资源net share 查看…

failed to load response dataRequest content was evicted from inspector cache

在项目中,我用谷歌浏览器查看后台返回的json数据,但是发现前端页面已经接收成功,并且渲染了对应json数据了,但是network里面的response却报错: 调整对应json数据后发现,当后台返回前端的数据超过了一定大…

火狐浏览器提示响应已被截断(有效解决)

产生问题如下:JSON传递数据超过1M 解决方案: 第一步:地址栏输入about:config 第二步:devtools.netmonitor.responseBodyLimit 改为0,相当于禁用大小限制,保存之后即可。