推荐链接:网络地址与主机地址

9.1 引言

路由选择程序(daemon),通常这是一个用户进程。在大多数的Unix系统中,大多数的路由选择程序都是路由程序和网关程序。
路由表经常被IP访问,但是它被路由守护程序更新的频率却低很多,当接收到ICMP重定向报文时,路由表也要被更新。

9.2 选路的原理

在第三章中,介绍了IP搜索路由表的步骤:

  • (1)搜索完全匹配的主机地址与网络地址。
  • (2) (1)失败,搜索匹配的网络地址。
  • (3) (1)(2)失败,搜索default默认表项。(一般被指定为一个网络表项,网络号为0)

在Terminal下执行 netstat -rn 命令,列出路由表打印出主机名。

Flag(标志):

  • U 该路由可以使用
  • G 该路由是到一个网关(路由器),如果没有设置该标志,说明目的地是直接相连的。
  • H 该路由是到一个主机,也就是说目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,则目的地址是一个网络地址:一个网络号,或者网络号与子网号的结合。
  • D 该路由是由重定向报文创建的。
  • M 该路由是由重定向报文修改的。

标志G:是非常重要的一个标志,区分了直接路由(没有标志G)与间接路由(有标志G)

  • 发往直接路由(不含G)的packet(分组)中不但具有指明目的端的IP地址,还具有链路层的地址。
  • 发往间接路由(含G)的packet(分组),IP地址指明目的端,但是链路层地址指明的是下一跳的路由器(网关)。
    也就是说,含G与不含G的区别在于,是发往直接路由还是间接路由,以及分组中链路层的地址。

标志H:含有H表明目的地址是一个完整的主机地址,没有设置H表明目的地址是一个网络地址(主机号部分为0)

  • 当为 某一个 目的IP地址 搜索路由表 的时候,主机地址 必须与 目的地址 完全匹配。
  • 网络地址 只需要匹配 目的地址的网络号与子网号 就可以了。

拾遗

参考计数 Refcnt 给出的是正在使用路由的活动进程个数。
Use 显示的是通过该路由发送的分组数。

主机路由表的复杂性 取决于主机所在网络的拓扑结构。

  • (1)主机没有与任何网络相连接,路由表只有环回接口项。
  • (2)主机连在一个局域网上,只能访问局域网上的主机。这时候路由表包含两项:一项是环回接口,另一项是局域网(如以太网)。
  • (3)主机能够通过单个路由器访问其他网络时,一般情况下增加一个默认表项指向该路由器。

没有到达目的地的路由
如果路由表中没有找到匹配项,同时没有默认项,发生的情况:

  • (1)IP数据报是由主机产生的:给发送数据报的application 返回一个 “主机不可达差错” 或者是 “网络不可达差错” 的错误。
  • (2)IP数据报是被转发的:给原始发送端返回一份ICMP主机不可达的差错报文。

9.3 ICMP主机与网络不可达差错

当路由器收到一份IP数据报但又不能转发的时候,就要发送一份ICMP“主机不可达”的差错报文。

在教材中的例子中,把连接到路由器sun上的拨号SLIP链路断开,然后试图通过该SLIP链路发生分组给任一指定sun为默认路由的主机,就会出现这种错误。
当接通SLIP链路启动时需要在路由表中增加一项使用SLIP链路的表项,断开时则删除表项。那么当SLIP链路断开的时候,主机sun中的路由表就不存在默认表项了。

顶层选路域:维护大多数Internet网站的路由信息。

9.5 ICMP重定向错误

当主机可以选择路由器发送分组的情况下,才可能看到ICMP重定向报文。重定向 一般用来 让具有很少选路信息的主机 逐渐建立起 更加完善的路由表。
主机启动时 路由默认项 可以只有一项,一旦默认表项出现错误,默认路由器将通知它进行重定向,并允许主机对路由表进行相应的改动。

ICMP重定向 允许 TCP/IP主机 在选路时 不需要具备 智能特性,而把智能特性放在路由器端。

教材P91 介绍了ICMP重定向报文的格式,必须具有以下三个IP地址:

  • (1)导致重定向的地址(目的IP地址)
  • (2)发送重定向报文的路由器的IP地址
  • (3)应该采用的路由器IP地址

注意:重定向报文 只能由路由器生成,不能由主机生成。只能被主机使用,不能被路由器使用。

那么,路由表项可以被 (1)ICMP重定向报文 (2)路由守护程序 所更新及修改。

9.6 ICMP路由器发现报文

一般认为,在主机引导的时候,一般要广播或多播一个 路由请求的ICMP报文。一台或者多台的路由器响应一份 路由通告报文。
路由器在一份通告报文中可以通告多个IP地址。内含一对或多对IP地址和优先级,IP地址必须是发送路由器的某个地址,优先级是一个 有符号的32 bit整数,指明IP地址作为默认路由器地址的优先等级。

路由器操作

当路由器启动的时候,随机在所有广播或多播传送接口上发布通告报文。通告的间隔一般为450s-600s,一份默认的通告生命周期为30分钟。
当路由器的某个接口被关闭的时候,路由器在该接口上发送最后一份通告报文,并把生命周期设置为0。
路由器也监听来自主机的请求报文,并发送路由器通告报文来响应这些请求报文。

主机操作

根据路由通告报文,每一台监听相邻路由器报文的主机都能够建立自己的路由表实现网络通信。
在主机引导的时候,主机一般发送三份路由器请求报文,每三秒发送一次,一旦收到一个有效的通告报文,就停止发送请求报文。

2016/7/28

最新文章

  1. 微信支付:H5吊起支付API,不显示“确认支付、输入密码”界面
  2. Atitit.可视化与报表原理与概论
  3. Eclipse启动Tomcat错误:Several ports (8005,8009) required by Tomcat v6.0 Server at localhost are already
  4. bzoj2286
  5. python之列表、字典的使用
  6. PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
  7. AutoIt 脚本小试——刷网易云音乐歌单
  8. mysql的一些使用操作
  9. antd 主题色
  10. Django 是如何实现用户登录和登出机制的(默认版本-数据库版本)
  11. 文件下载Controller,文件夹内容监听,文件上传,运行程序通过url实现文件下载
  12. Unable to construct api.Node object for kubelet: can't get ip address of node master.example.com: lookup master.example.com on : no such host
  13. 分布式01-Dubbo基础背景
  14. 【Hive学习之八】Hive 调优【重要】
  15. Redis列表操作
  16. alpha阶段 代码结构及技术难点简介
  17. TeamView提示商业用途禁止使用
  18. vue input框数字后保留两位小数正则
  19. verilog系统函数用法
  20. OpenGL学习--06--键盘与鼠标交互

热门文章

  1. [MySQL5.6] 最近对group commit的小优化
  2. (c++) int 转 string,char*,const char*和string的相互转换
  3. vue-router中参数传递 && 编程式导航 && 坑 && beforeRouteEnter
  4. [py]flask从0到1-模板/增删改查
  5. poj2063 Investment
  6. 为什么GPU可以用于科学计算【转载】
  7. openstack 部署笔记--dashboard
  8. C# 后台动态添加标签(span,div) 以及模板添加
  9. 圆锥体完全均衡下重力异常正演 [MATLAB]
  10. Oracle 错误代码小结