设备名称 | 工作协议层次 | 优 势 | 劣 势 |
集线器 | 物理层 | 工作在物理层,性价比高,接入设备可以收到 网络上所有报文。现在常用它来调试网络 | 在接入很多设备时,网 络性能会直线下降 |
交换机 | 数据链路层 | 隔离冲突域,每个端口都能达到标称的传输 速率,接入后一般不用配置 | 未隔离广播域 |
路由器 | 网络层 | 隔离广播域和冲突域,用于两个网络互联 | 一般价格较高,接口较 少,且需要手动配置 |
防火墙 | 大多为网络层及 网络层以上 | 可以按需隔离两个或多个网络之间的流量 | 一般配置较复杂 |
以太网
- 以太网是最流行的局域网传输标准,是由施乐公司发明,并由施乐、英特尔和 DEC 公司组成的联盟发展形成的开放标准
- 以太网是总线型结构,物理结构采用星状布线
- 以太网是一种共享传输介质的广播传输技术,就是说网络上所有的设备均能检测到在网络上所有传输的帧。想在网络上传输数据的节点首先监听网络介质是否有数据传输,在检测到线路空闲时,节点开始传输数据并同时监听,确保不会和其他设备传输数据冲突。如果两个节点同时传输数据,监测到冲突后,想要传输数据的节点需要等待一个随机的时间周期 才能再次进行传输,这样就减少了再次发生冲突的可能性
MAC 寻址
- 为了在以太网上传输报文,必须有一个寻址系统,也就是对计算机和网络接口命名的 方法。每一个计算机的网卡本身均有一个唯一标识,每一个网络接口都有一个物理地址, 这个地址就是 MAC 地址,这个地址也称为网卡物理地址。MAC 地址长度为 6 个字节,表 示为 12 个十六进制的数字。前 6 个数字为组织唯一标识符(OUI),是由 IEEE 组织分配的 3 个字节数字。剩下的 6 个数字由组织内部编号,企业组织内部需要保证任意两个网卡的 MAC 编号不能重复。在实际书写中,常用冒号来分隔每一个字节,Mac 地址例如: 08:00:27:26:c5:5d
- 以太网是一种广播传输技术,网络上的所有节点均能检测到网络介质上传输的帧,但 一般只有自身 MAC 地址和帧目的 MAC 地址相同才会将内容复制到自己的缓冲区,交给 IP 层进一步检查 IP 信息。当网卡工作在混杂模式下时,会将所有侦听到的内容交给上层 软件处理,例如TcpDump抓包软件
- 并不是所有的 MAC 地址网卡均能使用,有一些特殊的 MAC 地址,例如 FF:FF:FF:FF: FF:FF 是以太网广播地址。还有一段地址 01:00:5E:00:00:00-01:00:5E:7F:FF:FF 用于以太网组 播(在组播部分有详细描述)
冲突和冲突域
- 当两个网络节点同时传输数据时就会发生冲突。以太网采用载波侦听及冲突检测回退 处理算法来处理冲突,冲突会导致网络传输效率降低,每次发生冲突,所有的传输都要停 止一段时间
- 以太网的核心思想是使用共享的公共传输介质。它是一种广播性网络,任何节点帧的 发送和接收过程都使用载波监听多路访问/冲突检测(CSMA/CD)技术,来分配共享信道 的使用。在采用 CSMA/CD 技术的局域网中,帧的发送和接收过程如下:
- ①计算机节点在准备传输数据时,首先要对信道进行监听
- ②如果信道是空闲时则发送数据,否则继续监听直到信道空闲
- ③发送数据帧的同时,还要继续监听信道,如果发生冲突,发送信息的节点就会停 止发送,同时发送端需要向通信信道发送阻塞信号,以通知其他节点已发生冲突。当若干节点同时检测到信道空闲并发送数据时,数据传输就会遭到破坏,即发生冲突。冲突检测 的过程为发送节点发送数据的同时,将其发送信号与总线上接收到的信号进行比较,如果 不一致,则有冲突发生
- ④冲突发生后,随机延迟一段时间再重发,称为冲突退避。如果冲突经常发生则会 导致网络性能的快速下降
- 第一层设备(HUB)不会隔离冲突域。二层及以上设备隔离冲突域。因此二层以上设备 将大大提高数据传输性能
广播域
- 广播是发送到网络中所有节点的数据分组,广播以广播地址来识别,链路层广播地址 为 FF:FF:FF:FF:FF:FF。在广播时网络中的所有节点均收到该广播报文并做进一步处理。广 播域是指能收到广播报文的设备节点集合
- 第一层设备(集线器)总是转发报文,不对数据进行过滤,将收到的所有信息转发到 另一分段。数据帧只是简单的重新生成和重新定时,因此不隔离广播域
- 第二层设备(网桥和交换机)根据 MAC 地址转发数据帧,因此将网络划分为多个冲 突域。如果目标 MAC 地址不在本冲突域内,将转发数据帧。因此也不隔离广播域
- 第三层设备(路由器)不会转发广播报文。路由器为广播域的边界
ARP 协议
- ARP(Address Resolution Protocol)协议用于根据主机的 IP 地址来查询其网卡 MAC 地址。在以太网中,真正寻址的是 MAC 地址,但是在主机传输报文时所知道对端的地址 是 IP 地址。如何通过目标 IP 地址知道对方的 MAC 地址,这就是 ARP 协议的目标。ARP 协议通过向局域网中的所有主机发送广播来查询目标 IP 的 MAC 地址。当目标主机收到查 询请求后和本机 IP 地址比较,如果一致就通过单播响应查询请求,将自己的 MAC 和 IP 对应关系发送给请求源主机
- 通常操作系统均有一个 arp 命令可以查询当前所保存的 ARP 缓存
- 下图所示的是一个 ARP 查询请求。主机 A(10.0.2.15)向网络上发起广播查询请求, 询问目标 IP 为 10.0.2.2 的 MAC 地址。由于还不知道目标 MAC 地址,因此目标硬件地址为广播地址 FF:FF:FF:FF:FF:FF。当主机 B 收到 ARP 查询报文后,和自己 IP 地址进行比较 发现地址相同,则向主机 A 回送一个单播的 ARP 响应。主机 A 收到后就会更新自己的 ARP 缓存表。以后再次使用时将在缓存中查询。ARP 缓存表采用了老化机制,在一段时间内如 果缓存表中的某一个 MAC 没有使用,就会被删除,这样可以大大减少 ARP 缓存表的长度, 加快查询速度。
IP报文格式
- 版本号占4个比特,用于表示报文的版本号,IPv4 类型报文的版本号为 4
- IP头长度占4个比特,用于表示 IP 消息头的 4 字节倍数长度,最小为 5,即 5×4 字 节,IP 消息头最小为 20 字节
- 服务类型占8个比特,服务类型提供了服务质量的抽象参数,这些参数用于指导当经 过一个数据网络时的实际服务质量参数选择,现在大多数路由器未做实现
- 报文总长度字段占 16 个比特(是包含报文包头和数据的整个报文的字节长度),允许 最大报文长度是 65535 字节(这么大的报文长度在网络上是不可能存在的)。所有主机必 须能接收至少为 576 字节大小的报文。这个尺寸可以承载 512 字节的数据加上 64 字节的包 头。假定目的主机可以接收大报文,那就推荐主机仅发送大于 576 字节的报文,大报文可 以提高网络数据传输带宽
- 标识符占16个比特,发送者用于标识报文,可用于报文分片和组装
- Flag占 3 个比特,用于分片控制
- 分片偏移量占 13 个比特,用于表示报文所属的分片
- 报文生存时间(Time to Live,TTL)占 8 个比特,这个字段指示报文在网络系统中的最大生存时间。每经过一个路由器,这个值减少处理时间的秒值。如果处理时间小于1, 则至少减1,如果这个字段值减少到零,则报文直接丢弃。TTL是报文的最大生存周期, 目的是将无法找到目的地的报文丢弃,约束报文的最大生命周期。因为现代路由器的处理 速度非常快,这个字段的含义已经演化为经过路由器的跳数
- 生存时间是数据包生存时间的上限。它由数据包的发送者设定,在网络上每个点,当 数据包被处理的时候,逐渐递减。如果生存时间在数据包到达目的地址前达到 0 值,数据 包就被销毁。生存时间可以看作一个自我销毁时间限制。生存时间由发送者设置成允许数 据包在网络系统上存活的最大时间。如果数据包在因特网系统上的时间长于生存时间,则 数据包必须被销毁
- 在 Internet 头部被处理的每个节点,该头部必须减小,以反映花在处理数据包上的时 间。即使无法获得实际花费时间的本地信息,该头部也必须减 1。时间以秒为单位衡量(比 如,值 1 表示 1 秒)。因此最大生存时间是 255 秒或者 4.25 分钟。由于处理数据包的每个 模块至少对 TTL 减 1,即使 它在小于 1 秒内处理完数据报,因此 TTL 只能被当作数据报可 以存在的时间上限
- 协议号占 8 个比特,指示 IP 协议承载的内容类型,有各种各样的协议内容。例如, TCP 为 0x06,UDP 为 0x11,ICMP 为 0x01,等等
- 包头校验和占 16 个比特,包头域中的值发生改变,例如 TTL,这个值在处理过程中 将重新计算和验证。校验和是 16 比特数据,是所有报文头的 16 比特之和,计算时,校 验和为 0。校验和用于检查报文传输是否正确,如果错误则直接丢弃,并不会发送 ICMP 差错消息,因为报头校验和只能检测出 IP 数据报的头部出现了错误,但并不知道头部的 源 IP 地址字段是否正确,如果源地址出现了错误,那么传输 ICMP 差错报告将没有任何 意义
- 校验和提供了处理 IP 数据报使用到的信息被正确传输的确认,数据可能包含错误。 如果校验和验证失败了,IP 数据报就被检测到错误的实体立即丢弃
- 如果 IP 头部改变,IP 头部校验和要重新计算。比如,生存时间的减少,IP 选项的增 加或者变化,或者由于分片。在 IP 级别的这个校验和用来防止 IP 头部的传输错误
下面是一个实 际报文示例
IP地址分类
- IP地址长度为32位,以4字节数字来表示。互联网的IP地址分为5类
- 第 1 类是A类地址,最高位必须是 0,然后是 7 比特的网络编号和 24 比特的本地地 址(主机号)。因为最高位为 0,所以总共有 128(
)个 A 类网络地址
- 第 2 类是B类地址,最高的两位是 10,紧接着是 14 比特的网络编号和 16 比特的本地 地址。这样就有 16384(
)个 B 类网络地址
- 第3类是C类地址,最高位为 110,有 21 位的网络编号和 8 位的本地地址,这样就有 2097152(
)个 C 类网络地址。
- 第4类是D类地址,是用于组播的 IP 地址,最高的 4 位是 1110,不再区分网络编号 和本地地址,这类地址不能用于设置物理接口地址
- 第5类是E类,是保留地址,未做规定,因此一般不使用该类地址
- A、B、C 类IP是单播地址,报文转发一般是基于目的IP地址。D 类(组播地址)报文转发是基于源地址和目标地址组合
特殊 IP 地址块
- 有一些地址用于固定的用途,其中私有地址(Private address)是保留地址,属于非注册地址,专门为组织机构内部使用
- 另外,路由器不能路由源地址为 0 和 127 开头的报文,也不应该路由目的地址为 0 和 127 开头的报文
- “127.0.0.0/8”表示本地回环地址。真实的网卡IP地址中不能以十进制“127”作为开 头,该类地址中数字 127.0.0.1 到 127.255.255.255 用于回路测试。一般采用 127.0.0.1 代表本 机 IP 地址,用浏览器访问“http://127.0.0.1”就可以测试本机中配置的 Web 服务器
- 网络ID的第一个 8 位组也不能全置为“0”,全“0”表示本地网络
- 每一个字节都为 0 的地址“0.0.0.0”对应于当前主机
- IP地址中的每一个字节都为 1 的 IP 地址“255.255. 255.255”是当前子网的广播地址
- IP 地址中凡是以“1111”开头的 E 类 IP 地址都保留用 于将来和实验使用
寻址和分片
IP协议实现了两个基本功能:寻址和分片
- 寻址是指IP模块在报头中带有地址来传 输 IP 报文到目的地址。传输路径的选择称为路由,这些在路由部分来阐述
- 分片是指当这些大报文在通过小报文传输网络时,会将大报文分片传输
服务类型、生存时间、选项和校验和
IP 协议使用4个主要机制来提供服务:服务类型、生存时间、选项和校验和
- 服务类型用来指示要求的服务质量。服务类型是一个抽象的整套参数,这些参数指定 了组成因特网的网络中提供的服务选择。这个服务指示类型在选路的时候被路由器用来为 某一个特定的网络、下一个网络或者下一个网关选择真实的传输参数。服务类型用于 IP 服务质量选择。服务类型通过一组参数(优先级、延迟、吞吐和可靠性)来指定。这组参 数被映射成数据报传输中的特定网络的真实服务参数。在大多数网络中服务类型并没有特 别的使用
- 生存时间是数据报可以生存的时间上限。它由发送者设置,由经过路由的地方处理。 如果报文生存时间为零,则丢弃此数据报
- 选项提供了在某些情况下需要或有用的控制功能,但是大多数情况下是不必要的。选 项包括时间戳、安全和特殊选路等
- 报头校验和用于保证数据的正确传输。如果校验出错,则抛弃整个数据报。IP 协议并 没有提供可靠传输机制,没有端对端或者逐跳(hop-by-hop)的确认机制。没有数据的错 误控制,只有一个头部校验和,没有重传,没有流控。检测到的错误可以通过 IP 控制消 息协议(ICMP)来报告,该协议在 IP 协议模块中必须实现
ICMP概述
- 在 Internet 系统中,IP 协议被用作主机到主机的数据报服务。网络连接设备称为路由 器。这些路由器通过网关到网关协议或动态路由协议相互交换用于控制的信息。在数据报 传输过程中,可能会遇到一些传输问题,为了报告在数据报传输过程中遇到的错误,网关 或目的主机使用 ICMP 协议来和源主机通信。它使用 IP 协议作为底层支持,好像它是一 个高层协议,但实际上它是网络层的一部分,任何网络层模块的实现必须实现 ICMP 协议
- ICMP 消息在以下几种情况下发送:当数据报不能到达目的地时;当网关已经没有缓 存去转发;当网关能够引导主机在更短路由上发送
- IP 并非设计为绝对可靠,这些控制消息的目的是当网络出现问题的时候能提供反馈信 息,而不是使 IP 协议变得绝对可靠。而且并不保证数据报或控制信息能够返回。一些数据报仍将在没有任何报告的情况下丢失。如果需要高可靠性,使用 IP 的高层协议必须实 现自己的高可靠性控制处理
- ICMP 信息通常报告在处理数据报过程中的错误。若要避免信息无限制地返回,对于 ICMP 消息不会再有 ICMP 消息发送,而且 ICMP 信息只在处理数据报偏移量为 0 时发送, 即数据报的第一个分片报文错误时发送
报文格式
- ICMP 消息使用最基本的 IP 报文头。在 IP 报文头指明协议为 ICMP(0x01),数据位置 的第一个 8 位是 ICMP 类型域,这个值决定了其后内容的格式。任何标记“未使用”的域 用于以后的扩展,现在必须设置为零,但接收时并不使用(除了计算校验和)。除非明确 的单独说明格式,ICMP 报文格式如下
- 类型:一个8位类型字段,表示ICMP数据包类型,现在支持的类型共10种
- 代码:一个8位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为0
- 校验和:数据包中 ICMP 部分的一个 16 比特检验和,从 ICMP 消息的 ICMP 类型 开始的 16 位数据的反码之和计算得出。在计算校验码时,校验和设置为零。这些零在发 送时会被计算出的校验和取代
报文分类
- ICMP 报文大致可分为3类:差错报文、请求报文和响应报文
类型 含义 请求报文 响应报文 差错报文 0 echo 响应消息 * 3 目的不可达报文 * 4 源抑制消息 * 5 重定向消息 * 8 echo 请求消息 * 11 超时消息 * 12 参数问题消息 * 13 时间戳请求消息 * 14 时间戳响应消息 * 15 信息请求消息 * 16 信息响应消息 *
差错报文
- 网络出现异常情况时,就需要发送一份差错报文,该报文始终包含源报文的 IP 首部 和产生 ICMP 差错报文的 IP 数据报的前 8 个字节。这样接收 ICMP 差错报文的主机就会把 它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含 在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联 系起来
- 以下各种情况即使出错也不会导致产生 ICMP 差错报文:
- ①ICMP 差错报文
- ②目的地址是广播地址或组播地址
- ③作为链路层广播的数据报
- ④不是 IP 分片的第一片
- ⑤源地址不是单个主机的数据报文,也就是说源地址不是零地址、环回地址、广播 地址、组播地址或 E 类地址
- 以下针对 ICMP 差错报文的类型进行分析:
- ①ICMP 目的不可达消息。如果路由器因为没有去往目的地址路由而不能转发报文,则路由器必须产生目的不可达消息,是代码域为零(网络不可达)的 ICMP 消息。 如果报文需要转发到的主机,已经转发到最后一跳路由器(主机直连的网络),路由器判 断不能到达目的主机,则路由器必须产生代码域为 1 的目的不可达 ICMP 消息(主机不 可达)
- ②ICMP 重定向消息。网关 G1 从所连接的网络的一个主机上收到 IP 报文。网关 检查路由表获知下一个路由器 G2 的地址和目的地址网络 X。如果 G2 和源主机在同一个网 络上,那重定向报文将发给主机。重定向消息告知主机发往目的网络 X 直接发往 G2 是最 短路径
- ③ICMP 超时消息。IP 数据包中有一个字段生存时间(Time to live,TTL),生存时 间值在每一个机器处理报文时都会减少,直到减到 0 时该 IP 数据包被丢弃。此时,路由 器将发送一个 ICMP 超时消息给源主机
- ④源抑制消息。当主机经过路由器发送数据到另一主机时,如果速度达到路由器或 者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。路由器不应该产生源抑制消息, 因为实践表明对减少网络带宽没有价值
- ⑤参数问题。如果网关或主机处理报文时发现一个消息头参数问题,在它不能完成 处理这个报文时,必须丢弃这个报文。例如,不正确的选项。网关或主机通过参数错误消 息通知源主机。这个消息仅用于如果错误引起报文丢弃的情况
查询报文、响应报文
- ICMP ECHO 消息。用于进行通信的主机或路由器之间,判断发送数据包是否成功 到达对端的消息。可以向对端主机发送 ECHO 请求消息,接收对端主机回来的 ECHO 应 答消息
- ICMP 地址掩码消息。主要用于主机或路由器想要了解该网络中主机数量的情况。 可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应 答消息获取子网掩码信息
- ICMP 时间戳消息。可以向主机或路由器发送 ICMP 时间戳请求消息。接收到的数 据(时间戳)的消息在回复时再带上另外一个时间戳返回。时间戳是自午夜 UT 时间的 32 位毫秒值。现在已经很少使用
ping
- ping 是利用 ICMP ECHO 请求消息,产生一个 ECHO 响应消息。ping 使用 ICMP 报头,并使用填充字节填满报文。当源主机向目标主机发送了 ICMP 回显请求数据包 后,它期待着目标主机的应答。目标主机在收到一个 ICMP 回显请求数据报文后,它 会交换源、目的主机的 IP 地址,然后将收到的 ICMP 回显请求数据报文中的数据部分 原封不动地封装在自己的 ICMP 回显应答数据报文中,然后发回给发送 ICMP 回显请 求的一方。如果校验正确,发送者便认为目标主机的 IP 层服务正常,也即 IP 层连接 畅通
- 当使用 ping 来诊断和测试网络时,一般通过以下步骤来执行:
- 首先 ping 本机 IP。判断本地接口是否启动以及工作正常
- 其次 ping 网关地址。根据响应判断局域网工作是否正常,结束时会有最小/平均/ 最大来回时间统计和报文是否丢失统计
- 最后 ping 目的主机地址。判断本机和目标主机之间的路由是否正确以及目的主机 是否工作正常
TraceRoute
- TraceRoute 程序用于侦测源主机和目的主机之间所经过的路由情况,可以跟踪路由数 据包在 IP 网络上传输到一个指定主机的路径,参数含义如表 7-4 所示。它利用 IP 协议的 生存时间(TTL)字段来试图引发网关 ICMP 超时响应。在每个网关的路径上发送 ICMP 超时响应到源主机上。源主机发送的报文 TTL 从 1 开始逐渐增加,直到收到 ICMP 回显请 求响应消息或达到最大跳数值为止。这意味着已经到达主机或者超过 30 跳了。默认每一 个相同的 TTL 会发 3 个探测报文,如果路径不同会都输出。如果在 5 秒钟没有响应则会以 星号(*)显示
- 唯一必须的参数是目的主机 IP 地址。可选参数有探测包长度,默认为 60 字节。测试 中发现很多路由器对于 UDP 数据如果是 TTL 原因数据丢包不会发 ICMP 超时差错消息, 而对 ICMP 请求会返回 ICMP 超时响应。因此在使用时,建议使用-I 参数来指明使用 ICMP 协议来发起请求
- 在 Windows 下可以使用 tracert 替代,但不需要指定使用的协议。功能基本相同
- traceroute命令参数含义如下:
参 数 含 义 -I --icmp 使用 ICMP ECHO 请求来进行 traceroute T 使用 TCP SYN 请求来 traceroute,使用端口 80 -z 两个探测报文之间的最小等待时间(默认为 0),在 0 和 10 秒之间。如果数字小于 10,单位为秒,如果大于 10,那数字就是以毫秒为单位 -q nqueries 每一跳发送的探测报文数量。默认是 3 -w waittime 设置等待响应消息的时间。默认是 5 秒 -m 设置最大的跳数,默认为 30 跳 -n 不解析 IP 地址为域名
UDP报文
- UDP 报文非常简单,仅在 IP 报文上增加了 8 字节数据,并且在传输数据之前不需要 首先建立连接,远程主机在接收到数据后也不需要确认,因此网络通信开销比较小。下图所示为 UDP 消息的报文格式
- 源端口:是发送者进程使用的端口,占有 16 比特,因此合法范围为 1~65535
- 目的端口:是接收者进程使用的端口,和源端口一样占用 16 比特,一般特权用户使 用 1~1024,非特权用户使用其他端口
- UDP报文长度:包含 UDP 消息包头和数据的总长度
- UDP校验和:用于验证传输数据是否正确。这个字段是可选的,如果字段为 0,就不 进行校验
TCP
- 另外一个传输层协议是传输控制协议(TCP),和 UDP 协议完全相同的部分是使用了源端口号和目的端口号,不同的是提供了可靠的数据传送。传输数据之前需要进行 3 次握手连接,并在传输的中间过程进行确认。这带来了一些便利,例如保证了数据到达目标地址,如果没有到达将立即重传。但这同时也带来了一些创建网络连接的开销。
- 路由器一般少处理IP层以上的内容,这里不再详述TCP协议,请参考RFC793
主机A发送报文到主机C的各层协议模块工作过程:
例如在主机A上执行ping 192.168.6.102
- ①在主机A按照ICMP协议组装ICMP请求报文。在组织ICMP请求完成后,使用IP协议来发送报文
- ②在IP层发送报文时,首先查看目标地址路由是否可达,如果路由不可达那就退出,并提示“Network is unreachable”等类似的错误。这里的IP地址配置为同一子网,因此路由可达。那就首先查看目标IP的MAC地址是否在本机的缓存上,如果存在,则使用目标MAC将报文直接封装为第二层的帧,再经物理层信号编码发往网络传输介质上
- ③如果 ARP 缓存中没有目标 IP 地址,那就发送 ARP 广播来请求目标 IP 的 MAC 地 址。目标 MAC 地址填写为广播地址 FF:FF:FF:FF:FF:FF。ARP 数据帧经物理层线路进入交 换机端口,交换机通常会进行源 MAC 地址学习和目的端口查找,如果找不到目标 MAC 所在的网口,则在除报文源端口外的全部端口广播 ARP 查询请求。此时主机 B 和 C 均收 到 ARP 查询请求,主机 B 发现目 IP 地址和本机地址不同,则静悄悄地丢弃,不做进一步处 理。主机 C 收到 ARP 查询请求后判断和本机 IP 地址相同,则 C 响应 ARP 请求,将主机 C 的 IP 地址和 MAC 地址的对应关系以单播形式回送给主机 A。这时交换机可以再次学习到 C 的 MAC 地址与端口对应关系,在下次 ARP 查询和传送数据时就不再对所有端口进行广播
- ④如果主机 A 收到主机 C 的 MAC 地址的 ARP 查询响应,那就将目的 MAC 填写为 C 的 MAC 地址,源 MAC 填写为自己的 MAC 地址,封装为二层帧数据中交给物理层来发 送。当再次进行主机 A 向主机 C 发送数据,将直接使用缓存中 C 的 MAC 地址进行封装, 不再进行 MAC 地址的 ARP 广播查询
- ⑤如果此时主机 C 恰好关机,主机 A 没有收到 ARP 响应消息,那就提示用户 “Request timed out”或“Destination Host Unreachable”等信息
- ⑥当主机 C 收到数据帧之后,首先判断目标 MAC 地址是否和本机匹配,如果不匹 配则静悄悄地丢弃,不做任何处理。如果和本机 MAC 相同则交给 IP 层进行处理。IP 层收 到报文后,首先判断目的 IP 地址是否和本机 IP 相同,如果不同则丢弃报文;如果相同则 交给上层协议处理,这里交给 ICMP 协议模块来处理。这样报文便单向处理完成。响应报 文和请求报文一样,也是同样的发送及处理过程
主机A发送报文到主机E的各层协议模块工作过程:
例如在主机A上执行ping 8.8.8.8
- ①如果主机 A 路由查询判断到达目标主机必须通过下一跳网关地址。那进行 ARP 查询时,就查询网关地址的 MAC 地址。路由器将响应 ARP 请求,将自己的 MAC 地址和 IP 发送回来
- ②如果主机 A 在进行路由查询时,发现目标主机直接经过网卡设备可以到达,例如 主机 A 的默认路由配置为接口路由,没有配置默认网关地址。那进行 ARP 查询时,就直 接请求目标 IP 的 MAC 地址。如果路由器 D 有 ARP 代理功能,将会响应 ARP 请求,并将 自己的 MAC 地址和目标 IP 对应起来
- ③主机 A 收到网关的 ARP 响应报文后,目标 IP 地址不变,将目标 MAC 填写为网 关 MAC 地址,然后将数据帧经过物理网卡发送到链路上
- ④主机 D 收到报文后,进行 MAC 地址检查,如果目标 MAC 地址和自己的 MAC 地址匹配,则进一步转到 IP 层进行处理。IP 模块判断目标 IP 地址不是本机 IP 地址,如 果主机 D 没有配置为路由器,那就直接丢弃这个报文;如果主机 D 配置为路由器,则将 报文交给 IP 转发模块进行处理。IP 转发模块会将报文 TTL 减一,并再次进行路由查询过 程和 ARP 查询过程,然后将数据报文转发到离目标地址 E 更近的一个路由器上。在中间 转发的过程中,数据报文的目标 IP 地址和源 IP 地址始终不变,源 MAC 地址和目标 MAC 地址在每一跳中均根据其物理连接进行修改