本文主要内容来自 SpriCoder的博客,更换了更清晰的图片并对原文的疏漏做了补充和修正。
为什么我们不用硬件地址进行通信?
- (设备数量问题)因为设备比较多,供应商也比较多
- (规格问题)不同供应商的解决方案不同,所以使用硬件地址进行通信的通用性比较低。
- (寻址问题)全球设备太多,如果使用硬件设备,那么进行定位比较复杂
因为如上情况我们选择使用 IP 地址(逻辑地址)。
MAC 地址不能跨网段,IP 地址可以跨网段,MAC table 只能覆盖一个链路。路由表一般是跨网段,但是不跨 autonomous system。
网络层概述
- 对于不同帧使用同一的方案进行处理
- 第三层希望通过路由选择算法进行路径的选择和转发,对第二层是透明的。(即第二层的具体实现不影响第三层)
- 第三层只能避免拥塞,但是要到第四层(运输层)才能完成流量控制(第三层不能完成流量控制) Q:到底能不能浏览控制
第三层职责
- 通过网络移动数据:不同网段之间的通信,不同的广播域,两个广播域之间的进行了划分,互不干扰,不是广播的通信以及对另一个网段的广播需要能传达给对方。
- 使用分层寻址方案(与 MAC 寻址相反,后者平坦,逻辑过于简单,不能定位全球所有设备)。方便逐步细化目的地地址
- 细分网络并控制流量(flow):一步步进行细化,越近了解的越多:IP 地址是一致的,也就是可以忽略物理层的不同。(具体原因在开头已经分析过了)
- 减少交通拥堵,基于 IP 做分段和传达,用来减少拥塞
- 与其他网络交谈
- 在上面我们可以发现,对于不同数据链路层的帧,第三层基于 IP 地址,来实现跨介质的逻辑理解和连通。
- 第三层负责进行连通和传达,数据可靠性由终端设备(第四层及以上)来进行保证(不然会带来比较大的计算量)。安全性和
第三层设备
- 路由器
- 互连网段或网络(不同网段的分割)
- 根据 IP 地址做出合理的决定
- 确定最佳路径,根据路由表。
- 将数据包从入站端口切换到出站端口
- 如果 A 网段的设备向路由器发送了一个 B 网段的广播地址,那么路由器会进行转发,然而如果 A 网段设备发送的是本网段的广播地址,路由器则不会进行转发。(广播域划分)
IP 地址和子网划分
第三层数据报格式
IP 地址在报文中占据一部分(32bit 一个 IP 地址)
IPv4 报文主要结构
首部部分
上面蓝框部分的整体是首部部分
版本号
占 4 bit,指 IP 协议的版本。目前的 IP 协议版本号为 4(即 IPv4)(6 也就对应 IPv6)
首部长度
占 4 bit,可表示的最大数值是 15 个单位(一个单位为 4 字节) 因此 IP 的首部长度的最大值是 60 字节。
- 因为首部长度是不确定的,所以我们需要进行标识。(用来方便读取)
- 首部长度的 32bit 为一行,也就是 4 个字节为一个单位
- 所以 IP 报文首部字段长度最大为 15 行
服务类型
占 8 bit,用来获得更好的服务,这个字段以前一直没有被人们使用
- 比较早:延时、可靠性、代价等标志位
- 现在用来区分服务:前 6 个 bit 表示区分服务码,后 2 个 bit 作为保留(这 1 个字节也就不怎么使用了)
总长度
占 16 bit,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节(由于放到帧里面,所以大多数不比 1500 字节长)。总长度必须不超过最大传送单元 MTU。
标识
标识(identification):占 16 bit,它是一个计数器,用来产生数据报的标识。
- 他只是为了做报文分片的问题,因为路由器可能连接的是不同网络,比如有线帧和无线帧。而不是为了标识是否传输成功,即是否做到了可靠传输
- 接收方依据标识号进行合并(相同标识号的报文是一个大报文,可以合并的)
标志
标志占 3 bit,最高位为 0。
- 让发送方对报文进行控制,让中间路由器对其进行控制
- DF(Don't fragement):是否允许做分片,0 允许做分片,1 不允许做分片
- MF(More fragement):MF 为 0 表示最后一个分片 1 是指后面还有分片
片偏移
片偏移(13 bit)指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
- 相同标识号,然后根据片偏移进行重排(先发未必先到),偏移比较小的更靠前
- 因为 16-3 = 13,2^3 = 8(因为单位是字节,所以用 13 位就可以补齐)
- 例子(计算偏移量):偏移是字节为单位
- 分片的原因:报文太大了,帧装不下,所以需要先分片之后再进行传输
报文分片举例:
子报文的首部和原报文的首部大致相同,只不过 MF,DF,片偏移有不同。
生存时间
生存时间(8 bit)记为 TTL(Time To Live) 数据报在网络中可通过的路由器数的最大值。
- 是通过计数的方式来进行统计
- 最大值是 255(最多经过 255 个路由器)
- 路由器每转发一次,就会对生存时间 -1
- 减小为 0 后,就会丢弃掉,并且通知给发送方我已经丢弃掉这个报文
- 防止在环上进行传输,避免由于回路问题,造成过大的网络资源浪费
协议
协议(8 bit)字段指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程
- 有的协议是上层的
- 有的协议是第三层协议
- 具体协议的情况如下
首部检验和
首部检验和(16 bit)字段:只检验数据报的首部,不包括数据部分。这里不采用 CRC 检验码而采用简单的计算方法。算法过程如下(比较形式化的问题,并不能解决数据报错误的形式)
- 源地址和目的地址都各占 4 字节
- 15 * 4:15 行,每行 4 字节
- 这里对数据报中的所有字都进行反码算术求和
网络层地址
IPv4 地址为 32 位长,它们以点分十进制格式表示为四个八位字节:133.14.17.0
IP 地址包含两个组成部分:
- 网络 ID
- 主机 ID
网络地址:用来标识网段
- 原来由 ARIN(美国互联网号码注册机构,www.arin.net)分配,现在已经换了
- 标识设备所连接(attached)的网络(网段)
- 可以由前三个八位位组(octets)中的一个,两个或三个来标识
主机 ID:IP 地址后面占据 1-3 个字节
- 由网络管理员分配
- 识别该网络(网段)上的特定设备
- 可以由最后三个八位位组中的一个,两个或三个来标识
IP 地址
- 不同的类地址为地址的网络部分和主机部分保留不同数量的位
- N 是 Net ID,H 是 Host ID
分类
IP 地址主要通过第一个字节进行划分
- 0-127(0xxxxxxx)A 类地址
- 128-191(10xxxxxx)B 类地址
- 192-223(110xxxxx)C 类地址
- 224-239(1110xxxx)D 类地址:多播(multicast):视频点播的原理也是组播(多播)
- 240-255(1111xxxx)E 类地址:研究(Research)
- host 不能全取 0,也不能全取 1。全取 0 时用来标识网段地址;全取 1 时用来标识网段的广播地址
主机的数量
每个类别的最大主机数量各不相同。(不包含网络号)
- A 类拥有 16,777,214 个可用主机(224 - 2)
- B 类具有 65,534 个可用主机(216 - 2)
- C 类具有 254 个可用主机(28 -2)
为什么每一类地址中都要减去 2?
- 每个网络中的第一个地址都保留用于该网络地址
- 最后一个地址是为广播地址保留的。
保留(Reserved)地址
- 网络地址:在地址的主机部分中以二进制 0 结尾的 IP 地址
- A 类网络地址示例:113.0.0.0
- 网络上的主机只有具有相同网络 ID 的其他主机才能直接通信。(用来确定是不是在一个网段里面)
- 广播地址:用于将数据发送到网络上的所有设备。(一般是一个网段之间的)
- 广播 IP 地址在地址的主机部分中以二进制 1 结尾。
- B 类地址的广播地址的示例:176.10.255.255(decimal 255 = binary 11111111)
- Class A
- 99.0.0.0: a reserved network number
- 99.255.255.255: a broadcast number
- Class B
- 156.1.0.0: a reserved network number
- 156.1.255.255: a broadcast number
- Class C
- 203.1.17.0: a reserved network number
- 203.1.17.255:a broadcast number
- 255.255.255.255 不能跨路由器转发,但是能在发生的网段中进行广播传递
专用地址空间
私有地址空间/专用地址空间(private address space):有某些 IP 地址范围保留用于专用 IP 寻址方案(Schemas)。上述地址都是用作局域网的内部网段。 比如:不同公司可以用 10 网段,不同宿舍的 AP 是 192.168.0 网段。 由此可以解决 IP 地址耗尽的问题。
- 10.0.0.0 - 10.255.255.255(00001010.xxxxxxxx.xxxxxxxx.xxxxxxxx)
- 172.16.0.0 - 172.31.255.255(10101100.0001xxxx.xxxxxxxx.xxxxxxxx)
- 192.168.0.0 - 192.168.255.255(11000000.10101000.xxxxxxxx.xxxxxxxx)
IP 地址耗尽及其解决方案:
- NAT
- CIDR
- IPv6(最终解决方案)
发展过程:网络位数小于 24,使得其可以组成超网。
子网划分
- 网络管理员有时需要将网络划分为较小的网络,称为子网,以提供额外的灵活性
- 从主机字段借来的位被指定为子网字段(Subnet Fields)
- ABC 类网的主机数量比较大,会造成浪费,因为 avalible 的很多,很少能够用满。
- 从 Host 中借位进行子网划分
- 子网掩码:是由发送方提供。
- 大的子网划分为小的子网来提高灵活性和利用率。是由本地的管理员来决定的,并不需要再向某组织申请
子网划分的基本概念
- 子网是网络的较小部分
- 提供寻址灵活性。(小的局域网可以完成隔离)
- 子网划分只需要本网段网络管理员进行处理即可,每一个子网也是一个网络(子网只是一个逻辑形式)
- 子网地址通常由网络管理员在本地分配:每一个子网也是一个 Net,实际上是和 Net 是一个标准的
- 子网减少了广播域:使得广播域变小,提高网络利用率,避免接受到大量的无用的广播,广播只能在对应子网中进行广播。
我们可以借多少位?
- 可以借用的最小位数是 2
- 借用的最小位数是 2,为什么?
- I 如果只借用 1 位以创建一个子网,那么您将只有一个网络号-.0 网络-和广播号-.1 网络,没有可以使用的专用网络。
- 两位的时候,01 和 10 给 Host,00 给网络 ID,11 位广播地址
- 全 0 可能导致误判
- 可以借用的最大位数可以是保留至少 2 位主机号的任何数字(给 Host 至少保留 2 位,因为 1 位的话,要么一个是 NET 无法使用,要么一个是广播地址)
- A 类网络 20 位
- B 类网络 14 位
- C 类网络 6 位
- 互联网早期时,计算机比较少,没有划分子网。
子网划分的副产品:地址浪费
我们必须在所需的子网数,每个子网可接受的主机以及地址的浪费之间取得平衡(strike a balance)。
- hostID 里面的全 0 和全 1 不能使用
- subnet 不可以使用全 0 和全 1
- 借用 4 位是最高效率的,提升了划分灵活性,影响了效率
Number of Bits Borrowed | Number of Subnets Created | Number of Hosts Per Subnet | Tota Number of Hosts | Percent Used |
---|---|---|---|---|
2 | 2 | 62 | 124 | 49% |
3 | 6 | 30 | 180 | 71% |
4 | 14 | 14 | 196 | 77% |
5 | 30 | 6 | 180 | 71% |
6 | 62 | 2 | 124 | 49% |
使用率: Total Number of Hosts/(256-2)
子网掩码
把网络位全赋值为 1,host 位全部赋值为 0,这样我们就明白哪些位上面是 net,哪些位上面是 host
- 别名:扩展网络前缀
- 定义我们用来构建网络的位数,以及描述主机地址的位数
- Class A 255.0.0.0
- Class B 255.255.0.0
- Class C 255.255.255.0
计算子网
- 我们有一个 C 类网络:223.14.17.0
- 我们需要完成如下划分
- 划分成 13 个子网
- 每个子网有 10 个主机
第一步
- 确定默认的子网掩码
- C 类网络的默认子网掩码是:255.255.255.0
第二步
- 通过从主机 ID 借用位来计算子网和主机的实际数量
- 我们对每一个子网需要借用 4 位来满足一个子网有 10 台可用的主机。
第三步
- 我们为每个子网获得 16 个可能的子网和 16 个可能的主机,因为:
- 对于借用的 4 位,每个位可以是 1 或 0,从而有 16 种可能的组合。
- 4 个剩余主机位也是如此。
- 重要:每个子网上只有 14 个可用子网和主机。(一般情况下,而可用的是 15 个可用子网,因为 0 号子网可用)
- 因为您不能使用第一个和最后一个子网。(即全 0 和全 1)
- 因为您不能使用每个子网中的第一个和最后一个地址。
- 对于每个,一个是广播地址,一个是网络地址。
第四步
- 确定子网掩码。
- 其中 X 表示用于子网划分的借用位。
- 将 X 的位值相加,得到子网掩码的最后一个八位位组十进制值:128 + 64 + 32 + 16 = 240
- 子网掩码是:255.255.255.240
- 子网掩码用于显示 IP 地址中的子网和主机地址字段
第五步
- 确定主机地址的范围
Subnet # | Subnet Bits | Host Bits | In Decimal |
---|---|---|---|
1 | 0000 | 0000-1111 | .0 -.15 |
2 | 0001 | 0000-1111 | .16 - .31 |
3 | 0010 | 0000-1111 | .32 - .47 |
4 | 0011 | 0000-1111 | .48 - .63 |
5 | 0100 | 0000-1111 | .64 - .79 |
6 | 0101 | 0000-1111 | .80 - .95 |
7 | 0110 | 0000-1111 | .96 - .111 |
8 | 0111 | 0000-1111 | .112 - .127 |
9 | 1000 | 0000-1111 | .128 -.143 |
10 | 1001 | 0000-1111 | .144 - .159 |
11 | 1010 | 0000-1111 | .160 - .175 |
12 | 1011 | 0000-1111 | .176 - .191 |
13 | 1100 | 0000-1111 | .192 - .207 |
14 | 1101 | 0000-1111 | .208 - .223 |
15 | 1110 | 0000-1111 | .224 - .239 |
16 | 1111 | 0000-1111 | .240 - .255 |
- 16 个子网,14 个可用子网
- 每个子网 16 个主机,14 个可用主机
计算子网网络地址
- 第一步:将 IP 主机地址转换为二进制。
- 第二步:将子网掩码转换为二进制。
- 第三步:使用布尔运算符 AND 将两者进行运算。
- 第四步:将网络二进制地址转换为点分十进制。
- 这是子网的网络地址
- 它可以帮助确定路径(即发送到哪一个具体的子网(网段)):用来确定是否是一个网段,是否可以通过网关进行转发
路由器与 IP 地址
- 为了找到子网的网络 ID,路由器必须采用 IP 地址和子网掩码,并且在逻辑上将它们取和
- 路由器根据运算的结果进行计算
- 上图中的子网掩码 255.255.255.0 是 255.255.0.0 借用了 8 位产生的(而不要理解成为 C 类地址的子网掩码)
- 如果网段地址不同的话,会需要借用网关来实现转发,借助 mac 地址
实践:IP 寻址问题
- Given 195.137.92.0 and needing 8 usable subnets, find the subnetwork numbers, the ranges of host numbers, and subnetwork broadcast numbers. 给定 195.137.92.0 并且需要 8 个可用子网,请找到子网号,主机号范围和子网广播号。
- IP Address is a class C. Default subnet mask is 255.255.255.0. We need to extend the network number by enough bits to give 8 usable subnets. IP 地址是 C 类。默认子网掩码是 255.255.255.0。 我们需要将网络号扩展足够的位数以提供 8 个可用子网。
- Stealing 2 bits yields 2 usable subnets, stealing 3 bits yields 6 usable subnets, so we must steal 4 bits to get 14 usable subnets, of which we needed 8. 借用 2 位会产生 2 个可用子网,借用 3 位会产生 6 个可用子网,因此我们借用 4 位才能获得 14 个可用子网,其中我们需要 8 个可用地址。
- This makes the subnet mask 255.255.255.240. So the Network number is 195.137.92.NNNN HHHH where Ns stand for network extension bits(subnets) and Hs stand for host numbers. 这将使子网掩码为 255.255.255.240。 因此,网络号为 195.137.92.NNNN HHHH,其中 Ns 代表网络扩展位(子网),Hs 代表主机号。
- Next we must number the subnets; there are 16 combinations of 4 bit binary numbers but they retain their place value within the last octet. 接下来,我们必须为子网编号。 4 位二进制数有 16 种组合,但它们在最后一个八位位组中保留其位置值。
- 借用 4-6 位都可以,因为并没有规定子网中主机数量,而为什么是 6 位是因为一个子网中最少用 2 位给主机。
第三层设备
- 第三层的路由器
- 路由器的两个功能:
- 路径选择
- 路由转发:将报文转发取出
路由转发分组的算法
在 cidr 协议中,子网号全 0 或者全 1 都是可以的,但是其主机号全 0 或者全 1 都不可以!
但是在分类子网划分时,全 0 代表本网络,全 1 代表广播地址
路径选择
- 路由器用于根据链路带宽,跳数,延迟 …
- 选择数据包到达目的地的路径中的下一跳。
- Internet 核心层的冗余链路是很必要的(相对于路径选项消耗,其可靠性和稳定性更加重要)
- 路由器根据路由规范,选择他当时认为最为合适的路径
IP 地址
- IP 地址是用软件实现的,是指设备所在的网络。
- 路由器连接网络,每个网络必须具有唯一的网络号才能成功进行寻找路径。
- 唯一的网络号包含在分配(incorporated)给该网络上每个设备的 IP 地址中
- IP 地址是逻辑的,是我们配置的。(不同于 MAC 地址)
- IP 地址是有层次,做转发的依据是网段而不是具体的 IP,同一网段设备都有相同的 IP 地址,也就是我们只要到达网段即可
路由器端口
- 路由器端口记录了网段的 IP 地址(和连接的地方是相同的)
- 在计算需要分配的端口总数时,注意路由器端口也需要被计算上
路由器发送的过程
- A5 主机发送报文给 B5 主机,这个报文的 IP 地址是 B5 所在的 IP 地址,形成帧,然后放上总线。
- 路由器收到帧,然后进行理解,看到报文,知道目的地是 B5(解封装)
- 检查自己的路由表,找到目的地对应的端口
- 在 B1 端口进行转发,形成新的帧,其 mac 地址变成了 B5 的 mac 地址
- 形成一个全新的帧,这个帧的 MAC 地址是 B1 的 MAC 的地址。
路由器端口示例
- 接口是路由器连接到网络的附件,在 IP 路由中也可以称为端口。
- 这个 IP 地址往往被作为这个网络的网关
- 每个接口必须具有一个单独的唯一网络地址。
- 比如上图中 S1 和 S2 不能是相同的 IP 地址
- 路由器的连接的网段一定要是不同的
IP 地址分配
静态地址分配(Static addressing)
- 为每个单独的设备配置一个 IP 地址
- 您应该保留非常细致的记录,因为如果使用重复的 IP 地址,可能会出现问题。
- 需要知道规范,然后根据上下文,通过命令行进行分配地址
动态地址分配(Dynamic addressing)
- 有几种不同的方法可用于动态分配 IP 地址:
- RARP: Reverse Address Resolution Protocol. RARP:反向地址解析协议。发起请求根据 Ip 地址信息来
- BOOTP: BOOTstrap Protocol. BOOTP:BOOTstrap 协议。用于工作栈
- DHCP: Dynamic Host Configuration Protocol.(比较多用) DHCP:动态主机配置协议
IP 地址和掩码处理后得到网络地址,保证每个网段中的主机的网段地址应该是一致的,不然会出现错误的。
ARP 协议
同一局域网的 ARP
从应用层到传输层报文就会被划分成报文段了。从网络层到数据链路层有可能会需要分组
不同局域网的 ARP
ARP 高速缓存只会存本网段中的 mac 地址
通过 IP5 与子网掩码相与,知道 IP5 不在本网段
如果需要发送的 mac 地址不在本网段,那么先跳到默认网关的 mac 地址
ARP 是自动进行的
Address Resolution Protocol 地址解析协议
- 为了使设备进行通信,发送设备需要目标设备的IP 地址和 MAC 地址。
- ARP 使计算机能够查找与 IP 地址关联的计算机的 MAC 地址。
- 目的方 IP 地址 -> 目的方 MAC 地址
- 需要知道对方的 MAC 地址,来形成数据地址。
ARP 示例
- source 主机访问 destination
- 不知道目的主机在哪里
ARP 表的缓存
- 可以通过 lookup 命令进行。
- 在 RAM 里面,如果 ARP 没有本条目的对应 MAC 地址。
- MAC 地址在 ARP 中是有时效性的。到时间不更新不激活就会删除
ARP 的操作
- 使用 ARP 机制
- 上图中是一个示意图
- 此时 ARP table 中没有缓存
- 图问题:目的 MAC 应该在原 MAC 之前,而这里的帧反过来了
ARP request
- 向目的方请求 MAC 地址,即 ARP 请求
- 命令如图:就是找谁是这个主机,你的 MAC 地址是啥
- 将 MAC 地址设置为全 1,作为广播发送
ARP Checking
- 10.0.2.5 发现不是自己的主机,那么解析到这里丢掉就行,同样会记录下来对应的发送方的 MAC 地址。(攻击原理)
- 10.0.2.9 发现自己的 MAC 地址,然后形成 ARP 应答
- 同时 10.0.2.9 会同时记录下 A 主机的 MAC 地址,更新到自己 ARP 地址中去(会记录对方的)
ARP reply
- 向 A 主机进行 MAC 地址应答
ARP Caching
- A 的主机就会把对应的条目写到 ARP Table 中
- 然后再次形成一个数据帧发送出去即可。
ARP 目的地址为本地
- ARP 请求是本网段形成的,是一个广播就可以。
- 如果目的主机不在本网段中,那么不能跨网段进行广播
网络交流
- 如何与不在同一物理网段上的设备通信?如下是两种解决方案。
- Default gateway 默认网关
- Proxy ARP 代理 ARP
默认网关
- 为了使设备与另一网络上的另一设备通信,您必须为其提供默认网关。
- 默认网关是路由器上连接到源主机所在网段的接口的 IP 地址。
- 为了使设备将数据发送到另一个网段上的设备的地址,源设备将数据发送到默认网关。
- 192.168.0.0 和 192.168.0.1 接入到路由器,如果网关错误是无法进行转发的。自己搭建拓扑需要手动配置。而 THPCP Server 可以进行动态生成
- 由网关对对应报文进行转发,默认网关就是
- THPCP Server 进行动态生成
- 帧被发送到另一个不通过网段的链路无意义
- 发送报文到另一个网段,需要路由器把对应端口的网关的 MAC 告诉你,然后通过网关进行转发。
Proxy ARP 代理 ARP
- 代理 ARP 是 ARP 的一种变体(variation)。(早期有些设备不支持配置网关)
- 如果源主机未配置默认网关。
- 发送 ARP 请求,然后路由器给你一个 ARP 的 reply,告诉你 MAC 地址(一般为路由器端口本网段的 IP 地址)
Destination not local ARP 对应目的方不是本地
- 路由器会把 Router MAC 的地址给你(连接本网段的 MAC 地址)
- 从 RouterA 到 Host 里面会生成新的帧
ARP Flowchart ARP 流程图
- ARP 攻击:有一个机器恶意发送无用帧,然后会将 cache 写满(解决就是一段时间不处理,然后等待 ARP 记录中的记录失效)
- ARP 学习是收到不同的帧,对帧进行保存
- 每一个 ARP 是有声明期的
网络层设备
面向连接的网络服务
- 面向连接的网络服务
- 就是任何发送数据的行为之前,先要建立好连接,协商好参数才会开始传输,所有数据进行有序传输
- 网络情况导致数据出现问题,需要接受方进行一定处理来保证数据正确
- 传输过程中要保持连接距离,只有完成传输后才能断开连接。
- 传输比较可靠,代价高。
无连接的网络服务
- 他们分别对待每个数据包。
- IP 是无连接系统。 IP 就是提供无连接的网络服务
- 不要求发送方和接收方在发送前先建立一个连接(不打招呼)。
- 系统不需要进行大量的数据保留,不需要很多的缓存
- 局域网使用的比较多,可靠性比较低,不处理报文丢失
- 可靠网中,少量报文使用无连接是可以提高效率的(常用于比较小型的,并且可靠性相对比较高的网络)
电路交换(Circuit switched)
- 面向连接与电路交换。
- 但是,这两个词并不相同
- 要先建立一个虚电路关系,之后报文走对应的虚电路。
- 面向连接:首先与接收者建立连接,然后开始数据传输。
- 所有数据包依次在同一通道上传播,或更常见的是在同一虚拟电路上传播。
- 问题:电路的利用效率低,一个人用了别人就不能用了(虚电路可能是分段建立,可能局部可以复用,但是整体不可以复用)。
- 虚电路要强于面向连接的,传输更加可靠,保证传输先后关系。
报文交换(Packet Switched)
- 无连接网络与数据包交换:这两个词都不一样
- 当数据包从源传递到目标时,它们可以:
- 切换到其他路径。(每一报文有各自的发送方和接收方,可以根据当前的网络情况,进行路由选择)
- 乱序到达。
- 设备根据各种标准为每个数据包确定路径。某些标准可能因分组而异。
- 将原始数据分为很多的子报文(单位),每个子报文(单位)自己选择路径进行发送。
- 大部分的 Connetionless network 都是基于 packet switched 进行实现,控制网络拥塞。
- 出现问题时候,我们只需要重传对应部分的报文就可以(不用重传全部数据)
网络协议操作
- 存在冗余,A 转发给 B 是由当前网络状态处理。
- ABC 之间都是通过帧进行计算的。
本章关注 ABCDE 如何进行帧的封装与转发的
routed protocol 是用来使用路由表的,routing protocol 是用来生成路由表的
Routed protocol 被动可路由协议
- 为网络层提供支持的协议称为路由协议或可路由协议。
- IP 是网络层协议,因此,它可以通过互联网进行路由。
Non-routable protocol 不可路由协议
- 不可路由协议是不支持第 3 层的协议。
- routing protocol 是主动可路由协议也就是 Dynamic routes
- 这些不可路由协议中最常见的是 NetBEUI。
- 直接根据目的方的地址在局域网中进行生成定位
- 这个协议不支持第三层,也就是跨局域网是不可以的。
- NetBEUI 是一种小型,快速且高效的协议,仅限于在一个网段上运行。
被动可路由协议的寻址
- 路由器连接三个网段(列出来的是网络号)
- 将目的主机和掩码进行逻辑 AND 操作,得到对应的网段
- 然后请求路由表可以发现 E2 端口为目的网段
- 再次将报文封装转发给对应的主机
- 路由表是存储在内存中的
路由协议的分类:静态、动态
- 静态路由:网络管理员在路由器中手动输入路由信息。
- 动态路由
- 路由器可以在运行过程中互相学习信息。
- 使用路由协议更新路由信息。
- RIP, IGRP, EIGRP, OSPF …
- 人工维护的代价比较大
静态路由和动态路由的区别
- 静态路由
- 用于隐藏部分网络。安全(不必进行路由表的交换)
- 测试网络中的特定链接。
- 用于仅在到达目标网络的路径时维护路由表。
- 动态路由
- 维护路由表。
- 以路由更新的形式及时分发信息。
- 依靠路由协议共享知识。
- 路由器可以调整以适应不断变化的网络状况。
- 打开后会启动进程,按照不同的协议,和网上的不同设备学习信息,然后根据算法生成路由表
Routing protocol 主动路由协议(Routing)
- 路由协议确定路由协议遵循的到达目的地的路径。
- 是用来构建路由表的,所以叫做 routing
- 公平、简单、适应变化等特点
被动路由协议和主动路由协议
- Routed Portocol 用于路由器之间,用来保证路由器之间连通(完成转发),保证路由器有效连通。
- Routing Protocol 用于做各自的路由表的生成:路由器彼此交换信息。
- Routing Protocol 决定 Routed Protocals
动态路由协议的分类:内部网关协议和外部网关协议(动态路由协议很重要)
- 内部网关协议(Interior Gateway Protocols,RIP,IGRP,EIGRP,OSPF):可在自治系统(autonomous system,大的单位或者管理方)中使用,该系统是一个主管部门下的路由器网络,例如公司(corporate)网络,学区的网络或政府机构的网络。
- 外部网关协议(Exterior Gateway Protocols,EGP,BGP):用于在自治系统之间路由数据包。
- 自治系统是逻辑的划分,而未必是物理层次的划分。
- 通过 BGP,让其他自治系统了解自己的自治系统中的网段。
- 内部网关协议和外部网关协议的区别:
- 一个单位对自己内部的网络管理负责,用一些协议。
- IGP 是内部确定的管理规则,BGP(EGP)标准来沟通不同自己系统。
内部网关协议的分类:DVP and LSP(理解差异)
- 距离矢量协议(Distance-Vector Protocols,RIP, IGRP):
- 从邻居的角度查看网络拓扑。(注意不基于全局)
- 在路由器之间添加距离向量。(根据跳数来决定,经过一个路由器+1 一次)
- 经常定期(periodic)更新。
- 将路由表的副本传递到邻居路由器。
- 链路状态协议(Link State Protocols, OSPF):
- 获取整个网络拓扑的通用视图。(全局的视角,会有代价)
- 计算到其他路由器的最短路径。(基于带宽计算出来的 cost,形成 cost 拓扑图,然后计算出对应的路径代价作为评判依据)
- 事件触发的更新。如果没有事件发生那么就不会更新
- 将链接状态路由更新传递给其他路由器。
距离矢量协议(DVP)的示例
- 初始的时候,各自持有的是黑色的部分(直连的线路)
- 定时路由表会相互交换给邻居,下一时刻 C 学习到 B,B 学习到 AC,A 学习到 B,在下一刻进行再次的转发。
- DVP 只知道到达一个网段的最少跳数(但是不知道最佳路径)。
- 会生成路由回路
RIP(Routing Information Protocol) DVP 的代表
- 最受欢迎。(实现算法简单,更加靠谱)
- 基于距离矢量的内部网关协议。
- 唯一的指标是跳数。
- 最大跳数为 15。(评判依据简单,是一个短板)
- 每 30 秒更新一次(广播),可以修改。
- 并非总是选择最快的路径(而是走跳数最短的路径)。
- 产生大量的网络流量。
- RIP v2 是 RIP v1 的改进版本
- RIP v1 用地址广播
- RIP v2 用主播地址广播,支持身份认证、路由等,比较安全,常用
链路状态协议(LSP)
上图中的 Routing table 应该叫做初始时刻的 Routing Table(本图的问题)
- 彼此交换连接情况,交换的是Link state而不是路由表,包含 link 的信息,以 NetID 作为主键(无相同网段),包含的是 link 上的路由器邻接关系、链路类型(4 种)、链路带宽,会指定谁连接了谁,这个条目就被称为 Database(表)。这样子就不仅仅知道链路,还知道更多的全局信息。
- LSP 操作过程:
- 相互交换彼此学到对应的 Tpological Database(是全局的信息)
- 之后使用 SPF 算法,以自己为根,通过最短路径优先算法,生成以自己为根的树
- 根据这一个树再生成路由表(了解全局的信息),逻辑是树的逻辑。
- LSP 不是进行定时进行交换的,而是初始的时候进行交换,稳定之后,根据事件触发的时候才会更新数据。
- 更新后发送给所有的路由器,需要将 Database 发送给所有的路由器
- 收到的路由器的,根据 database 更新自己的树,然后再次生成路由表。
- LSP 是指从所有可达的道路上找到代价最小的路径。
- 全局可能会比较大,考虑负载进行处理
- 但是没有路由回路,单域内一般不超过 20 个路由器
- 路由表一般只保存一个最优的转发点的(负载均衡)
OSPF(Open Shortest Path First) 典型的 LSP
- 最短路径优先协议,是基于链路状态的内部网关协议,消耗 CPU 和内存。
- 指标由带宽,速度,流量,可靠性和安全性组成,本科阶段只考虑带宽的。
- 事件触发的更新。
- 在 LSP 中用的比较多。它节约了带宽资源,需要 host 的 CPU 资源来执行算法。将最小生成树转化成路由表
- 最快和什么有关?(最快指的是带宽)
- 和实时各条链路上的通信冗余有关,也和管理方案有关,简单来说是和带宽有关
- 带宽表示为代价,带宽和代价成反比。
IGRP(Interior Gateway Routing Protocol) and EIGRP(Enhanced IGRP)
- 思科知识产权的。
- 基于距离矢量的内部网关协议。
- IGRP 最大跳数为 255。
- EIGRP 指标由带宽(bandwidth),负载(load),延迟(delay)和可靠性(reliability)组成。加权进行运算
- 每 90 秒更新一次。
- EIGRP 是 IGRP 的高级版本,它是混合路由协议(不全是根据跳数来计算)。
- IOS 12.0 以后,不支持 IGRP,在模拟器中还可以。
- EIGRP 是可以的,和华为等路由器是不兼容的。(因为知识版权是思科独有的)
可变长度子网掩码 VLSM
可变长度子网掩码(Variable Length Subnet Mask,VLSM)
经典路由和可变长度子网掩码
经典路由(Classful routing) 无子网掩码
- 有类的路由协议要求单个网络使用相同的子网掩码。
- 例如:网络 192.168.187.0 必须仅使用一个子网掩码,例如 255.255.255.0。
- 会造成网络号的浪费(为了规格一致,为了保证标准一致,会浪费一些网络号),比如路由器之间的网络没有必要给很多的 hostID。
- 特定的情况:将路由器端口的掩码作为目的网络的掩码,可以进一步完成细化
可变长度子网掩码(Variable-Length Subnet Masks) 有子网掩码
- VLSM 只是一项功能,它允许单个自治系统的网络具有不同的子网掩码。
- 有效的解决网络号浪费的问题
VSLM 可变长度子网掩码
- 使用 VLSM,网络管理员可以在主机少的网络上使用长掩码,而在主机多的子网上使用短掩码。(提供了很高的灵活性)
- 如果路由协议允许 VLSM
- 在路由网络连接上使用 30 位子网掩码 255.255.255.252
- 用户网络的 24 位掩码 255.255.255.0
- 或者,对于最多 1000 个用户的网络,甚至是 22 位掩码 255.255.252.0。(保留 10 位)
- 在 CIDR 的基础上发展的,报文中包含有子网掩码。
为什么使用 VLSM
- VLSM 允许组织在同一网络地址空间内使用多个子网掩码。
- 实施 VLSM 通常被称为“子网划分”,可用于最大化寻址效率。
- VLSM 是有助于缩小 IPv4 和 IPv6 之间差距的修改(modifications)之一。
VLSM 优缺点
VLSM 的优点
- 高效使用 IP 地址
- 更好的路由聚合(aggregation):构建超网
VLSM 的缺点
- 会导致地址空间的浪费:广播地址和网络号都无法被使用。
- 过去,建议不要使用第一个和最后一个子网。但是我们可以使用 Cisco IOS ver12.0 中的子网 0。
- 从 IOS ver12.0 起,Cisco 路由器默认使用零子网。
- 如果想要禁止零子网,使用该指令:
router(config)#no ip subnet-zero()
上图解释了子网长度相同会造成怎样的浪费(在路由器所在的子网段我们只需要满足 2 个主机,也就是需要 2 位的主机号就可以完成操作)
每一个位置都需要 30 个主机,有 7 个子网可以使用(全零可以使用,而全一不可以使用) 借 7 个子网给各个网段使用(红色和黑色线属于不同的网段)
支持 VLSM 的路由协议
- 开放式最短路径优先(OSPF)
- Integrated Intermediate System to Intermediate System(Integrated IS-IS) 集成中间系统到中间系统(集成 IS-IS)
- 增强型内部网关路由协议(EIGRP)
- RIP v2
- 静态路由
VLSM 的表示法
- 斜杠的含义是指前面多少位保留给网络位
- 此时也就是/30 就可以满足路由器之间的网络连通所需(减少浪费),剩下的网络地址可以在以后网络进行扩展
- 这个例子中不使用 VLSM 还是可以进行解决的
VLSM 的例子
划分背景
- 已分配 192.168.10.0/24 的 C 类地址。
- 珀斯,悉尼和新加坡与吉隆坡建立 WAN 连接。
- 珀斯需要 60 个主机
- KL 需要 28 个主机
- 悉尼和新加坡分别需要 12 位主机。
- 先划分成大的子网,然后进一步进行划分,然后在慢慢进行细化
- 为了计算 VLSM 子网,各个主机首先从地址范围分配最大的需求。需求级别应从最大到最小列出。
第一步:满足珀斯的主机需求
- 在此示例中,珀斯需要 60 个主机号。
- 使用 6 位,因为 26 - 2 = 62 个可用主机地址。因此,将从第四个八位位组开始使用 2 位来表示/26 的扩展网络前缀,其余 6 位将用于主机地址。
- 在地址 192.168.10.0/24 上应用 VLSM 可得到:
- 192.168.10.00 hh hhhh /26
- 255.255.255.192(1100 0000)
- 第一个给 Perth 使用,剩下的用作保留未使用的
第二步:为吉隆坡划分子网
- 吉隆坡需要 28 台主机号。192.168.10.63/26 之后的下一个可用地址是 192.168.10.64/26。
- 由于需要 28 个主机,因此主机地址需要 5 位,即 32-2 = 30 个可用主机地址。
- 因此,将需要 5 位来表示主机,而将使用 3 位来表示扩展网络前缀/27
- 在地址 192.168.10.64/26 上应用 VLSM 可得到:
- 192.168.10.010 hhhhh /27
- 255.255.255.224(1110 0000)
- 三个子网再借用一位
第三步:为悉尼和新加坡进行分配地址
- 现在,悉尼和新加坡分别需要 12 位主机号。 下一个可用地址从 192.168.10.96/27 开始。
- 由于需要 12 个主机,因此主机地址需要 4 位,即 24 = 16、16 - 2 = 14 个可用地址。
- 因此,需要 4 位来表示主机,对于/28 的扩展网络前缀需要 4 位。
- 在地址 192.168.10.96/27 上应用 VLSM 可得到:
- 192.168.10.0110 hhhh /28
- 255.255.255.240(1111 0000)
第四步:为之间的路由地址进行划分
- 现在为 WAN 连接分配地址。请记住,每个 WAN 连接都需要两个 IP 地址。下一个可用的子网是 192.168.10.128/28。
- 由于每个 WAN 链路需要 2 个网络地址,因此主机地址需要 2 位,即 22 -2 = 2 个可用地址。
- 因此,需要 2 位来表示链接,并需要 6 位来表示扩展网络前缀/30。
- 在 192.168.10.128/28 上应用 VLSM 可得到:
- 192.168.10.011000 hh /30
- 255.255.255.252(1111 1100)
- 通过上述方法,从主机需求量大的部分入手,到主机需求量小的部分是很好的方法。
VLSM: 例子总结
- 重要的是要记住,只有未使用的子网才能进一步划分子网。
- 如果使用了子网中的任何地址,则该子网不能再进行子网划分。
- 一般是从主机多大到主机少(路由间网络)进行划分
路由聚集(Route Aggregation)
- 使用无类域间路由(CIDR,Classless InterDomain Routing)和 VLSM 不仅可以防止地址浪费,而且还可以促进路由聚合或汇总。
- 多个路由条目汇聚成小的路由条目
- 比如如下图就是讲 3 个/24 的子网合并成一个/16 的网络高速远端
- 优点:聚集之后我们只需要知道一个网段就可以,也就是远端的路由表就会变少
路由聚集的例子
- 多层聚集
如何进行路由聚集
如何进行计算:将尽可能多的位进行聚集,将之后的不通过的位置,作为 Host 位,就得到了上图的结果
路由聚集的优点
- 减少路由表条目的数量。
- 可用于隔离拓扑更改(聚集之后,只能得到大的网段的信息,因为小的网段的拓扑变化会比较频繁,导致路由表进行不断地计算,只公告比较高聚集后的路由的网段信息)
路由隔离的其他内容
- 为了使聚合正常工作,请以分层方式(hierarchical fashion)仔细分配地址,以便汇总的地址将共享相同的高位。
- VLSM 允许路由聚合,并且通过将聚合完全基于左侧共享的高阶位来灵活地增加,即使网络不连续也是如此。
- 路由聚集需要严谨,不能让 A 和 B 两个端口的聚集后的网络号相同
- VLSM 是不做连续性检验的,也就是就算不连续也会进行聚集
- 全 0 子网会在题目中说是否可用
- 全 1 子网尽量不要使用
因特网控制报文协议 ICMP
- ICMP(Internet Control Message Protocol):为了提高 IP 数据报交付成功的机会(消息管理和协商)
- ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告
- ICMP 只是 IP 层的协议
- ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去
- 一般路由器在丢弃报文的时候(处理之前已经提到的情况),都会返回一个ICMP 差错报文。
ICMP 报文的格式
- 前四个字节是一样的(格式化的)
- 后面都是个根据类型
两种 ICMP 报文
- 查询报文:一般这种情况不是很多
- 差错报告报文:一般这种类型会多一些
目的站不可到达
- 网络不可到达(net unreachable)
- 主机不可到达(host unreachable)
- 协议不可到达(protocol unreachable)
- 端口不可到达(port unreachable)
- 源路由选择不能完成(source route failed)
- 目的网络不可知(unknown destination network)
- 目的主机不可知(unknown destination host)
- 不可知是完全不可以解析,不可达是可以解析但是不可以到达
ICMP 差错报告报文的数据字段的内容
- 一般会把原始的 IP 数据报文的数据报首部 + 8 字节(数据的,可能会包含端口信息)作为 ICMP 的数据部分
- ICMP 的前 8 个字节的是确定的(前 4 个字节是类型,校验位,后面四个字节是确定的)
- 然后添加一个首部作为 IP 数据报进行发送。
不应发送 ICMP 差错报告报文的几种情况
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文(就是每次传送只要发送一次就够了)
- 对具有多播地址的数据报都不发送 ICMP 差错报告报文
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文
- 127.0.0.0:逻辑回路地址
- 0.0.0.0:确认路由地址
PING(Packet InterNet Groper)
- PING 是用 ICMP 的"Echo request“和”Echo reply"消息来实现的
- PING 用来测试两个主机之间的连通性,一般是用来检查局域网的连通性:PING 不通,不仅仅是发送不过去,有可能是应答不回来。
- PING 使用了 ICMP 回送请求与回送回答报文
- PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或 UDP
不同设备
路由器的路由表和转发表
转发表和路由表是不同的,转发表由路由表得来