热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TCPIP详解IP路由选择

TCPIP详解IP路由选择在本篇文章中,将通过例子来说明IP路由选择过程。如图所示,主机A与主机B分别在两个不同子网上,中间通过同一个路

TCP/IP详解 IP路由选择

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

在这里插入图片描述

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

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


  1. 当在主机A上输入ping 10.142.148.10后,主机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数据包,其在网络中的流向基本上是一个套路:

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

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


推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何配置小米wifi放大器来增强家庭无线路由器信号?
    本文介绍了如何通过配置小米wifi放大器来增强家庭无线路由器信号的方法。通过打开米家APP,选择设备添加,搜索并选择需要添加的wifi放大器,根据系统提示进行下一步操作即可完成配置。配置完成后,家庭无线路由器信号将得到增强。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
悠闲的大黄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有