《Linux高性能服务器编程》——2.4 IP路由
2.4 IP路由
IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。为了理解IP路由过程,我们先简要分析IP模块的基本工作流程。
2.4.1 IP模块工作流程
IP模块基本工作流程如图2-3所示。
我们从右往左来分析图2-3。当IP模块接收到来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。
如果该IP数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报。如果该IP数据报的头部中目标IP地址是本机的某个IP地址,或者是广播地址,即该数据报是发送给本机的,则IP模块就根据数据报头部中的协议字段来决定将它派发给哪个上层应用(分用)。如果IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。
数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。我们将在后面讨论数据报转发的具体过程。
IP数据报应该发送至哪个下一跳路由(或者目标机器),以及经过哪个网卡来发送,就是IP路由过程,即图2-3中“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发往相同的下一跳路由器(或者目标机器)。我们将在后面讨论IP路由过程。
IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文、TCP报文段和UDP数据报)的IP数据报。
图2-3中的虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议或者route命令调整路由表,使之更适应最新的网络拓扑结构,称为IP路由策略。我们将在后面简单讨论它。
2.4.2 路由机制
要研究IP路由机制,需要先了解路由表的内容。我们可以使用route命令或netstat命令查看路由表。在测试机器ernest-laptop上执行route命令,输出内容如代码清单2-2所示。
该路由表包含两项,每项都包含8个字段,如表2-2所示。
代码清单2-2所示的路由表中,第一项的目标地址是default,即所谓的默认路由项。该项包含一个“G”标志,说明路由的下一跳目标是网关,其地址是192.168.1.1(这是测试网络中路由器的本地IP地址)。另外一个路由项的目标地址是192.168.1.0,它指的是本地局域网。该路由项的网关地址为*,说明数据报不需要路由中转,可以直接发送到目标机器。
那么路由表是如何按照IP地址分类的呢?或者说给定数据报的目标IP地址,它将匹配路由表中的哪一项呢?这就是IP的路由机制,分为3个步骤:
1)查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到则转步骤2。
2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址(比如代码清单2-2所示的路由表中的第二项)。如果找到,就使用该路由项;没找到则转步骤3。
3)选择默认路由项,这通常意味着数据报的下一跳路由是网关。
因此,对于测试机器ernest-laptop而言,所有发送到IP地址为192.168.1.*的机器的IP数据报都可以直接发送到目标机器(匹配路由表第二项),而所有访问因特网的请求都将通过网关来转发(匹配默认路由项)。
2.4.3 路由表更新
路由表必须能够更新,以反映网络连接的变化,这样IP模块才能准确、高效地转发数据报。route命令可以修改路由表。我们看如下几个例子(在机器ernest-laptop上执行):
$ sudo route add –host 192.168.1.109 dev eth0
$ sudo route del -net 192.168.1.0 netmask 255.255.255.0
$ sudo route del default
$ sudo route add default gw 192.168.1.109 dev eth0
第1行表示添加主机192.168.1.109(机器Kongming20)对应的路由项。这样设置之后,所有从ernest-laptop发送到Kongming20的IP数据报将通过网卡eth0直接发送至目标机器的接收网卡。第2行表示删除网络192.168.1.0对应的路由项。这样,除了机器Kongming20外,测试机器ernest-laptop将无法访问该局域网上的任何其他机器(能访问到Kongming20是由于执行了上一条命令)。第3行表示删除默认路由项,这样做的后果是无法访问因特网。第4行表示重新设置默认路由项,不过这次其网关是机器Kongming20(而不是能直接访问因特网的路由器)!经过上述修改后的路由表如下:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
Kongming20 * 255.255.255.255 UH 0 0 0 eth0
default Kongming20 0.0.0.0 UG 0 0 0 eth0
这个新的路由表中,第一个路由项是主机路由项,所以它被设置了“H”标志。我们设计这样一个路由表的目的是为后文讨论ICMP重定向提供环境。
通过route命令或其他工具手工修改路由表,是静态的路由更新方式。对于大型的路由器,它们通常通过BGP(Border Gateway Protocol,边际网关协议)、RIP(Routing Information Protocol,路由信息协议)、OSPF等协议来发现路径,并更新自己的路由表。这种更新方式是动态的、自动的。这部分内容超出了本书的讨论范围,感兴趣的读者可阅读参考资料1。
《Linux高性能服务器编程》——2.4 IP路由相关推荐
- 《Linux高性能服务器编程》——导读
前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...
- 《Linux高性能服务器编程》学习笔记
<Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...
- Linux高性能服务器编程——书籍阅读笔记
目录 前言 正文 第一章 1. 零拷贝函数 2. TCP/IP协议族 3. OSPF 4. ARP协议 5. RARP 6. ICMP协议 7. TCP协议 8. UDP协议 9. 封装 第四章 TC ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条 ...
- 【Todo】【读书笔记】Linux高性能服务器编程
在读 /Users/baidu/Documents/Data/Interview/服务器-检索端/<Linux高性能服务器编程.pdf> 其实之前读过,要面试了,需要温习. P260 So ...
- 《Linux高性能服务器编程》阅读笔记 之(二)IP 协议详解
目录 IP服务的特点 IPv4 头部结构 介绍 使用 tcpdump 观察 IPv4 头部结构 IP 分片 介绍 使用 tcpdump 观察 IP 分片 IP路由 IP 模块工作流程 路由机制 IP转 ...
- linux高性能服务器编程书本总结
目录 目录分析 第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型 第二篇 核心篇 5 章到 15 章节 5-6章节 主要介绍 套接字编程API的使用和介绍 7章 是linux 服 ...
- linux高性能服务器编程第八章(高性能服务器程序框架)
C/S模型 传统C/S,一端作为客户端,一端作为服务器,这里不做多介绍. P2P模型 peer 2 peer ,每台机器使用服务的同时也提供服务,通俗的讲,没有绝对客户端和服务端的概念,当下云计算的模 ...
- 《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...
第四章 TCP/IP通信案例:访问Internet上的Web服务器 HTTP协议是工作在应用层上的协议,其应用十分广泛,而在进行通信的过程中,经常使用HTTP代理服务器.HTTP代理服务器主 ...
最新文章
- grep的常用命令语法
- HarmonyOS之常用组件TextField的功能和使用
- python计算圆周率_Python实现计算圆周率π的值到任意位的方法示例
- Convert(varchar(8),Getdate(),108) 什么意思
- 注入域对象而不是基础结构组件
- 动态规划:LIS优化
- 笔记本电脑摄像头不能用_聊一款想代替笔记本电脑的产品
- Java中遍历删除ArrayList中多个元素
- 01_Redis基础
- 到现在还说房价不可能跌的都是些什么样的人?
- Facebook又开两处AI实验室,在西雅图和匹兹堡招兵买马
- 在C ++中将int转换为字符串的最简单方法
- kafka是什么_Kafka凭什么速度那么快?
- minecraft fabric_server 和 MCDR 安装与运行
- Unity实用案例之——动画压缩
- 使用runas命令让域用户可以以管理员权限运行程序
- 【C/C++】基础概念
- 1265 最近公共祖先
- Python爬虫之爬取淘女郎照片示例详解
- 后台有数据但是jsp无法显示问题.
热门文章
- FFmpeg — 屏幕录制器材
- ASP.NET 2.0中实现跨页面提交
- STL里面的sort()函数使用结构体
- 软考信息系统项目管理师_信息系统综合测试与管理---软考高级之信息系统项目管理师027
- ES6新特性_ES6中Map的介绍与API---JavaScript_ECMAScript_ES6-ES11新特性工作笔记032
- 微服务升级_SpringCloud Alibaba工作笔记0003---理解spring webflux_响应式堆栈_提高微服务吞吐量和伸缩性
- SpringCloud工作笔记049---nginx的安装及配置为简单的文件服务器
- SpringCloud工作笔记038---spring cloud-简单网关权限控制_直接在zuul里面做
- SpringCloud学习笔记002---Spring Cloud实战微服务准备
- mxnet window10 cpu 模式的安装