TCP/IP详解 卷1:协议 学习笔记 第七章 Ping程序

ping名字来源于声纳定位操作。目的是测试另一台主机是否可达,ping发送一份ICMP回显请求报文给主机,并等待ICMP回显应答。

一般,如果不能ping到某主机,那么就不能Telnet或FTP到那台主机(但可能有防火墙,使得不能ping到,但能Telnet远程登录到);如果不能Telnet到某台主机,通常可用ping确定问题。ping还能测试到这台主机的rtt。

大多TCP/IP实现都在内核中直接支持ping服务器,它不是一个用户进程。
在这里插入图片描述
服务器必须响应标识符和序号字段。

UNIX的ping实现总是把标识符字段置成发送进程的id,这样多个ping同时运行时也能分清返回的信息。

序号从0开始,每发送一次回显请求就加1。ping会打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序、重复。

在这里插入图片描述
返回ICMP回显应答时,要打印出序列号和ttl(位于IP首部中的生存时间字段),并计算往返时间。

ping通过在ICMP报文数据中存放发送请求的时间值计算往返时间。上图中rtt为0是因为程序使用的计时器分辨率太低。

上图中每行都有目的IP地址,尽管指定的是svr4,说明名字经过解析器已经转换成IP地址了。

tcpdump结果:
在这里插入图片描述

通常第一个rtt时间较大,原因是可能目的端硬件地址不在发送端ARP高速缓存中:
在这里插入图片描述
如果是在广域网,ping的结果可能会出现丢失、失序、重复分组,且rtt会变长。

ping默认发送的ICMP报文长56字节,加上20字节IP首部和8字节ICMP首部,IP数据报总长84字节。

拨号SLIP链路两端相比SLIP链路增加了调制解调器。

ping可以查看IP记录路由(RR)选项,大部分ping程序的-R选项可查看,此选项使得ping发送的IP数据报中(其中含ICMP回显请求报文)设置IP的RR选项,这样,每个处理该数据报的路由器都把它的IP地址放入IP首部的选项字段。当数据报到达目的端时,IP地址清单应复制到ICMP回显应答中,这样返回途中经过的路由器地址也被加入到清单中。

该过程有缺陷,远端主机生成RR选项,中间路由对RR选项进行处理,ICMP回显请求中的RR清单复制到回显应答中,所有这些都是选项功能。有一些系统不把ICMP请求中的IP地址清单复制到ICMP应答中。

但问题是IP首部只有有限空间存放IP地址,IP首部长度字段只有4bit,最多只能包含60字节,其中IP首部固定20字节,RR选项用去3字节,剩下只有37字节来存放IP地址清单,因此最多只能存放9个IP。

在这里插入图片描述
上图中的30字节应改为40字节。

code字节指明IP选项类型,对于RR选项,值为7。len是RR选项总字节长度,以上情况为39。ptr为指针字段,最小值为4,指向存放第一个IP地址的位置,随着IP地址存入清单,ptr的值分别为8、12、16,最大到36,当记录下9个IP地址后,ptr的值为40,表示清单已满。

路由器将它的出口地址记入清单。当运行ping的主机收到带有RR选项的ICMP回显应答时,也要把它的入口IP地址放入清单。

在这里插入图片描述
分组经过的四站如图:
在这里插入图片描述
我们发现,路由器bsdi在不同方向上分别加入了不同的IP地址,它始终是把出口的IP地址加入清单;在ICMP回显应答到达原始系统时,它把自己的入口IP也加入清单。

在sun上运行带-v选项的tcpdump命令查看分组交换:
在这里插入图片描述
输出中optlen表示IP首部中有40字节的选项空间(IP首部长必须为4字节的整数倍);RR{39}表示记录路由选项已被设置,它的长度为39字节,之后是9个IP地址,符号#用来标记RR选项中ptr字段指向的IP地址;EOL表示IP选项end of list,它的值可以为0。如果IP首部中选项字段中有多个选项,在开始下一个选项前必须填空白字符或另一个值为1的特殊字符NOP(no operation)。

在以下网络结构上:
在这里插入图片描述
运行ping程序时,输出异常:
在这里插入图片描述
ICMP回显请求直接从netb传到aix,而ICMP回显应答却从aix先传向gateway,再到netb。原因是aix不知道要把目的子网为140.252.13的IP数据报发送到主机netb上,而aix路由表中有一个默认项指向路由器gateway。

一个问题是为什么路由器gateway不直接发送ICMP重定向报文到aix以更新aix的路由表,接收到ICMP重定向报文的主机直接将数据报发往目的主机。由于某种原因(很可能因为数据报是一份ICMP回显请求报文),重定向没有产生。但如果我们用Telnet登录到aix上的daytime服务器,就会产生ICMP重定向,因而在aix上的路由表也随之更新。之后再执行ping,就会先从netb到aix,再从aix回到netb。

在这里插入图片描述

时间戳选项的代码为0x44,len为选项总长度,ptr指向下一个可用空间的指针(5、9、13等)。

OF(溢出字段)和FL(标志字段)为4bit值,时间戳选项的操作根据标志字段FL的值进行:
在这里插入图片描述
当路由器没有空间增加时间戳选项,它将增加溢出字段的值。

时间戳的取值一般为自UTC午夜开始计的毫秒数,如果路由器不使用这种格式,就必须打开时间戳中的高位以表明为非标准值。

ping只利用ICMP报文,不用经过传输层。

posted @   epiphanyy  阅读(39)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示