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

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

【TCP/IP详解 卷一:协议】第9章 IP选路的更多相关文章

  1. TCP/IP详解 卷一(第三章 IP:网际协议)

    IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输. IP提供不可靠.无连接的数据报传送服务. 1.不可靠:就是它不能保证IP数据报能成功地到 ...

  2. TCP/IP详解 卷一(第十三章 IGMP:Internet组管理协议)

    本章将介绍用于支持主机和路由器进行多播的Internet组管理协议(IGMP) 它让一个物理网络上的所有系统知道主机当前所在的多播组.多播路由器需要这些信息以便知道多播数据报应该向那些接口转发. 跟I ...

  3. TCP/IP详解 卷一(第六章 ICMP:Internet控制报文协议)

    ICMP是(Internet Control Message Protocol)Internet控制报文协议. 用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可达.路由是否可 ...

  4. TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)

    UDP是一个简单的面向数据报的运输层协议. UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地. UDP首部的个字段如下图所示

  5. 《TCP/IP详解 卷一》读书笔记-----UDP&IP 分片

    1.进程每产生一个UDP数据报就由一个IP数据报进行发送,而在TCP中,一个IP数据报并不与每个TCP报文段一一对应 2.UDP的端口号和TCP的端口号是相互独立的,对那些众所周知的端口号TCP和UD ...

  6. TCP/IP详解 卷一(第十七章 TCP:传输控制协议)

    与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...

  7. 『TCP/IP详解——卷一:协议』读书笔记——10

    2013-08-22 22:57:17 3.8 ifconfig命令 这个命令在Linux系统下可以通过下面的指令阅读说明文档: ifconfig 由于书中作者用的系统比较早的某Unix系统,所以我的 ...

  8. 『TCP/IP详解——卷一:协议』读书笔记——01

    从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...

  9. 【TCP/IP详解 卷一:协议】第二章:链路层

    2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...

  10. TCP/IP详解学习笔记(3)-- IP:网际协议

    1.概述      IP是TCP/IP协议族中最为核心的协议.所有的TCP,UDP,ICMP,IGMP数据都以IP数据报格式传输.      IP提供不可靠,无连接的数据报传送服务. 不可靠:它不能保 ...

随机推荐

  1. mysql 数据操作 多表查询 目录

    mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...

  2. Scala系统学习(三):Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  3. 在vue init webpack my-project卡住的问题

    在安装完node.js后,也用cnpm代替了npm,然后使用cnpm在node.js的安装路径下安装了vue-cli:cnpm install --global vue-cli.然后使用vue ini ...

  4. 安卓手机上微信无法打开Https网址的完美解决方案

    1,第三方网站检测网站的SSL证书是否正确的安装 https://www.geocerts.com/ssl-checker,大概率你会看到下边的场景,一个证书链完整的警告,如果想知道我的基础配置是什么 ...

  5. input标签file文件上传图片本地预览

    <input type="file" name="img-up" id="img-up" value="" /&g ...

  6. [转]VS中展开和折叠代码

    VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + M: 折叠或者展开当前方法 C ...

  7. Firefox及我使用的firefox扩展

    什么数字安全浏览器,什么极速浏览器,现在都取代不了Firefox在我心中的位置.你想想,一款浏览器老是弹呀弹的,时不时问我换不换桌面,问我请不清理垃圾,真是的,这些关它浏览器鸟事. 喜欢Firefox ...

  8. Echarts 的 Java 封装类库 转自 https://my.oschina.net/flags/blog/316920

    转自: https://my.oschina.net/flags/blog/316920 Echarts 的 Java 封装类库:http://www.oschina.net/p/echarts-ja ...

  9. Linux基础命令---eject

    eject eject指令允许在软件控制下弹出可移动媒体(通常是光盘.软盘.磁带或Jaz或ZIP磁盘).该命令还可以控制一些由某些设备支持的自动弹出功能的多光盘转换器,并关闭一些光盘驱动器的盘. 对应 ...

  10. ThinkPHP CURD mysql操作

    ThinkPHP CURD操作 ThinkPHP提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作(CURD):创建.更新.读取和删除的实现是最基本的,也是必须掌握的,在这基础之上才能熟悉更多 ...