天天看点

计算机网络之我见-通俗理解计算机网络(五)

上几篇讲解了以IP地址为基础的数据包路由过程,本篇只讲解IP层协议格式和ICMP协议的常用用途(只留要点),以及网络层常用的PING程序、路由跟踪程序(traceroute等)的工作原理

一、IP协议格式

# IP数据包分为IP头和体

# IP头部的关键字段有:

1 源IP地址、目的IP地址,这是用来在网络中路由数据包必须的字段(参考前几篇路由过程的讲解)

2 包体类型标志,指示IP数据体携带的数据包协议格式,如ICMP、IGMP、IP等

3 数据包TTL,即数据包生存跳数:指定一个数据包TTL,数据包每经过一个路由器转发,TTL就减1,TTL为0的数据包会被路由器丢弃。这个特性目前用来跟踪数据包到目的地址所经过的所有路由器信息~

4 路由记录信息,能在IP头部记录数据包经过的每个路由器IP,但是由于头部有限,只能记录8个IP地址,不能用这个域来做路由跟踪,一般都是采用上面的TTL方式进行路由跟踪~

5 数据包的总长度,两个字节,最大能表示65535个字节

6 分片信息,根据5所说,最大的IP数据包可以达到65535字节,但是IP经过下层链路层发送时,会有硬件和链路方面的限制--MTU,它是链路层每个数据帧的最大长度,一般是小于1500字节的,所以一个大于MTU的IP包在每一跳间传递的时候都要经过分片、组装的过程,分片信息头域记录了当前片是哪一片等信息,根据这些信息,路由器或主机能够把多个IP分片组合成一个完整IP数据包~

7 校验和,校验数据包是不是被篡改~

# 关于IP层分片的重组和丢弃策略 -- 丢失分片不重发

当IP层开启数据包分片后,路由器收到一个完整数据包的某个分片后就开启定时器,当在定时器超时后仍未收到所有的分片,那么路由器就会丢弃整个已收到的IP分片,需要注意:路由器只是丢弃,不会给IP对应的源主机发送任何ICMP错误通报通知其重发(原因如下:内核IP层实现并不会重发,重发一般是上层协议如TCP等负责,如果通报错误给源主机,必须通报给指定的端口,但是端口信息通常在第一片分片的IP包中,路由器可能刚好没有收到第一片分片,所以无法发出错误通报);从上可以看出IP层分片的不可靠性,上层协议尽量要避免IP分片

二、ICMP协议常用用途

# ICMP协议是IP层之上的协议,主要有头域和体域组成,头域有类型字段,不同的类型对应不同的体域

# ICMP主要用作IP层的互通测试和为上层协议提供错误信息通报等功能,常用功能有:

1 信息回显:给指定目的IP地址发送一个ICMP包,包体发送一个字符串,目的IP机器收到请求后返回一个响应包,包体仍是发送的字符串

2 PING程序:向指定的IP发送回显请求、得到响应并统计数据包的往返时间

3 目的主机不可达错误报告:当一个上传IP数据包经过核心路由器时发现找不到对应IP所属的网络,无法完成路由,就会向发送方发送ICMP“主机不可达”错误~

4 端口不可达错误:IP数据包上承载的是UDP或者TCP数据包的时候,数据包指定的目的IP机器上没有数据包指定的端口对应的Socket接收的时候,需要向源主机发送ICMP端口不可达错误通报~

5 路由重定向:由路由器发出,用来优化路由过程,减少路由跳数,当路由器查路由表发现数据包的下一跳路由和发出主机在同一网络下(数据包同一接口进来下一跳从同一接口出的情况)时,向源主机发送带有重定向的路由器IP的ICMP包来让源主机修改路由表~

三、PING程序简单理解

1 PING程序可以向指定的IP地址主机发送ICMP回显数据包,并等待接收响应数据包

2 如果目的IP不可达,PING会接收某一路由器发来的ICMP路由不可达错误通告并显示给用户

3 PING程序会多次发送和接收ICMP请求和响应,然后统计出到目的网络的TTL(数据包往返时间)

4 PING程序可以利用IP头域中的和路由记录相关的字段来记录有限个数据包经过的路由器,PING程序构造IP数据包,头部开启路由记录选项,数据包每进过一个路由器,就会填入对应接口的IP,到达目的IP的PING程序时,PING程序把IP数据包头部的路由记录信息转存到ICMP体中,然后响应给源主机同样开启IP路由记录的ICMP数据报,源主机收到响应后就能够得到数据包发送路由跟踪和响应路由跟踪信息(发送路由跟踪信息从响应的ICMP体中获得)

四、路由跟踪程序(traceroute等)简单理解

1  路由跟踪程序使用的是IP包的TTL字段,而不是使用IP路由跟踪选项,因为路由跟踪选项有大小限制,只能记录有限个路由

2  使用TTL的原理:

# 源主机给IP数据包的TTL设置一个指定的整数值(通常小于255),根据协议,没经过一个路由器,TTL值就会减1,直到TTL值为0,路由器就会丢弃该包,同时给源主机发送数据包失效相关的ICMP错误通报

# 路由跟踪程序构造一个UDP数据包,同时指定一个不存在的UDP端口号,给这个包的IP层TTL值从1开始设置-->发送-->等待ICMP响应,依次增加TTL值递归操作,每次响应都记下路由器的IP地址,直到收到一个特殊的ICMP端口不可达错误通告(这个通告肯定是目的IP的主机回应的,因为我们指定了一个不存在的端口的UDP数据包),通过TTL的递增,依次接收ICMP错误信息,通过这样的方式间接完成了路由跟踪过程~

继续阅读