TCP/IP详解 IP路由选择

在本篇文章当中, 将通过例子来说明IP路由选择器过程

如图所示, 主机A与主机B分别是处在两个不同的子网当中, 中间通过一个路由连接. 如果主机A请求与主机B进行通行, 主机A寻找主机B的位置的过程就可以理解为IP路由的选择过程.

现在主机A的用户通过Ping命令确认与主机B的连通性. Ping命令看似简单, 但是其中IP路由选择的过程还是会有很多的步骤. 具体的步骤如下 :

  1. 当主机A上输入12.34.56.78之后, 主机A的因特网控制报文协议(ICMP)创建一个回应请求数据包, 其数据域中只包含有字母.

  2. ICMP协议会将刚刚创建的回应请求数据包(有效负荷)转交给因特网协议(IP协议)。IP协议会对这个数据包进行封装,创建一个数据包。在IP协议创建的数据包中,包括主机A的IP地址,目的主机B的IP地址以及值为01h的协议字段。当数据包达到主机B时,主机B通过判断协议字段01h,将这个有效负荷交给ICMP协议处理。

  3. IP协议创建数据包后,会判断目的主机B的IP地址是处于本地网络中还是处于远程网络。根据IP地址规则,主机A、B属于不同网络。此时IP协议所创建的数据包会被发送到默认的网关。(在每个终端设备中,网络配置中需要包含自身的IP地址,以及默认到的网关地址。在不同网络之间的主机互相通信,依靠的就是网关设备)

  4. 如图中所示,默认的网关就是图中的路由器。此时我们需要确认路由器的MAC地址。假设路由器对应连接到主机A的路由器网络接口的IP地址为10.142.149.1,那么主机A(10.142.149.6)的默认网关配置为10.142.149.1,。现在要将IP数据包发送到对应的路由器网络接口10.142.149.1上,就必须知道这个接口的物理地址,也就是MAC地址。只有知道MAC地址,IP数据包才能够从网络层传递到底层的数据链路层并根据链路层的规则生成帧。之后主机A才能把链路层中的包发送到IP地址为10.142.149.1的路由器接口上。在本地局域网中,主机只可以通过硬件地址进行相互通信。所以当主机A要把数据包发送给对应的路由器接口时,必须提前知道这个路由器对应的MAC地址。这时就需要用到ARP协议,ARP协议的具体讲解后面会单独写一篇笔记进行分析。主机A会先检查本地的ARP缓存,查看一个默认网关的IP地址是否有对应路由器接口的MAC地址。如果ARP缓存表中有对应的记录,表示IP地址已被成功解析。此时,IP层会将数据包传递到数据链路层并生成帧。其中目的主机B的MAC地址也将和数据包一起传递到数据链路层。通常情况下,在主机A中,可以通过ARP命令来查看主机当前的IP地址与MAC地址对应表。

  5. 生成数据帧。当IP数据包和目的主机B的MAC地址传递给数据链路层后,局域网驱动器将用以提供媒体访问服务,以通过以太网进行数据传输。通过一些控制信息封装IP数据包,形成数据帧。数据帧中包含有目的主机B和源端主机A的MAC地址,以及以太网类型字段。以太网类型字段主要用来描述交付这个数据包到数据链路层的网络层协议。数据帧结尾是一种被称作为帧校验序列的字段,它装载循环冗余校验计算值的区域。总结一下,以这个例子来说,主机A的数据链路层中生成的数据帧包括目的地址MAC地址(指的是对应路由器接口的MAC地址)、主机A自身的MAC地址、以太网类型字段、数据包、帧校验序列。注意:这个传输过程中,目的地址不是主机B的MAC地址,而是与主机A对应的路由器接口的MAC地址。最后数据帧到物理层以位(bit)的形式传输。

  6. 路由器接口接收这些位(bit)并且重新合并成数据帧。接收完毕后,会进行CRC过程并核对保存在帧校验序列字段中的内容。如果值互相不匹配,则数据帧将会被丢弃。如果两个值相同,则路由器接口将会接收主机A传输过来的数据帧,并核查数据帧中的目的放的MAC地址,是否与自身MAC地址匹配。路由器还会查看数据帧的以太网类型字段,以了解在网络层采用的协议类型,然后路由器就会抽出数据帧中的数据包,丢弃其余内容。抽取后的数据包传送给以太网类型字段中列出的上层协议。在本例中为IP协议。

  7. IP协议接收这个数据包后,检查目的IP地址。在本例中,由于数据包中的目的地址与接收路由器所配置的任何地址都不相匹配,所以路由器会在自己的路由表中查看目的IP网络的地址。本例中,由于路由器同时还连接着10.142.148.10,所以在这个路由器中的路由表中,有相关的记录。若没有相关记录,则这个数据包会直接被丢弃。数据包被丢弃后,会向主机A发送一个“目标地址不可达”的错误信息。

  8. 如果路由器在它的路由表中找到了对应的网络地址记录,则数据包就会被转发到路由器的输出接口。在本例中,就是路由器用来与主机B连接的接口。路由器会将这个数据包交换到对应接口的缓冲区内。

  9. 接下来就是路由器接口缓冲区中数据包处理情况。这个接口缓冲区需要知道目的主机B地址的MAC地址。因为现在数据包中包含了目的主机B的IP地址,所以路由器会根据这个IP地址检查本地ARP缓存表,如果主机B的MAC地址已经被解析并缓存在路由器的ARP缓冲中,则这个数据包和主机B的MAC地址会被传递到数据链路层以便重新生成数据帧。在路由器以前跟主机B通信过的情况下,主机B的IP与MAC地址的映射记录会在路由器中缓存四个小时。超过四小时未再通信的话,IP与MAC地址的映射记录将会被删除。如果在路由器ARP的缓冲表中没有这个映射记录,则路由器接口被在其连接的子网内部发送一个ARP请求。ARP请求是以广播方式发送的,子网内部所有的主机都会受到这个请求,发现这个请求的主体是10.142.148.10的MAC地址。这时各个主机会检查自己的IP地址,发现不匹配,就会抛弃这个ARP请求包。而主机B检查自己的IP地址,发现匹配成功,这时主机B就会进行响应,将自己的MAC地址告诉路由器。因此路由器就能够得知目的主机B的IP地址和MAC地址,就会把数据包和目的主机B的MAC地址传递到底层的数据链路层中。当然这时,路由器也会把主机B的IP地址和MAC地址缓存到自己的ARP缓冲表中,以备下次使用。

  10. 路由器随后会生成数据帧,传送到物理层,以位的方式发送到物理媒体上,在网络介质上进行传输。

  11. 主机B接收到数据帧后进行CRC校验过程。校验结果与帧校验序列中字段内容相同的话,则数据帧中目的方的MAC地址会被读取,主机B会比对这个MAC地址与自己的MAC地址是否相同。如果相同,则会抽取其中的数据包,并根据以太网字段类型中指定的协议,把数据包传递给相应的协议处理。在本例中,数据包中是一个回应请求,所以主机B会把这个数据包最终交给ICMP协议处理。ICMP协议会应答这个请求,同时把这个数据包丢弃并迅速生成一个新的有效负荷作为回应应答。然后主机B会利用同样的过程把数据包以及目的MAC地址传递到下一层,让其生成数据帧,通过物理介质传递到对应的路由器接口上。

  12. 路由器会重复上面对应的步骤,把数据包转交到另一个接口上进行传递,随后主机A就接收到一个回应应答信息,表示主机A到主机B的网络是通的。

总结 : 以上就基本阐述了IP路由选择的全部过程。在本篇笔记中,列举的是一个路由器节点的例子。像多路由器的转发的情况也是同一个道理,到达每个路由器时都会先搜索路由表,以确定下一步数据传输到哪里或者是丢弃。大致步骤都是相同的,对于IP数据包,其在网络中的流向基本上是一个套路:

  • 主机A的传输层将数据交给网络层,网络层添加IP首部,如双方IP地址,TTL等信息,封装称为IP数据包,然后通过ARP协议获取目的MAC地址后,将数据包交给数据链路层。
  • 数据链路层根据IP、MAC地址,将数据帧封装为物理帧,通过物理媒体传输。
  • 主机B接收物理帧,判断MAC地址。如果与自己MAC地址匹配,就把数据帧交给网络层处理。
  • 网络层判断IP地址是否匹配,如果是发给自己的,则再移交上层协议处理;如果不是,则在路由表中查找此IP地址的下一跳地址,并将数据通过内存从接受数据网卡的IP程序copy到发送数据网卡的IP地址。在发送接口中, 通过ARP请求获取下一跳的MAC地址,IP程序将数据包和目的MAC地址交给数据链路层,然后封装为数据帧,通过物理媒体传输数据帧。

在IP路由选择的过程中,我们可以发现路由表的作用是不可或缺的。下一跳的地址还是直接丢弃数据包,都是与路由表息息相关。下一篇笔记将会简单介绍一下路由表的形式与作用。

TCP/IP详解 IP路由选择的更多相关文章

  1. tcp/ip详解-ip头部选项字段

    IP头部的选项字段 作用:用于网络调试和测试 IP首部的可变部分就是一个可选字段.选项字段用来支持排错.测量以及安全等措施,内容很丰富.此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目 ...

  2. C++游戏服务器编程笔记 IP详解

    C++游戏服务器编程笔记 IP详解 IP详解 INTERNET的历史 上世纪60年底起源于美国 1992年,Internet上的主机超过了100万台 现在已经是现代文明人的必需品    TCP/IP的 ...

  3. TCP/IP详解 (转)

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

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

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

  5. TCP IP详解(转)

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...

  6. 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

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

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

  8. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

  9. TCP/IP 详解7 Ping指令

    首先介绍一下ping 指令的基本过程:(这部分摘自网络) 我们以下面一个网络为例:有A.B.C.D四台机子,一台路由RA,子网掩码均为255.255.255.0,默认路由为192.168.0.1 1. ...

随机推荐

  1. 切比雪夫定理(Chebyshev's theorem)与经验法则(Empirical Rule)

    切比雪夫定理(Chebyshev's theorem):适用于任何数据集,而不论数据的分布情况如何. 与平均数的距离在z个标准差之内的数值所占的比例至少为(1-1/z2),其中z是大于1的任意实数. ...

  2. Python中的异步任务队列 arq

    引言 最近在用 sanic 写东西,所有涉及到IO阻塞的代码都需要用 aio 的模块,好在近年来 asyncio 生态圈发展的还算不错,该有的都有 ~ 近期业务中 登录/注册 业务涉及的很复杂(涉及到 ...

  3. MVC方法返回值数据

    ModelAndView的作用以及用法 使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图.从名字上看ModelAndView中的Model代表模型,View代表视图,这个 ...

  4. navicat提示无法连接解决办法

    1.错误如下图: 2.这个是由于mysql中user表中未设置允许该ip访问导致,解决办法: 1)查下user表:select user,host from user; 这张表就是mysql.user ...

  5. Mac上安装Python3虚拟环境(VirtualEnv)教程

    如果已经安装好pip3,那么执行命令安装virtualenv环境 pip3 install virtualenv 安装完成检测版本是否安装成功 virtualenv --version 创建新目录 M ...

  6. 学习HSDB

    HSDB则是在SA(Serviceability Agent)基础上包装起来的一个调试器,而SA是个非常便于探索HotSpot VM内部实现的API. Stack Memory窗口的内容有三栏: 左起 ...

  7. Scrum Meeting 博客汇总

    Scrum Meeting 博客汇总 一.Scrum Meeting 1. Alpha 第一次 Scrum Meeting 第二次 Scrum Meeting 第三次 Scrum Meeting 第四 ...

  8. MySQL 性能调优

    MySQL 性能调优   索引 索引是什么 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料. 索引目的 ...

  9. docker使用dnnmmp安装gocron

    使用dnnmmp安装mysql和phpmyadmin默认使用dnnmmp_default网络,因为在安装其他依赖mysql的应用时,需指定网络 ,同时需指定mysql名称 原命令: docker ru ...

  10. nodejs命令行执行时带参数

    nodejs命令行执行时带参数 转 https://www.jianshu.com/p/474e6d76f867   今天项目里突然想在初始化时跑一些数据,于是想起以前在python时可以在命令行里带 ...