TCP/IP学习笔记(三)

来源:互联网 发布:新手开淘宝网店与天猫 编辑:程序博客网 时间:2024/06/05 07:25
 作者:肖进


一、Ping程序:

  先看:

      //ping
C:/WINNT/system32>ping svr00804
Pinging svr00804.sccnj.swirebev.com [192.1.8.12] with 32 bytes of data:
Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
Ping statistics for 192.1.8.12:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
ICMP回显请求和回显应答报文格式如下:(以Ping为例)

 

类型0或8代码0检验和
标识符序号

结构定义如下:

typedef struct icmp_hdr{ unsigned char icmp_type; //类型 unsigned char icmp_code; //代码 unsigned short icmp_checksum; //检验和 unsigned short icmp_id; //标识符 unsigned short icmp_sequence; //序号} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR;

  PING程序把ICMP报文中的标识符字段设置为发送进程的ID号,这样即使在同一台主机同时运行多个ping实例,ping程序也可以识别返回的信息。

二、IP记录路由选项

  PING程序为我们提供了查看IP记录路由(RR)选项的机会。每个处理PING请求的路由器都把它的IP地址放入选项字段中。当PING程序收到回显应答时,它就可以打印出这份IP地址清单。
由于IP首部中的首部长度字段只有4bit,因此IP首部最大为60字节。由于IP首部固定长度为20个字节,RR选项用去3个字节,因此存放IP地址的控件只有37个字节,也就是最多放9个IP地址。

 

code(1)len(1)ptr(1)9个IP地址多余1

code:IP选项类型,RR选项为7。
len:RR选项总长度,为39。
ptr:指针字段,存放下一个IP地址的位置,开始为4,放满为40。

  IP地址为路由器的出口地址,同时原始主机收到带有RR选项的ICMP回响应答时也把它的入口IP地址放入清单。

三、IP时间戳选项:

 

Code(1)Len(1)Ptr(1)OF(4bit)FL(4bit)时间戳


Code:时间戳的代码为0x44。
Len: 时间戳选项总长度,一般为36或者40。
Ptr:时间戳数据指针。
OF:溢出字段。
FL:标志字段:0-只记录时间戳
1-每台路由七都记录IP地址和时间戳,在选项列表中只存放4对IP地址和时间戳。
3-发送端对选项列表进行初始化,存放4个IP地址和4个取值为0的时间戳。只有当列表中的下一个IP地址与当前路由器地址相匹配时,才记录它的时间戳。

如果路由器没有控件而不能增加时间戳选项时,那么将设置溢出字段的值。

四、Traceroute程序:
  Traceroute程序使用ICMP报文和IP首部的TTL字段,发送ICMP回显应答时一般把TTL设置为255。工作原理:开始时发送一个TTL字段为1的数据报,然后每次将TTL字段值加1,以确定路径中的每个路由器。每个路由器在丢弃UDP数据报时都返回一个ICMP超时报文2,而最终目的主机则产生一个ICMP端口不可到达的报文。
报文长度为40:

◆ 20字节的IP首部
◆ 8字节的UDP首部
◆ 4字节的序列号,每发一个就加1
◆ 4个字节的TTL副本
◆ 4个字节的发送数据报的时间戳。

超时报文格式:
 

类型11代码0或1检验和
保留,必须为0
IP首部+原始IP数据报中数据的前8位

五、IP选路

IP搜索路由表的步骤:

◆ 搜索匹配的主机地址
◆ 搜索匹配的网络地址
◆ 搜索默认选项

1、 路由表:

DestinationGatewayFlags Refcnt use 140.252.13.65 140.252.13.35 UGH 0 0127.0.01127.0.01 UH10default 140.252.13.33 UG 00140.252.13.32 140.252.13.34 U 4 25043

说明:U-该路由可以使用(use)
G-该路由似到一个网关。(gateway)
H-该路由是到一个主机(host)
Refcnt-是正在使用路由的进程数
Use-通过该路由发送的分组数

  每当初始化一个接口时,系统就为接口自动创建一个直接路由。如果到达主机和网络的路由不是直接相连的,就需要手工加入路由表。

> route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2destination^ ^mask ^gateway metric^ Interface^ 

  如果表中没有默认项,又没有找到匹配项。如果数据报时本地主机产生的,那么就给发送该数据报的应用程序一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给原始发送端发送一份ICMP主机不可达的差错报文。

2、 ICMP重定向差错

  如果我们发送一份IP报给R1路由器,R1收到数据报并且检查它的路由表,发线R2是发送该数据报的下一站。当它把数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN)。这样路由器R1就会发送重定向报文给主机。
ICMP重定向差错报文格式:

类型5代码(0-3)检验和
应该使用的路由器IP地址
IP首部+原始IP数据报中前8个字节

代码说明:0-网络重定向
1-主机重定向
2-服务类型和网络重定向
3-服务类型和主机重定向
ICMP重定向报文的接受者必须查看三个IP地址:(1)导致重定向的IP地址(2)发送重定向报文的路由器IP地址(3)因该采用的路由器IP地址。
ICMP重定向报文只能由路由器生成,不能由主机生成。
主机收到重定向报文时,在修改路由表前必须做一些检查。

◆ 新的路由器必须直接与网络相连接
◆ 重定向报文必须来自当前到目的地所选择的路由器
◆ 重定向报文不能让主机本身作为路由器
◆ 被修改的路由必须是一个间接路由

3、 ICMP路由器发现报文

  主机在引导以后要广播或多播传送一份路由器请求报文。一台或多台路由器响应一份路由器通告报文。另外,路由器定期关波或多播传送他们的路由器通告报文,允许每个正在监听的主机相应地更新它们地路由表。
ICMP路由器请求报文格式:

 

类型10代码0检验和
保留,必须为0

ICMP路由器通告报文格式:
 

类型9代码0检验和
地址数地址项长度2生存时间
路由器地址1
优先级1
路由器地址2
优先级2
...

地址数指的是报文重所包含得地址数。
地址项大小指的是每个路由器地址32bit的数目,始终为2。
生存时间指的是通告地址有效的时间(秒数)
IP地址必须是发送路由器的某个地址
优先级是一个有符号的32位整数,指出该IP地址作为默认路由器地址的优先等级,值越大说明优先级越高。优先级的默认值一般设定位0。

六、动态选路协议RIP

  当相邻路由器之间进行通信,以告知对方每个路由器当前所在的网络,这就出现了动态选路。路由器上有一个进程叫路由守护程序,它运行选路协议,并于其相邻的一些路由器进行通信。路由器根据它从相邻路由器接收到的信息,更新内核中的路由表。
报文格式:
 

IP首部UDP首部RIP报文
 
命令1-6版本1必须为0
地址系列2必须为0
32位IP地址
必须为0
必须为0
度量(1-16)
最多24个另外的路由,与前20个字节格式相同

RIP报文包含在UDP数据报中。
命令1表示请求,2表示应答,3和4不用,5和6为非正式的命令。请求表示要求其他系统发送其全部或部分路由表,应答则包含发送者全部或部分路由表。
版本字段通常为1,根据实际设定。
地址系列为地址类型,IP地址为2。
由于每个报文最多携带25个路由,因此为了发送整个路由表,经常需要发送多个报文。

1、 运行过程

  • 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。目的端口号时520。这种请求报文的命令字段为1,但地址系列字段设置为0,度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。
  • 接收到请求:如果这个请求时刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则就处理请求中的每一个表项:如果有连接到指定地址的路由,则将度量设置为我们的值,否则将度量设置为16,表示没有到达目的地地路由,然后发送相应。
  • 接收到响应:使相应生效,可能会更新路由表或增加新表项,对已有地表项进行修改,或者删除已有表项。
  • 定期更新选路:每过30秒,所有或部分路由器会将其完整地路由表发送给相邻的路由器,发送路由表一般是广播形式的。
  • 触发更新:每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,只需发送那些发生变化的表项。
  • 每条路由都有与之相关的定时器:如果运行RIP的系统发现一条路由在3分钟未更新,就将该路由的度量设置为16,并标注为删除。
2、度量:

  度量是相连通过的接口数,如果是直接相连,则度量是1。如果一个路由器到一个网络有多条路由,则路由器将选择最短的路由。
度量最大值是15,16表示无路由到达该IP地址。

3、 RIP2

RIP2利用RIP报文中必须为0的字段来传递一些额外的信息。其报文格式如下:
 

命令1-6版本2路由域
地址类2路由标记
32位IP地址
32位子网掩码
32位下一站IP地址
度量(1-16)
最多24个另外的路由,与前20个字节格式相同

选路域是一个选路守护程序的标识符,指出了这个数据报的所有者。一般是进程号。
选路标记是为了指出外部网关协议存在的。
子网掩码是应用在相应的IP地址上的。
下一站IP地址指明发往目的IP地址的报文该发向哪里。该字段为0表示发往目的地址的报文应该发给发送RIP报文的系统。
RIP2还支持多播,以减少不收听RIP2报文的主机的负载。