8. 网络层

在复杂的网络环境中确定一个合适的路径.

1. IP协议

1. 基本概念

IP协议:提供一种能力(有非常大的概率,做到某事),把数据报从主机A,跨网络,送到主机B 

--> 必须要有方式,标识通信两端唯一性!!(IP协议解决的是主机到主机的问题,进程到进程的问题有端口号) ---> 每台主机都必须设置IP地址(公网IP)

主机: 配有 IP 地址, 但是不进行路由控制的设备;
路由器: 即配有 IP 地址, 又能进行路由控制;(理论工作在网络层,而当代路由器,已经是一台小型计算机了!是可以工作在应用层的)
节点: 主机和路由器的统称

2. 协议头格式

• 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 

• 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4
的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 
 
• 16 位总长度(total length): IP 数据报整体占多少个字节. 

• 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片
了, 那么每一个片里面的这个 id 都是相同的. 

• 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要
用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢
弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类
似于一个结束标记. 

• 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 
其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8
得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文
就不连续了). 

• 8 位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是
64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环

• 8 位协议: 表示上层协议的类型

• 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏. 

• 32 位源地址和 32 位目标地址: 表示发送端和接收端. 

• 选项字段(不定长, 最多 40 字节): 略

 1. IP报文,解包问题(封装)

挪动指针即可增加/减少协议头

2. 分用问题(8位协议表明有效载荷是什么数据)

 • 8 位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和
1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 
最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延
时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要.

3. 网段划分(重要)

IP 地址分为两个部分, 网络号和主机号(IP = 网络号  + 主机号)
•  网络号: 保证相互连接的两个网段具有不同的标识;
•  主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号

•  不同的子网其实就是把网络号相同的主机放到一起.(路由器有构建子网的功能)
•  如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致,
是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都
不相同.
那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.
• 有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免
了手动管理 IP 的不便. 
• 一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器.
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示
• A 类 0.0.0.0 到 127.255.255.255
• B 类 128.0.0.0 到 191.255.255.255
• C 类 192.0.0.0 到 223.255.255.255
• D 类 224.0.0.0 到 239.255.255.255
• E 类 240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类 网络地址, 导致 B 类地址很快就分配完了, A 类却浪费了大量地址;

• 例如, 申请了一个 B 类地址, 理论上一个子网内能允许 6 万 5 千多个主机. A 类
地址的子网内的主机数更多. 
• 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的 IP 地址都被浪费掉了

 针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):

•  引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
•  子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
•  将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
•  网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关
FF代表全是1;0:整个IP就是表示网络号
子网地址范围:这个子网内最多可以有多少台主机。
可见,IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地
址范围;
IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为
140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0

子网划分是指将一个较大的网络分割成多个较小的网络,也就是子网;why?--- 查找目标主机,必须先查找目标网络:本质就可以淘汰其他网络,可以在全网中提高查找目标主机的效率 

子网划分的本质:把32位比特位进行划分,确定网络号有多少位!

目的

  • 提高 IP 地址利用率:在没有子网划分时,A 类、B 类网络可能会造成 IP 地址浪费。例如,一个 B 类网络理论上可容纳 65534 个主机,但实际使用中往往不需要这么多主机地址。通过子网划分,可以根据实际需求将大网络分割成若干小网络,充分利用 IP 地址资源。
  • 增强网络管理和安全性:将网络划分为多个子网后,不同子网可以根据需要进行独立管理,设置不同的访问控制策略。例如,企业可以将办公子网、服务器子网等分开管理,办公子网对外部网络访问进行限制,而服务器子网对特定的内部主机开放,从而增强网络安全性。

结论1:IP地址是有用的,是有限的,是资源 --- 各国运营商都在抢,为啥抢?要搭建国家子网 

4. 特殊的IP地址

•  将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网
•  将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
•  127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1

5. IP地址的数量限制

我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 32 次方 个 IP 地址, 大概是 43 亿左右. TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
这意味着, 一共只有 43 亿台主机能接入网络么?
实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.
CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP

地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

•  动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的
设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
•  NAT 技术(后面会重点介绍);
•  IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;

6. 私有IP地址和公网IP地址

公网的理解:公网IP -- 各个国家的运营商主动申请 -- 运营商不仅仅要组建内网,运营商,也要组建自己国家的公网环境 -- 一个区域,究竟能有多大的网络,取决于自己有多少个公网IP -- 分配公网IP,是结合网民数量,按照地区划分的

如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet ,理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
• 10.*,前 8 位是网络号,共 16,777,216 个地址
• 172.16.*到 172.31.*,前 12 位是网络号,共 1,048,576 个地址
• 192.168.*,前 16 位是网络号,共 65,536 个地址
包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);

•  一个路由器可以配置两个 IP 地址, 一个是 WAN IP, 一个是 LAN IP(子网IP).
•  路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中.
• 不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机 IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了.
•  每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN IP 就是一个公网 IP .
•  子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation,网络地址转换).
•  如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买
1.发送:

 

2.回来:

7. 路由

路由器本身就具有构建子网的能力-->给子网内所有主机分配IP的能力(任何路由器,都要配有至少配有两个IP)

路由报文,本质是查找主机的问题!---> 查找本质,是一个淘汰的过程,只要淘汰效率高,查找效率就高

在复杂的网络结构中, 找出一条通往终点的路线
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程.
所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间.

 IP 数据包的传输过程也和问路一样

•  当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
•  路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
•  依次反复, 一直到达目标 IP 地址;
•  路由表可以使用 route 命令查看
•  如果目的 IP 命中了路由表, 就直接转发即可;
•  路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

 假设某主机上的网络接口配置和路由表如下:

•  这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
•  路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3

•  跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不

•  再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
•  由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2
•  依次和路由表前几项进行对比, 发现都不匹配;
•  按缺省路由条目, eth0 接口发出去, 发往 192.168.10.1 路由器;
•  由 192.168.10.1 路由器根据它的路由表决定下一跳地址;
结论1:公网路由器的路由算发表和内网的路由算发表复杂度是不同的

8. IP 分片和组装的具体过程

•  16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.
•  3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记.
•  13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是 8 的整数倍,最后一片的偏移量也一定是 8 的整数倍), 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).
•  注意:片偏移(13 )表示本片数据在它所属的原始数据报数据区中的偏移量
(以 8 字节为单位)

分片

如何甄别特定报文是否被分片了?--- 更多分片0 && 片偏移0 !!!

a. 更多分片(MF)标志判断

IP 首部中有个 “更多分片(MF)” 标志位 。当 MF = 1 时,表明该报文是一个分片,且后续还有分片。因为如果报文被分片,只要不是最后一个分片,MF 位就会被置为 1 ,用于告知接收方还有后续分片。

b. MF 为 0 且片偏移大于 0 判断

当 MF = 0 时,正常理解可能是未分片报文或最后一个分片。但如果此时片偏移(Fragment Offset ) > 0 ,说明该报文之前存在其他分片,即此报文是经过分片后的最后一个分片。因为片偏移表示该分片在原始报文中的位置偏移量,若片偏移大于 0 ,意味着前面有其他分片占据了原始报文靠前的位置,所以能判定报文经历过分片 。

保证分片收全的原理

  • 标识字段:IP 首部的 16 位标识字段,发送方对同一原始报文的所有分片设置相同标识值。接收方据此识别属于同一报文的分片并聚合。
  • 片偏移字段:接收方依据片偏移确定分片顺序。理论上,若按片偏移升序排列后,相邻分片的片偏移与自身长度满足 “片偏移 + 自身报文长度 = 下一个分片的片偏移”,且收到 MF(更多分片)标志为 0 的分片(表示无后续分片 ),可认为收全。但实际网络中,若有分片丢失(如第一片、中间片、结尾片 ),就无法满足上述条件,意味着未收全。
1. 检查 MTU 限制
当一个 IP 数据报的大小超过了网络的 MTU(最大传输单元)限制时,就需要进行分片。MTU 是数据链路层对 IP 层数据包进行封装时所能接受的最大数据长度。
2. 分割数据报
IP 层将原始的 IP 数据报分割成多个较小的片段。
对于每个片段,IP 层会设置相应的标识(Identification)、偏移量(Fragment Offset)和标志位(Flags)等字段。
标识字段用于标识属于同一个数据报的不同分片,确保所有分片能够被正确地重新组装。
偏移量字段指示了当前分片相对于原始数据报的起始位置,以 8 字节为单位。
标志位字段包含了 3 个位,其中 MFMore Fragment位用于指示是否还有更多的分片,DFDo Not Fragment位用于指示数据报是否允许进行分片。
3. 添加 IP 头部
每个分片都会加上自己的 IP 头部,与完整 IP 报文拥有类似的 IP 头结构,但 MF 和 Fragment Offset 等字段的值会有所不同。
4. 发送分片
分片在传输过程中独立传输,每个分片都有自己的 IP 头部,并且各自独立地选择路由

组装

1. 接收分片
当目的主机的 IP 层接收到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来。
2. 排序与组装
利用片偏移字段,IP 层会对属于同一个数据报的分片进行排序。
当所有的分片都到达并正确排序后,IP 层会将这些分片重新组装成一个完整的 IP 数据报。
3. 传递给上层协议
组装好的 IP 数据报会传递给上层的协议进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值