渣硕笔记——偶读《TCP/IP详解:卷1 协议》 关于IP路由选项和时间戳选项
最近在看hidden router的一篇论文,讲到用IP时间戳选项来解决这个问题。。发现自己对这方面了解太少,于是打开了这本著作,开始挑选相应章节学习一下。
一、自然要先从IP报文格式先了解起。
背景知识:如图所示,报文格式。首部长度这一个字段仅有4个bit,因此整个IP头部的长度最大只能达到15*32bit=60B,其中固定头部长度为20B。选项数据最多占据40字节,是可变长的部分。
这些任选项可以用于以下定义:
1. 安全和处理限制。。。太高端了,暂时不管
2. 记录路径(RR,记录经过的路由器IP地址)
3. 时间戳(记录经过的路由IP和时间)
4. 宽松源站选路(Strict Source Route,为数据报文指定一系列必须经过的IP地址)
5. 严格路由选路(Loose Source Route,类似strict,只能经过要求经过的IP地址)
二、记录路由选项
对于记录路由来说,选项数据的格式如下:
其中3B的RR选项,4*9B=36B的IP地址清单列表空间,最后剩余1B全为0,被解释为EOL。
各字段意义:
1. code表示IP选项数据的类型,对于记录路由来说,CODE=7.
2. Ptr指针字段,ptr指向了存放下一个IP地址的位置。最小值为4,表示第一个IP存放开始的位置,每次存入一个IP后,ptr+=4;直至ptr=40,表示IP清单已满。
3. Len,一般写36或40。
这样,我们现在就可以感受一下记录选项了。
Ping–R xxx
可以看到从本机到百度服务器的路由路径,可惜路径太长,记录不完全。
要注意,RR中的IP记录的是数据包到达路由器后被转发出去的口,第一个IP记录的就是自己主机的出口IP,当数据包到达目的地时,DEST回复的ICMP ECHO REPLY包会把之前的路由清单抄进去,然后发送出去,当reply包到达SRC主机时,也会把自己进入主机的IP端口地址加入到清单里面去。
不过我为了找一个比较近的目标进行ping,选择了附近网段的目标x.x.108.200,结果出现了点诡异。x.x.108.200数据同时记录了2次。。。
继续测试,对自己本机进行测试,发现本机IP竟然出现4次:
暂时不晓得为啥。。。改天再说吧。
其中书上其实也提到了一个异常的输出情况,如下: SRC-->X1(IP1)-->X2(IP2)-->DEST-->Gateway(IP3)-->X2(IP2’)-->X1(IP1’)-->SRC
可以看到,中间多了个gateway,作者分析是由于dest在回复ICMP ECHO REPLY时,SRC的地址不在本机的路由表里,这种情况下会把数据包发给网关,网关帮忙把包再发送给下一跳。
三、时间戳选项
与记录路由选项很相似。格式如下图
Code=0x44。Len和ptr同RR。
OF和FL各占4bit。
FL表示标志字段,即指定了时间戳选项对应的操作:0只记时间戳,1记录IP和时间戳,3发送包之前对选项列表进行了初始化,总共存放了4对IP和值为0的时间戳,仅当当前路由器与列表中的下一个IP匹配时,才修改时间戳的值。
OF表示溢出,当列表已满但打开了记录时间戳选项时,路由器会将OF的值增加,最大值为15。
时间戳的取值:一般是自UTC午夜开始记的毫秒数,如果路由器不使用这个格式,就需要打开时间戳中的高位以表明这个是非标准值。数据部分最多放9个时间戳。
总的来说,最多只能记录24hop
下面是ping –T的选项。
-T [ping only]: 发送IP时间戳选项。
-T tsonly 只有时间戳
-T tsandaddr 时间戳和地址
-T tsprespec host1 [host2 [host3 [host 4]]] 预指定跳数的时间戳
下面来直接地感受一下吧~ ping –T tsandaddr www.baidu.com结果如下:
可以看到,在ping发出的多个ICMP包,收到的7个ICMPecho reply包中,显然每个只记录了4对地址和时间戳~。
并显示未记录的跳数为15。
然而令人不解的是每一跳所采用的时间戳的值是如何变化的。
第一跳记录的都是本机的时间戳,absolute的(不是很懂)。
几分钟后对其进行再次探测,结果如下图
对比发现,
本机的时间戳值有明显的增加;
第二跳时间戳基本无变化。。。
第三跳、第四跳时间戳同上
这说明?他们不是标准的时间戳设置方法?
而且根据规定,“需要打开时间戳中的高位以表明这个是非标准值”,但根据本次探测的结果感觉貌似没有做到。。。。104276高位为0? 一会为 -1 一会为0的 何解?求指点