网络层协议

网络层协议

前言

在很久以前的章节,已经介绍了应用层, 运输层相关的东西。已经大概对数据究竟是如何从一台主机到另一台主机有所了解,即端到端。

了解了在TCP中数据收发两端究竟是如何保证数据的有序性,可靠性等特性。又是如何进行流量控制, 如何控制应对网络拥塞,其中又包括,网络拥塞的定义。同时还知道了,如何建立起一条TCP连接,通话双方又是怎样断开连接的。而相应的,自然也是明白了 UDP到底是一种不负责任的传输方式。

并且我们也发现一点,将数据从传输层丢进网络层之后就不管不顾了,维护数据的有序性,可靠性等等其他的特性大都由传输层自身来实现。

那么这一篇章就是来看,当数据进入网络层之后怎样通过重重管道到达另一端的。

数据报格式

当数据从运输层传输到网络层的时候, 此时对于网络层而言并不区分上层究竟是TCP或是UDP,在发送到网络层的时候被作为一个整体来看待。

而IP数据报格式如下:

  • 4bit的版本号,与大多数数据格式一样,一开始指定的都是版本号,决定接下来的数据究竟该以怎样的方式被解读。而IP协议,目前有IPv4, IPv6两种版本。

  • 4bit的首部长度,与TCP协议类似,在其首部有 可选项部分, 是以,IP首部长度不定,需要通过这个字段指示数据究竟从哪里开始。

  • 8bit的服务类型,将不同类型的IP区分开来。

  • 16bit的数据报长度,IP首部 + 数据 所以理论上最大支持度数据报长度是65535字节,但由于计算机网络中的MTU限制,最大长度一般为1500字节。数据超出这个长度就要进行分片处理。至于更多则在本节下的补充中进行说明。

  • 16bit标识, 13bit片偏移, 3bit标志, 这部分是为IP分片而服务的。

  • 8bit寿命(Time-to-live TTL), 保证数据不会永远在网络环路中循环,当数据经过一台路由器时, TTL - 1, 当为0,则数据被丢弃。

  • 8bit协议号, 在应用层与运输层之间,通过端口号将两者粘合,而在运输层与网络层之间则是协议号, 仅当到达目的地才起作用,指定运输层协议究竟是什么。

  • 16bit校验和 将IP首部每两个字节当做一个数,用反码运算对这些数求和。当不一致需要丢弃数据, 而路由器需要重新计算校验和放回原处,因为可能TTL值会发生变化。 而之所以IP与运输层都要进行校验和计算,是运输层校验首部及数据不同, IP校验和仅计算IP首部。另一点则是,IP层并不一定必须与运输层同时使用。

  • 32bit源IP地址

  • 32bit目的IP地址

  • 选项, 可选项, 由于选项的存在使得路由器处理IP数据有了额外开销,在Ipv6中已经去掉这一点。

  • 数据, IP数据报的核心部分。

需要注意到的一个地方是,IP首部长度为20字节,如果在运输层采用的是TCP协议,则每条数据报需要承载的首部有40字节。

IP数据报分片

需要注意到的是, 不同的链路协议对数据的承载能力是不同的, 以太网中最大承载的能力不超过1500字节,一个链路层帧所能承载的最大数据量就被称作是MTU。

但是我们知道, 对于IP数据报,其长度最大为65535字节,远远超过MTU数值,需要做的就是将数据报进行分片,切分成更小的数据发送,这些较小的数据报就被称为片。

但分片之后,又是怎样保证数据报能够被恰当的还原呢?这就需要相应的标识,偏移量, 标志位,来确定当前数据流是否结束,以及片在原始数据中所处的位置,以便进行正确的还原。同时需要注意到一点的是, 在从一个个网络节点向下一节点发送的过程中,可能对上一节点适用的数据片大小对下一节点就不再适用,需要在当前节点再次进行数据分片处理。 这无疑加大了网络层的负担。 同时,不得不考虑到安全性问题, 毕竟需要按照一定规则进行数据的重组, 如果恶意发送的数据

所以在IPV6中废弃掉了这一点,禁止在IPV6的网络层进行分片处理,对于太大的数据直接让在源端中进行分组,网络层的中间节点不再负责处理这件事情。但是依然会有上一节点的MTU与当前节点的MTU不一致的情况出现。对待这样的现象有两点作为保障,一是要求支持IPV6的节点,其链路层都要提供1280MTU的容量。 而难免依然会出现小于1280的情况出现,那么IPV6对于本地始发的数据报则进行分片, 并不违背原则, 而非本地始发的分片则会被丢弃!!!并且给源端发ICMPv6 'Too Big'消息。

IPV4编址

而对于一台主机而言,究竟是怎样链接进入网络的?

一台主机通常只有一条链路连接到网络,当想要发送数据时,则在该链路上进行发送,主机与物理链路之间的链接则被称为接口。对于PC而言,功能较为单一,而对于路由器来说,它需要从一条链路上接收数据并向另一条链路发送数据,因此至少有两条链路。 IP要求每个接口都有自己的IP地址,因此IP并非与主机, 路由器, 而是与接口相关。

也因此, 一台路由器必然会存在多个IP。 对于IPv4而言,其地址长度为32位,因此最多能够拥有40亿地址,而IPv6的长度为128位,不必担心。 那么仅仅40亿地址,对于全球来说够用吗?在现在这个时代来说是显然不够用的,毕竟能够接入网络的设备是这样多,每台设备分配一个IP地址的话, 怎么够用呢?

这个问题暂时留在这里,稍后再提。

先来看一下IP编址规则。

IPV4长度为32位, 对于我们日常生活中所见到往往是这样一种地址 192.168.0.9 大概类似于这样的数字, 每3位对应8bit,不难发现, 最大值必然是

1111 1111 1111 1111 1111 11111 1111 1111

32位均为1, 最大值也就是 255.255.255.255.

现在我们已经有了属于自己的IP地址,在发送数据的时候终于有了自己的名字,那么接下来呢? 该怎样让全世界听到我的声音呢?

路由 转发

当我们向外界发送一条消息时,主机中的网络层会将对应的数据封装成 IP层数据报,即网络分组, 然后通过链路向路由器发送,路由器拿到发送的数据,知道了你的目的IP,然后通过路由规则在转发表里查找,决定了需要将数据发送的下一个节点是谁。

和快递比较类似,当收到一批货物,根据货物的不同地址发送到相关的省市,根据更详细的地址进一步分拣,层层处理,最终发送到目的地。

转发:就是在路由器内部,从入链路到出链路之间的一个过程。

路由:在整个网络中,根据每个路由器中的转发表, 选择发送的路线。

做分组交换的有两种, 一种是根据链路层关键字确定的, 另一种则是根据网络层首部字段确定的, 分别被称作链路层网络交换机, 路由器。 在这里提到的都是路由器。

对于一个路由器而言,可能有多个出链路接口,以便将目的地不同的数据报发送到不同的路由器中去。而转发时,使用的时目的地址的前缀进行匹配。假定以 111.222.111.开始的目的地址需要被发送到1号接口, 111.222.112.开始的需要被发送到2号接口,路由器所需要的就是根据前缀去进行匹配,完成端口的选择转发。

但是会存在这样一种可能性,多个转发项都可以匹配成功,如对于 IP地址 111.222.111.111而言, 既可以匹配111.222.. 也可以匹配111.222.111.*,当有多个匹配项时,路由器采取的是最长匹配前缀原则,即与转发表中最长的匹配项进行匹配。 合适的就转发。

而这种规则,也并不是没有缘由的。

每个人都都有属于自己的IP地址,如果分配混乱的话寻址就是一件很不方便的事情,这样每台路由器必须知道对方的精确地址才能进行导航。 是按照一定的规则进行分组的, 将整个地址空间划分为一个个子网,通过子网层层连接,将整个网络家庭关联起来:

A.B.C.D/n, 表示32位IP地址的前n位与A.B.C.D的前n位相同。比如192.168.1.0/24,所有前24位与192.168.1.0相同的都是这个网段的IP,由于IP地址8位一分组,24位就是前三段,也就是192.168.1.x。符合规范的这段连续的IP段就叫做一个子网。这种子网的表示方法叫做CIDR。

对于我们来说通过192.168.1.0/24的方式来理解比较方便,但是对于计算机而言,有一种更快的方式来 判断 当前IP是否属于当前分组。 则是将32位地址与某个特殊值 进行与 运算, 如果运算结果 与 192.168.1.0/24 和特殊值进行与运算的结果一致, 则表示属于当前子网。

对于192.168.1.0/24 而言, 这个特殊值就是 后八位均为0的数值, 即 255.255.255.0与192.168.1.109进行与运算结果与 192.168.1.0结果一致, 这个255.255.255.0就被称作是子网掩码。

正是在子网中,层层递进,最终才能将数据送到我们的目的地。

路由器工作原理

路由器由这样几个部分构成:

  • 输入端口:这部分负责输入链路与路由器之间的物理链路,同时也要负责与远端输入链路的交互功能, 同时还需要在这里完成分组查找, 即通过输入信息,查询究竟应该发送到哪一个输出端口,这里的端口指的是物理端口。 而另外必须要做的事情是, 检查分组版本号, 检验和, 寿命, 同时更新后两个属性。 更新用于网络管理的计数器。

  • 交换结构:将路由器的输入端口, 输出端口相连接。 完成数据的转发工作。

  • 输出端口: 主要有存储, 发送。 存储从交换结构转发来的分组,按顺序发送到链路层。

  • 路由选择处理器:执行路由选择协议, 帮助输入端口查询到应该交由哪一个输出端口处理。同时也需要维护路由表,以及网络管理功能。

在这里并不穷究细节究竟是怎样的, 仅在功能上来说, 输入端口, 交换结构, 输出端口三者之间, 有从输入链路流入输入端口的数据Rin, 数据经过交换结构进入输出端口Rc, 通过输出端口到达输出链路Ro,三者之间的处理速度需要有一个均衡, 当Rin的速度过快, Rc或Ro的速度过慢,都会引起拥塞,数据无法被及时且恰当的处理,都会在持续时间内不断累积,最终使得 数据超出缓存, 导致被丢弃。 丢包产生的源头也正是在这里。

地址分配

已经大致知道数据究竟是以怎样的方式在网络中进行流通的。那么一台主机究竟如何获取它自身的IP地址?进而完成数据发送的第一步。

先来看一个组织究竟如何获取到属于它的IP地址,它会首先从它的上层ISP中已经拥有的大块IP地址中获取到其中的一部分IP地址。

对于一个组织而言, 如上层ISP已经被划分了一个地址范围 111.111.16.0/20, 它可能会将自己的IP地址范围进行八等份, 它的可支配范围只在后12位,可支配范围就在 111.111.16.0 ~ 111.111.30.255之间,因为此时可支配的最大IP是 0110 1111 0110 1111 0001 1111 1111 1111。 通过这种方式, 这个组织就能够拿到该属于自己的IP地址。

层层向上,最顶级的ISP依然要获取到属于自己的IP地址, 可以由 因特网名字和编号分配机构进行直接分配。

DHCP

而当组织获取到自身的IP地址范围之后,我们当然可以通过手动的方式为每一台主机分配相应的IP地址,也就不得不在有新的主机离开加入的时候更改其IP地址。但幸运的是, 我们有更简单的方式分配IP地址。

动态主机设置协议(Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。

DHCP分配IP的方式有这样几种:

  • 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。

  • 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。

  • 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。

在家庭网络平常使用路由器的时候, 正是通过动态分配的方式,

三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

特殊的IP

在下一步之前,有这样两个特殊的IP地址。

255.255.255.255 广播地址,即目的IP是这个地址的消息会被所有主机接收到,而其传播范围非常有限,到了广播域的边界(网关)会自动终结。 至于网关是什么,稍后再说。

0.0.0.0 表示的就是未知地址, 当主机刚刚开机,还没有加入网络时,所用的就是这个地址。

DHCP地址分配

DHCP为主机分配地址通过以下几个步骤:

  • DHCP服务器发现(DHCP discover):当主机需要加入一个网络时首先通过UDP的方式在端口67发送DHCP发现报文, 通过广播的方式发送出去, 此时源IP为0.0.0.0 目的Ip为 255.255.255.255, 链路层将该数据报广播到所有与该子网相连接的子网。

  • DHCP服务器提供(DHCP Offer): 在响应时,依然采取广播的方式。 但在这里又有所争议,个人理解偏向于,当客户请求时,已经指定了究竟应该选择广播还是单播的方式。 由于有这样一种情况存在, 当客户请求时已经携带了自己需要的IP地址,DHCP服务器发现这个IP地址在自己的连接池内,且没有被占用,就会将IP分配给当前主机。 而当响应时, 主要根据Chaddr:客户端的mac地址 进行识别。 DHCP的详细数据格式就不再说明。 而如果有多个DHCP服务器进行响应, 可以择优选取。

  • DHCP请求(DHCP Request):客户端从一个或多个DHCP服务器中选择一个,并向所选择的服务器提供 DHCP请求报文,回显配置参数。

  • DHCP ACK:DHCP服务器向客户发送ACK,对客户端的请求进行响应, 证实其所请求的参数。

NAT

现在我们通过种种方式拿到了自己想要的IP地址,现在该回头看之前提到的问题了, 全世界只有那么多的IP地址,每人一个根本不够分配的。

同时我们用IpConfig命令会意识到, IP地址总是 192.168.0.xxx, 无论我们在哪个办公室办公大都如此。

是的,答案是局域网。

通过将一部分主机限制在局域网内, 对外界而言, 这一批主机具有统一的IP, 这并不稀奇, 我们将数据发送到统一的路由器中, 由它向外发送。

路由器不难识别数据究竟是谁发送出去的, 但是问题来了, 数台主机统一发送数据, 不同的服务器也会进行响应, 那么究竟该怎样识别响应回来的数据究竟是发送给谁的?

答案是端口。我们知道, 无论是UDP, 还是TCP都需要确定发送方与接收双方的端口是什么, 当局域网内的数据发送到路由器时, 此时保存一个映射表。即:

192.168.0.100 6666 -> 111.111.111.111 8888

192.168.0.101 7777 -> 111.111.111.111 7777

正是通过这样的方式, 完成了相关的转换过程。 而身处于局域网中的IP地址 是通过: 路由器通过ISP DHCP获取其地址, 同时路由器自身也拥有DHCP用于向内部分发地址。

而上面的映射表则被称为: NAT转换表。

我们会注意到的地方是, 这是将IP层面所该处理的 问题, 转嫁到了应用层的相关端口去进行处理, 虽然觉得不合理, 但NAT已经是目前而言不可或缺的版块。

内网穿透简述

既然理解的上面所说的核心部分, 也就不难理解另一个概念, 内网穿透。 而这里的原理可能并不准确,大都是个人理解。等以后学会了 wireshark相关再来看一下这个问题。

当我们使用内网穿透工具时, 大都会精确到某一个端口, 告知对方, 我们自己的端口是什么, 需要访问的端口是什么, 由局域网内部的本机发起请求,通过这种方式就在我们与公网之间的IP + 端口建立起了有效链接,当有外界对 公网的IP:端口发起请求时, 则会通过他间接地与 自身建立起相应链接。

因特网控制报文协议

因特网的网络层具有三个主要组件,一是IP协议,二是路由选择协议, 三是 因特网控制报文协议(ICMP)。

ICMP是在主机与路由器沟通彼此的网络信息时使用,而其最经典的用途,是用在差错报告。

ICMP通常被认为是IP的一部分,但从体系上来说是它是位于IP之上的,因为ICMP的报文是承载在IP的分组里面的, 作为数据的一部分而呈现的。

因此对于网络层而言,区别数据究竟是否是ICMP报文的方式是通过, IP数据报的协议类型字段,一如区别 TCP与UDP一样。 当主机收到指明协议类型为ICMP的报文时, 会将数据分解出来给ICMP处理, 一如 分解出来 TCP 的数据部分 给TCP处理一样。

ICMP报文有一个类型字段 和 编码字段, 同时包含 引起该ICMP首次生成的IP数据报首部 以及前8字节, 以确定究竟是因为什么引起的。

ICMP数据类型

ICMP类型    编码    描述

0           0       显示回答(对ping的回答)
3           0       目的网络不可达
3           1       目的主机不可达
3           2       目的协议不可达
3           3       目的端口不可达
3           6       目的网络未知
3           7       目的主机未知
4           0       源抑制
8           0       回显请求
9           0       路由器通告
10          0       路由器发现
11          0       TTL过期
12          0       IP首部损坏

而ping 程序就是发送一个 8 类型 编码0的数据到目的主机, 目的主机返回 类型0 编码 0的数据做以响应。

而可以看路由跟踪的小功能也是借用了相关的东西来实现的, 在 windows是:

tracert ip/域名

//响应结果

C:\Users\admin>tracert www.baidu.com

通过最多 30 个跃点跟踪
到 www.a.shifen.com [183.232.231.172] 的路由:

1    10 ms     7 ms     8 ms  10.61.4.1
2     9 ms     5 ms    12 ms  10.61.0.1
3    15 ms    11 ms    18 ms  111.21.43.117
4     7 ms     8 ms     6 ms  120.192.202.253
5     7 ms     *        *     120.192.202.5
6    15 ms     9 ms     8 ms  221.183.47.149
7    35 ms    30 ms    30 ms  221.183.40.221
8     *        *        *     请求超时。
9    34 ms    34 ms    33 ms  120.241.49.206
10     *        *        *     请求超时。
11    40 ms    39 ms    34 ms  183.232.231.172

跟踪完成。

源主机会向目的主机发送一系列端口不可达的数据报, 而初始的TTL设为 1 2 3 4 ...

每当到达一台主机, 由于其TTL过期, 则会由相应的路由器向源主机发送 ICMP协议, 类型为11, 编码为0, 并会附带上自己的一部分信息。

而当到达真正的主机之后, 由于端口不可达, 则会响应类型, 编码均为3的ICMP报文, 此时, 停止发送数据报。

至于更多的版块, IPV6 等其他暂时就忽略跳过。

路由选择

虽然路由选择才是网络协议的难点所在,也是其最精彩的部分之一, 但在这里, 我只打算简要描述, 然后跳过。毕竟了解是关键的, 但是掌握路由算法对我而言,意义却并不是显得有那么重要。

但仍然有几点关键的地方需要做出一点了解, 在整个网络中的路由器茫茫多, 有这样几种选择可以完善, 定义 路由器转发表。

静态的方式: 通过管理员手动配置路由器转发表,依然可以完成相应的功能。

动态方式又有这样两种:

一是在路由器中保存有整个网络中每一个节点的相关信息, 以及从当前到对应节点的开销,通过算法为每一台路由器都计算出到每一个节点最优路线。

二是从当前路由节点出发,计算出到周围相关节点的最优路线, 并将自己的相关信息, 通知给其他相连节点。层层递进,每当有最优路线被更新时,就会向周围发送相关信息, 大家不断更新迭代,直到趋于稳定。

第二种描述比较抽象, 举例来说, 是这样的一个过程:

对于路由器A,知道自己可以到达路由器 A1 A2 A3这几个网络节点, 并且有相关开销, 就会有如下信息。

g(x, y) = n; 其中x,y各代表一个节点, 而n是从 x 到 y的开销。 需要注意的一点是 x -> y, y -> x两者之间并不等价。
有
g(A,A1) = 2; g(A, A2) = 3; g(A, A3) = 2;

对于节点A会将相关信息发送给相邻节点如 B, A1, A2, A3

假设B并不存在其他路径可以到 A1, A2, A3 则会更新自己的转发表为

g(B, A) = 1; g(B, A1) = 2 + 1; g(B, A2) = 3 + 1; g(B, A3) = 2 + 1;

再度将信息发送给相邻节点, 通过这种方式就能够不断更新完善, 假设将来在 B与A2之间建立了直连, 会更新信息为 g(B, A2) = 1;

当A收到对应信息时, 它会发现通过B到达A2会比当前路线更快, 则更新自己的 g(A, A2) = 2;

需要注意到这里的开销并不一定非得是指跳过, 经过多少个路由器, 可能网络拥塞, 链路速率等等都在考虑范围内。

在其中涉及到路由选择算法的坑, 暂时忽略不管。 但是有关于路由转发表所会必然带来的弊端就不得不提:

当规模逐渐增大, 无论通过哪种方式, 为数亿台路由器更新并维护转发表无疑是一件并不那么现实的事情。

由于全局采取了相同的算法, 局部地区想要自治处理,个性化处理,也就是一件比较难的事情, 比如对某一部分路径封锁,不允许从这里通过。 由于采取了全局方式, 并不支持自由配置。

解决这个问题的方式,是将路由器的架构加入层次化处理。

路由自治系统(Autonomous System AS)

将一批路由器组成一个集合, 叫做AS, 在内外可以采取不同的路由选择算法,在一个AS内部, 相互拥有彼此的信息, 可以实现转发表配置, 而在两个AS之间也需要进行相互的沟通。 所以在AS内就需要一台或几台路由器来做这个工作, 这些路由器就被称为网关路由器。

一个AS所在的范围就是一个子网的范围, 网络中的转发表也正是用 CIDR的方式配置的,也即:

A.B.C.D/n : xxx;

同样的, 跳过了AS内的 RIP, OSPF 以及路由器间的 BGP4 路由选择协议。

问题是,为什么需要在AS内与AS间采取两套不同的路由选择协议呢?

  • 策略 在AS之间策略问题起到了主导作用,一个给定的AS产生的流量不能穿过另一个AS是一件很重要的事情,而在AS内部, 是被统一管理的, 传输性能反倒是最大的关注点。

  • 在之前所提到的规模问题, 当规模太大时, 能够顺利切分, 并且依然运作良好。

  • 性能, AS间路由选择是面向策略的, 因此性能的关注度反倒是最低的。而这也是 AS内路由选择协议的优势所在。

广播路由选择

参考:【计算机网络】广播和多播

主机对信道传过来的帧做这样的处理:

  1. 首先,网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。另外,多数接口均被设为混杂模式,这种模式能接收每个帧的一个复制。

    目前,大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中以最高字节的最低位设置为1时表示该地址是一个多播地址,用十六进制表示为01:00:00:00:00:00(以太网广播地址 ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。

  2. 如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错误,网卡就丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须制定要用的协议(IP、ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组)。

  3. 设备驱动程序随后将该数据帧传送给下一层,比如,当帧类型指定为IP数据报时,就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤。如果正常,就将数据报传送给下一层(如TCP或UDP)。

  4. 每次UDP收到由IP传来的数据报,就根据目的端口号,还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个ICMP不可达报文(TCP根据它的端口号做相似的过滤).如果UDP数据报存在检验和错误,将被丢弃。

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用UDP广播报文应用作为例子。如果网内有50个主机,但仅仅有20个参与该应用,每次这20个主机中的一个发送UDP广播数据时,其余30个主机不得不处理这些广播数据报。一直到UDP层,收到的UDP广播数据报才会被丢弃。这30个主机丢弃UDP广播数据报是因为这些主机没有使用这个目的端口。

多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播,主机可加入一个或多个多播组。这样,网卡将获悉该主机属于哪个多播组,然后仅接收主机躲在多播组的多播帧。

广播和多播路由协议

广播类型

广播有四种类型:受限的广播,指向网络的广播,指向子网的广播,指向所有子网的广播。

  • 受限的广播

    受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在的网络的网络掩码,甚至连它的IP地址也不知道。

    在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据仅仅出现在本地网络中。这就是为什么称为受限的网络地址。这种广播类型接收对象为局域网中包括发送主机在内的所有主机

  • 指向网络的广播

    指向网络的广播地址是主机号全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。

    一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

  • 指向子网的广播

    指向子网的广播地址为主机号全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器接到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址。

  • 指向所有子网的广播

    指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1.例如,如果目的子网掩码为255.255.255.0.那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。

而在上面的介绍中有几个名字没有接触到,在这里补充下:

参考:IP地址、子网掩码、网络号、主机号、网络地址、主机地址

简单来说, 我们已经知道了子网掩码是如何根据子网的 前缀生成的, 而这个所谓前缀, 术语上来说就被称作是网络号, 也即 111.111.111.0/24 中的前24位为1后8位为0的二进制数。

当然网络号也可以由 IP地址和子网掩码做与运算生成, 毕竟子网掩码最初的目的也正是这样。

当两个网络具有相同的网络号就被称为 在同一个子网中。 而在32位地址中, 前8位相同叫做A类网, 前十六位相同就叫B类网, 前24位相同被称作C类网。

而主机地址就是 111.111.111.0/24 的后八位可变地址。 那么广播地址呢?

就是将网络地址中的主机地址 均置为1, 即可。

这样就能够多广播类型有个较为清晰的了解了。

广播路由协议

我们已经决定要发广播了, 该怎么发送呢?

最简单的方式就是N次单播, 就是将源数据复制n份, 向N个地址发送, 当然, 问题很明显,同一份数据要在同一个节点经过许多次, 导致了不必要的开销。

当然, 我们有一种更优的处理策略, 则是在每个路由节点对数据进行复制, 而后发送出去。但N次单播的前提条件是, 我们将每次发送都视作一次单播, 需要知道源IP及每次单播的目的IP,但是这些信息又怎样存储呢?需要相关的协议进行配置,这使得我们的协议变得更复杂。

另外就是 在路由选择协议中,单播路由的链路状态也正是由广播所发送的, 因此采取这种N次单播的方式可行性并不高。

  • 无控制洪泛

    这种方式是需要每个节点向其周围节点发送信息副本, 这样网络中的所有主机都能够收到消息。但是带来的缺点是, 如果在网络拓扑中存在环路, 则会使得数据无休止的发送下去。 同时一个节点至少会收到N次数据,N等于与其直接相连的节点数。

  • 受控洪泛

    有几种方式, 一是序号控制洪泛,对发出的每一个副本都留存有其序号,当收到消息时,与当前收到转发的序号列表进行比对, 已发送则丢弃即可。

    第二种方式叫反向路径转发

    思路相当简单, 当一个节点收到数据时, 仅当发送数据的源节点 在 从当前节点到源节点的最短单播路径上时,才进行发送。 而在收到分组之后, 会向所有附近节点 除了 发送节点给他的那个节点 发送数据。这么读起来可能比较拗口 难以理解。 举例说明:

    数据由A节点发送出来,发往B节点, C节点, 此时A节点在 B节点到A节点的最短单播路径内, 因此B接收来自A节点的数据, 同时会向C发送数据, 当C收到来自B的数据, 因为数据源为A, C发现它自己到A的最短单播路径并不需要经过B, 因此拒绝接收来自B的数据。

    其他节点也是同理, 而如何知道最短单播路径呢? 就是在之前提到过的

    在节点 A2 -> A1 -> A 在A的转发表中有, 到达A2的最短单播路径 所需要经过的下一个节点是 A1 而不需要关心更多。

    第三种方式为生成树方式:

    上述两种方式依然有不可避免的问题, 就是依然需要重复发送数据, 当数据到达之后,再由接收节点进行判断是否留存, 转发。 但依然避免不了需要解析到IP首部, 接收数据的问题。

    在发送之前子网中的所有节点都已经根据算法计算出来了需要在当前生成树内, 自己的下一个子节点是谁, 生成树的特点是到达每个点都是连同的, 且不包含环, 这样就可以使得数据不会被无效发送。

多播

而多播有所不同, 它带来的问题会更多, 但也有这样几个优势, 我们不难发现有这样两个问题,存在于广播中, 一是所有的子节点都会无条件的收到相应的消息, 当广播通讯持续多久,就要被这样一直骚扰下去。 另一点是 广播都局限在一个子网内部发送, 当然, 广播必然不能够无限制的发送, 否则在整个互联网世界都会收到对应的广播消息, 是一件多可怕的事情。 但是对于同时需要多个接收点, 流行于今天的直播, 视频会议, 等等其他,需要被多人共享的功能 又该怎样实现呢?

但是广播中我们并不需要存储目的地址, 而在多播中, 就需要存储这部分数据了。在因特网体系中,多播数据地址用间接地址来编址。 也就是用一个标识符来标识一组接收方,且该组使用这个单一标识符。

而与多播相关的地址为 D类地址, D类地址比较特别, 第一个字节以“1110”开始, 它的范围从224.0.0.0到239.255.255.255,或,等同的,在224.0.0.0/4。在IPv6,多播地址都有前缀ff00::/8。但是注意,224.0.0.0被保留,不能赋给任何多播组。 与多播相关的协议是IGMP。

多播是第一个字节的最低位为1的所有地址,例如01-12-0f-00-00-02。广播地址是全1的32位地址,也属于多播地址。但是广播又是多播中的特例。

posted @ 2019-03-22 18:05  千江月09  阅读(805)  评论(0编辑  收藏  举报