1.主机A上的某个用户ping主机B的IP地址

  1.主机A的因特网控制报文协议(ICMP)将创建一个回应请求数据包(在它的数据域中只包含有字母)。

  2. ICMP将把这个有效负荷交给因特网协议(IP),然后IP协议会创建一个数据包。这时,这个数据包将包含源IP地址、目的IP地址和值为01h的协议字段(Cisco习惯在十六进制字符前添加0x,这样便有了0x01的表示)。

  在本例中,当数据包到达目的地时,所有这些内容会告诉接收方主机,它应该将这个有效负荷交给ICMP处理。

  3. 一旦数据包被创建,IP协议将判断目的IP地址是处在本地网络中,还是处在一个远程网络上。

  4. 本例中,由于IP协议断定这是一个远程请求,这个数据包需要被发送到默认网关,这样,这个数据包才会被路由到远程网络。Windows注册表将被使用,以查找配置的默认网关。

  5. 主机172.16.10.2(主机A)的默认网关被配置为172.16.10.1。要能够发送这个数据包到默认网关,必须要知道路由器的Ethernet0接口(其IP地址被配置为172.16.10.1)的硬件地址。

  为什么?因为只有这样,数据包才可以被下传给数据链路层并成帧,然后发送给与172.16.10.0网络连接的路由器接口。在本地局域网上,主机只可以通过硬件地址来进行通信。主机A要与主机B通信,它必须将数据包发送到本地网络中默认网关的MAC地址处。

  说明:MAC地址永远都应用于LAN本地,而决不会穿过或通过路由器。

  6. 接着,检查ARP缓存,查看一个默认网关的IP地址是否已经解析为硬件地址。

  如果已经被解析,数据包将被释放、传送到数据链路层并成帧(目的方的硬件地址也将同数据包一起下传至数据链路层)。要查看你的主机上的ARP缓存,可以使用下列命令:

  C:\>arp -a

  Interface: 172.16.10.2 --- 0x3

  如果这个硬件地址在主机的ARP缓存中尚未被解析,将在此本地网络中发送ARP广播,以搜索172.16.10.1的硬件地址。路由器会响应这个请求并提供Ethernet0的硬件地址,接着,这一主机将缓存这个地址。

  7. 一旦这个数据包和目的方的硬件地址被交付给数据链路层,局域网驱动器将提供媒体访问,以通过所用类型的局域网(在本例中,即以太网)。将产生一个数据帧,使用控制信息来封装此数据包。

  在这个帧中包含有目的方和源方的硬件地址,及以太网类型字段(这个字段里描述的是交付此数据包到数据链路层的网络层协议),在本例中,这个协议为IP协议。在这个帧的结尾处是被称为帧校验序列(FCS)的字段,

  它是装载循环冗余校验(CRC)计算值的区域。此时数据帧还需要查找一些信息,即源MAC地址(主机A的MAC地址),以及目的MAC地址(主机A的默认网关即E0的MAC地址)。注意,这里并不包含远端主机的MAC地址!

  当ping主机B时主机A发给Lab_A路由器的数据帧

  

  8. 一旦完成帧的封装,这个帧将被交付到物理层,以一次一位的方式发往物理媒体(在本示例中,是双绞线对)。

  9. 此冲突域中的每台设备都将接收这些位并重建成帧。它们都将运行CRC并核对保存在FCS字段中的内容。如果这两个值不相匹配,此帧将被丢弃。

  如果这个CRC值相吻合(在这个示例中,指的是路由器的Ethernet0接口),那么就核查目的方的硬件地址,检查它们是否也匹配。

  如果它是匹配的,那么路由器将查看以太网类型字段,以了解在网络层上使用的协议。

  10. 数据包从帧中抽出,然后这个帧剩下的部分被丢弃。再把数据包传送给在以太网类型字段中列出的上层协议,在这里是传递给IP协议。

  11. IP会接收这个数据包,并检查其IP目的地址。由于数据包的目的地址与接收路由器所配置的任一地址不相匹配,路由器将会在路由表中查看目的IP网络的地址。

  12. 此路由表中必须包含有网络172.16.20.0的表项,否则此数据包将被立即丢弃,然后发送回一个携带有“destination network unavailable”信息的ICMP包给源方设备。

  13. 如果路由器的确在它的路由表中查找到了目的方的网络,数据包将被交换到输出接口,在本示例中,为Ethernet l接口。下面的输出给出了Lab_A路由器的路由表。C表示“直接连接”。

    由于在这个网络中所有的网络(总共是两个网络)都是直接连接的,因此没有必要使用主动路由协议。

  Lab_A>sh ip route  ……

  14. 路由器将交换此数据包到Ethernet 1的缓冲区内。

  15. Ethernet1的缓冲区需要了解目的方主机的硬件地址,它首先检查ARP缓存。

   如果主机B的硬件地址已经被解析并被保存在路由器的ARP缓冲中,则这个数据包和这个硬件地址将被传递到数据链路层以便组成帧。下面是使用show ip arp命令得到的在路由器Lab_A上的ARP缓冲:

  Lab_A#sh ip arp

  Protocol Address Age(min) Hardware Addr Type Interface

  Internet 172.16.20.1 - 00d0.58ad.05f4 ARPA Ethernet0

  Internet 172.16.20.2 3 0030.9492.a5dd ARPA Ethernet0

  Internet 172.16.10.1 - 00d0.58ad.06aa ARPA Ethernet0

  Internet 172.16.10.2 12 0030.9492.a4ac ARPA Ethernet0

  连接线(-)表示它是路由器上的物理接口。从上述的输出可以看出,路由器了解此172.16.10.2(主机 A)和172.16.20.2(主机B)的硬件地址。Cisco路由器会将ARP表中的表项保留4小时。

  如果硬件地址没有被解析,路由器将从E1发送一个ARP请求,查找172.16.20.2的硬件地址。主机 B会使用它的硬件地址来进行响应,然后这个包和硬件地址都会被发送到数据链路层以组成帧。

  16. 数据链路层将使用这个目的MAC(主机B的MAC)和源的MAC(E1的MAC),及以太网的类型字段和处于帧尾部的FCS字段来创建一个帧。这个帧将被传送到物理层,并以一次一位的方式发送到物理媒体上。

  17. 主机B会接收到此帧并立即运行CRC。如果运算结果与FCS字段中的内容相匹配,再检查这个目的方的硬件地址。如果主机发现是匹配的,随后将检查以太网类型字段中的值,以判断应该将数据包上传给网络层的什么位置(在本示例中,为IP协议)。

  18. 在网络层,IP会接收这个数据包,并检查其目的方的IP地址。由于终归它们是匹配的,检查数据包的协议字段,以了解此有效负荷应该交付给谁。

  19. 此有效负荷会交付给ICMP,它将知道这是一个回应请求。ICMP会应答这个请求,通过即刻丢弃这个数据包并随后产生一个新的有效负荷来作为回应应答。

  20. 随后创建的数据包中将包含有源方和目的方的地址、协议字段和有效负荷。现在,目的方设备为主机A。

  21. 然后,IP将检查了解这个目的方的IP地址是否属于本地局域网上的设备,或者是位于远程网络上的设备。由于这个目的方的设备位于远程网络,此数据包将需要发送到默认网关上。

  22. 在此Windows设备的注册表上,可以找到默认网关的IP地址,之后将查看 ARP缓存,以了解是否已经完成了从IP地址到硬件地址的解析。

  23. 一旦默认网关的硬件地址找到,此数据包和目的方的硬件地址都将被送往数据链路层,以完成帧的封装。

  24. 数据链路层会封装数据包的内容,并在帧报头中包含以下内容:

  目的方和源方的硬件地址

  在以太网类型字段中填入0x0800(IP)

  将CRC结果填入FCS字段

  25. 这时,帧将被下传给物理层,并以一次一位的方式发送到网络媒体上。

  26. 路由器的Etherne 1接口会接收到这些位并重建为一个帧。运行CRC校验,校验帧的FCS字段,以确认两个结果是相符的。

  27. 一旦CRC校验通过,将检查硬件目的地址。由于路由器的接口同这个地址是相匹配的,数据包将被从这个帧中取出,然后检查以太网类型字段,以了解此数据包应该投递给网络层上的哪一个协议。

  28. 由于协议被判断为IP,于是IP将得到这个数据包。首先IP将对IP报头运行 CRC校验,然后检查目的方的IP地址。

  注:IP并没有像数据链路层那样使用完整的CRC校验,它只校验报头的错误。

  由于IP目的地址与路由器的各个接口的IP地址并不相匹配,路由器将会查看路由表,以了解是否存在一个通往172.16.10.0的路由。如果不存在一个路由可以到达目的网络,该数据包将立即丢弃(这是一个令许多管理员困惑的点,当一次ping失败时,

  许多人会认为这个数据包决没有到达目的主机。但是,正如我们在这里所看到的,事情并不总是这样的。上面所有造成这一现象的原因,仅仅是由于远端路由器缺乏返回源方主机网络的路由并将数据包丢弃!

  数据包被丢弃在返回源方的旅途中,并不是丢弃在它前往目的主机的过程中)。

  说明:当数据包在返回源主机的途中被丢弃时,由于这是一个未知的错误,通常将会看到“request timed out”的信息。 如果出现的错误是一个已知的错误,如假设在去往目的设备的路途中路由表内没有可用的路由,

  你将会得到“destination unreachable”的信息。根据这些信息,你可以判断问题是发生在去往目的的路上,还是在返回的途中。

  29. 在这种情况下,路由器确实知道到达网络172.16.10.0的方式,这一输出的接口是Ethernet 0,于是数据包将被交换到接口Ethernet 0上。

  30. 路由器检查ARP缓存,确定172.16.10.2的硬件地址是否已经被解析。

  31. 由于在将数据包传送到主机B的过程中,172.16.10.2的硬件地址已经被缓存起来了,因此,这一硬件地址和数据包将被传递到数据链路层。

  32. 数据链路层会使用这个目的方的硬件地址和源方的硬件地址,然后,将 IP放入以太网类型字段中,并对这个帧进行CRC运算,将此运算结果放入FCS字段中。

  33. 这个帧然后被传送到物理层,以一次一位的方式发送到本地网络。

  34. 目的方的主机将接收这个帧,运行CRC算法,检验目的方的硬件地址,并查看以太网类型字段中的内容,以断定谁来处理这个帧。

  35. 由于IP是被指定的接收者,随后这个数据包被传递给网络层的IP协议,它将检查包的协议字段,以确定进一步的操作。IP发现要将此有效负荷交给 ICMP的指示,接着ICMP将确定此数据包是一个ICMP的应答回复包。

  36. ICMP通过发送一个惊叹号(!)到用户接口来表明它已经接收到一个回复。这之后,ICMP会尝试继续发送4个应答请求到目的方的主机。

  注:当主机A发送数据包到主机B时,所使用的目的方硬件地址是默认网关的以太网接口。因为数据帧是不可以被直接发往远程网络的,它只有首先发送到本地网络上,而且去往远程网络的数据包必须要通过默认网关转发。

  举例:

  

  1. 来自主机A的帧中的目的地址将是路由器A F0/0接口的MAC地址。

  2. 数据包中的目的地址将是HTTP服务器上的网络接口卡(NIC)的IP地址。

  3. 在数据段头中的目的端口号是80。

  4. TCP的端口号将用于指引数据到达正确的应用程序窗口。

  5. HTTP服务器B接收到的帧的源地址是Router B的F0/0的MAC地址。

  注:如果有多台主机同时使用HTTP与这台服务器进行通信,那么它们必须全部使用各不相同的源端口号。这就是该台服务器如何在其传输层上保持数据分离的方式。

2.1)数据帧会在每一跳处被改变,而数据包将不会以任何方式改变或假造,直到它到达目的设备。

  2)MAC(硬件)地址将只能用在本地LAN上。它决不能由路由器的接口所传递。

  3)数据帧只能将数据包运载到两个地方:在LAN上数据帧使用MAC地址发送数据包。数据帧既可以将数据包发给LAN的任一台主机,也可以当数据包定向到远端网络时将数据包发给路由器的接口。

  4)If you have a DCE serial interface, what command must you enter for that interface to work:Router(config-if)#clock rate speed

  5)   R 10.0.0.0/8 [120/15] via 192.168.40.1, 00:00:07, Serial0

  The network 10.0.0.0 cannot be placed in the next router‘s routing table because it already is at 15 hops. One more hop would make the route 16 hops, and that is not valid in RIP networking.

IP路由__IP路由选择过程的更多相关文章

  1. 【计算机网络】一步一步学习IP路由流程

    TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...

  2. TCP/IP协议栈 --- IP路由

    IP路由:当一个IP包在主机发送出去或者在网络当中时,是怎么选择路径到达目的主机的呢? 一般情况下, 如果说源主机和目的主机在同一个网络中的话,那个数据报可以直接到达目的主机而不经过路由器,下面可以试 ...

  3. Linux基础命令---IP路由操作

    ip ip指令可以显示或操作路由.网路设备,设置路由策略和通道. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora.   1.语法     ...

  4. 彻底理解Cisco/Linux/Windows的IP路由

    -1.只要理解实质,名称并不重要! 很多使用Linux的网络高手在面对Cisco管理员的诸如管理距离,路由度量等词汇时,还没有PK就自觉败下阵来了.我觉得这实在太可惜了,大家本是一家,为何这么为难对方 ...

  5. IP路由及静态路由配置

    IP路由及静态路由配置 qianghaohao(CodingNutter) 链接来源:http://www.cnblogs.com/codingnutter/p/5654271.html 一.IP路由 ...

  6. 用寄快递模拟数据在网络中的传送过程,发送一个ip数据报到接受这个ip数据报经历的过程

    发送一个ip数据报到接受这个ip数据报经历的过程 好比寄一个快递的过程 这个包裹一共有三层, 这个包裹的最里面是数据,数据 第二层写着目的ip地址和源ip地址,即收件人和发件人的姓名 第三层也就是最外 ...

  7. IP路由原理

    IP路由原理 一.什么是路由 路由是指导IP报文发送的路径信息. 二.路由表的构成 路由表是路由器转发报文的判断依据 三.路由器单跳操作 四.路由表查找规则 1.选择度量值小的进行转发 2.永远将下一 ...

  8. Linux IP 路由实现

    以下代码取自 kernel . [数据结构] 该结构被基于路由表的classifier使用,用于跟踪与一个标签(tag)相关联的路由流量的统计信息,该统计信息中包含字节数和报文数两类信息. 这个结构包 ...

  9. IP路由__距离矢量路由选择协议

    矢量路由选择协议 1.距离矢量路由选择算法发送完整的路由选择表到相邻的路由器,然后,相邻的路由器会将接收到的路由表项与自己原有的路由表进行组合,以完善路由器的路由表. 由于路由器接收到的更新只是来自相 ...

随机推荐

  1. android 百度地图 团队开发及正式apk发布

    百度地图开发关键是获取正确的API Key,  百度官网写的只是在你本地的机器能运行 你把AndroidManifest.xml(这里是最新的v2_4_1,API Key配置在这里) svn 提交后  ...

  2. 关于c语言的知识点不足的地方

    在最近的一次c语言考试之前,自己根据老师说的会出原题的卷子的总结 关于代码的自动对齐,dev c++ CTRL+shift+A/a 关于运算顺序的csdn上有,常考的有/ %等 上地址 https:/ ...

  3. Ubuntu 一直要求依赖的错误

    今天笔者在windows上装linux双系统,选用的ubuntu,因为第> 一次用,所以出现了这个问题. 如题,安装个gcc一直要求我要装依赖,如图 接下来我又开始一个个安装那些依赖,比如 su ...

  4. 写给小白看的Mysql事务

    1 为什么需要事务 在网上的很多资料里,其实没有很好的解释为什么我们需要事务.其实我们去学习一个东西之前,还是应该了解清楚这个东西为什么有用,硬生生的去记住事务的ACID特性.各种隔离级别个人认为没有 ...

  5. Mac M1原生(ARM64)Golang dev&debug

    前言 通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题. Go 1.16版将正式支持Apple Silicon M1芯片,即arm64架构 ...

  6. 【MyBatis】MyBatis 多表操作

    MyBatis 多表操作 文章源码 一对一查询 需求:查询所有账户信息,关联查询下单用户信息. 注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询.如果从用户 ...

  7. 【剑指 Offer】03.1.不修改数组找出重复的数字

    找出数组中重复的数字. 在一个长度为 n + 1 的数组 nums 里的所有数字都在 1-n 的范围内.所以数组中至少有一个是重复的.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, ...

  8. 剑指offer 面试题3:数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  9. wpf 中 Ellipse 对象对动画性能的影响

    vs2019 .NetFramework 4.8 win10-64 1909 接手一个wpf项目,某窗口中包含大量的 Shape 对象(线,矩形,圆形等). 这些内容要匀速的向左平移,类似于游戏&qu ...

  10. /usr/bin/ld: cannot find -lc

    yum install glibc-static [root@test chkrootkit-0.50]# make sensecc -static -o strings-static strings ...