IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络模型(四):网络层IP协议 -> 正文阅读

[网络协议]计算机网络模型(四):网络层IP协议

计算机网络模型(三):运输层

简介

网络层的东西太多了,也非常繁杂,很难面面俱到,但是我会尽量把大部分的,重要的东西复习到。

一直以来,人们对网络层一直有争议,就是网络的可靠性交付应该由谁完成?是网络还是端系统?最终,因特网采用了后者,即不保证质量的承诺,

我们目前的网络只是向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组的时候不需要先建立连接。正是这种思路,才使得我们如今的互联网廉价,迅速发展成如今的规模。

网络层有许多协议,我们一个一个说。

IP协议

和我们之前说的TCP服务一样,和IP协议配套的还有一些协议,我先在这里说明一下,它们都是属于网络层的协议,分别是ICMP协议,IGMP协议和ARP协议。本来还有RARP协议,但是现在已经不用,ARP代替了它。

在这里插入图片描述

IP地址的分类

我们现在常用的IP是IPv4,由32位组成。

I P 地 址 : : = { < 网 络 号 > , < 主 机 号 > } IP地址::=\{<网络号>,<主机号>\} IP::={<>,<>}

在这里插入图片描述
如图所示,地址可以分为5类,ABC都是单播地址,适用于一对一通信。

  1. A、B、C类地址网络号字段分别为8、16、24位,其分类标准为前几位:0、10、110。
  2. D类地址用于多播
  3. E为以后使用

所以,一个IP地址不仅仅可以指明主机,还能指明主机所连接的网络。

为了可读性,我们往往每8位插入一个空格,便于使用。而对于人类的读取,我们会将二进制转换成十进制,将空格转换为“点”,使用起来方便很多。但是,机器中并不存在这样的空格或者点。

在这里插入图片描述

常用的三种类别IP地址

A类

A类地址的网络号有一位固定,还剩7位可用。所以A类地址理论可有 2 7 ? 1 = 127 2^7 - 1=127 27?1=127个,但是其中地址段127(01111111)被用于回环测试,即127.0.0.1这样的地址只能给本机测试,不作为网络发送的地址,因此A类地址共有126个可用。

对于主机号,A类地址的主机号占3字节,而全零主机号表示网络地址,全一主机号标识该网络上的所有主机,因此A类地址主机最大个数为: 2 24 ? 2 = 16777214 2^{24}-2=16777214 224?2=16777214个。

整个A类的地址空间共 2 31 2^{31} 231个地址。

B类

B类地址的前两位确定,为10。但是规定128.0.0.0是不指派的,可以指派的B类最小地址为128.1.0.0,为啥不是128.0.0.1?因为B类地址的网络号是2字节的,后面是主机号。所以B类地址可以指派的网络数为 2 14 ? 1 = 16383 2^{14}-1=16383 214?1=16383

对于主机,B类地址最大主机数为 2 16 ? 2 = 65534 2^{16}-2=65534 216?2=65534。一样,全零全1不做指派。

整个B类地址空间共 2 30 2^{30} 230个。

C类

除去最开始的110,还有21位可以分配。192.0.0.0不指派,可以指派的最小地址为192.0.1.0。因此C类地址可指派的网络总数为 2 21 ? 1 = 2097151 2^{21}-1=2097151 221?1=2097151

对于主机,最大容量主机数为 2 8 ? 2 2^8-2 28?2

地址空间共 2 29 2^{29} 229个。

特点

  1. IP地址管理机构只用分配IP的网络号,主机号由网络号的单位自行分配。
  2. 路由表只需要根据网络号进行分组转发,减少了路由表的存储空间和路由时间。
  3. 一个网络指的是拥有同一个网络号的主机集合。因此,由网桥和转发器连接起来的局域网仍是一个网络;拥有不同主机号的局域网必须由路由器连接。

IP报文

和TCP报文一样,IP报文也分为首部与数据。
在这里插入图片描述
第一行:

  1. 版本:指IP协议的版本。(IPv4还是IPv6),只有相同版本协议才能通信。
  2. 首部长度:4位,但是一个单位表示4字节。也就是说IP报文首部最大长度为 4 ? 2 4 = 64 4*2^4=64 4?24=64字节,即IP数据报首部最大长度为64字节,最小为20字节固定长度。
  3. 区分服务:8位,没用过。
  4. 总长度:指一个IP报文总长度,占16位,所以最大长度为 2 16 ? 1 = 65535 2^{16}-1=65535 216?1=65535字节。但是基本没有这么长的报文,都会拆分来发送,这种拆分叫做分片。在后面会提到。

第二行:

  1. 标识:占16位,IP软件在存储器中维持一个计数器。每产生一个数据报,该计数器加一。该字段与顺序无关,因为IP是无连接的,字段与分片有关。
  2. 标志:占3位,但是目前只有2位有意义。最低位为MF(more fragmant),MF=1时表示后面还有分片,MF=0时表示后面没有分片了,是最后一个;中间的一位记为DF(don’t fragment),表示不能分片,DF=0时才可以分片。
  3. 片位移:占13位,分片后,某片在原分组中的相对位置,以8个字节为单位,也就是说,每个分片都是8字节的整数倍。这个后面将分片会说。

第三行:

  1. 生存时间:8位,原先就是时间,现在改为了跳数。路由器在收到ip报文的时候会判断是不是自己网络的报文,如果不是就会转发,此时生存时间减一。如果生存时间为1,那么该数据报只能本局域网发送。此外,如果生存时间为0,路由器会放弃该报文。因为是8位,所以最大生存时间为255。
  2. 协议:8位,指依附于IP报文的下层协议。
  3. 首部校验和:占16位,不检验数据部分,只检验首部。具体检验方法见后文。

第四行:源地址
第五行:目的地址

分片原理

目前,因特网主流的分片长度为MTU=1500,即IP报文首部加数据部分最多长度为1500字节。

现假设一报文长度为3820字节,首部为20字节,那么要根据MTU=1500进行分片。

我们知道3820字节是3800的数据部分和20的首部,1500分片是首部+数据,因此数据部分只有1480字节。 3800 / 1480 = 2......840 3800/1480=2......840 3800/1480=2......840,因此我们的分片应该是1500,1500,860。

下面画图理解一下:
在这里插入图片描述
关于标识,相同报文具有相同标识,报文分片以后,这些分片的标识相同。根据标识和片位移,我们可以重组报文。

校验和算法

由于IP报文的特殊性,我们不希望用太复杂的算法来进行校验,否则转发的时候效率很低。

  1. 发送时,把IP首部划分为许多16位字的序列,并把检验和字段置零;
  2. 用反码求和将16位字相加,得到的和取反码,写入检验和字段。
  3. 接收方将首部16位字再使用反码求和,结果取反码,得出结果。
  4. 结果如果是0,则报文无差错。否则弃掉。

在这里插入图片描述

IP分组转发流程

IP报文中有源地址和目的地址,使得IP报文可以从源地址发送到目的地址,但是更多的情况下,目的地址和源地址并不在一个网络内,它们之间可能有无数个路由器。现在,问题的关键是,路由器的路由表存什么内容。

假设路由表中存放主机信息,那么每一个路由表可能会存放成千上万个主机信息,这对路由表的存储能力是个压力,同时对寻找目的主机地址信息也是个压力,比如遍历操作的耗时,即使是哈希操作,也要额外耗费一定的存储空间,这显然是不能容忍的。

所以路由表采取了另一种方式存储:存储其他路由器的地址和跳到该路由器的方法。

假设现在有3个路由器,划分了4个网络:

在这里插入图片描述

划分子网与子网掩码

对于我们之前的两级IP地址,网络号+主机号,该分类不太灵活,且一个网络中可能含有过多的主机,于是有了三级IP地址和划分子网的概念。

I P 地 址 : : = { < 网 络 号 > , < 子 网 号 > , < 主 机 号 > } IP地址::=\{<网络号>,<子网号>,<主机号>\} IP::={<>,<>,<>}

其基本思路如下:

  1. 一个物理网络可以将本网络划分成多个子网,但是对其他网络不可见,是纯粹本网络内部的事情。
  2. 子网号是从主机号借了若干位
  3. 找到网络号之后,再找到划分的子网号,找到主机所在的子网。

那是如何找到子网的呢?这就需要子网掩码。

子网掩码是32位的二进制数。一般来说,子网掩码前几位置一的个数和网络号+子网号的位数相同。显然,
A类地址的默认子网掩码是255.0.0.0
B类地址的默认子网掩码是255.255.0.0
C类地址的默认子网掩码是255.255.255.0

举个例子:一直IP地址为141.14.72.24,子网掩码是255.255.192.0,那么网络地址的计算方法应该是:

I P = 141.14.72.24 = 10001101.00001110.01001000.00011000 子 网 掩 码 = 11111111.11111111.11000000.00000000 按 位 相 与 = 10001101.00001110.01000000.00000000 所 以 网 络 地 址 为 : 141.14.64.0 IP = 141.14.72.24 = 10001101.00001110.01001000.00011000\\ 子网掩码 = 11111111.11111111.11000000.00000000\\ 按位相与 = 10001101.00001110.01000000.00000000\\ 所以网络地址为:141.14.64.0 IP=141.14.72.24=10001101.00001110.01001000.00011000=11111111.11111111.11000000.00000000=10001101.00001110.01000000.00000000141.14.64.0

在这里插入图片描述

  1. 首先判断目的主机与源主机是否在一个子网,用源主机的子网掩码与目的主机进行相与,得到128.30.33.128,而H1的网络地址为128.30.33.0,因此判断不在一个网络;
  2. 交给路由器R1,经过1中的重复操作,发现接口一可以直接交付,则将信息转给接口一交付。

CIDR的表示方法

由于IPv4只能表示 2 32 2^{32} 232个设备,但是我们现在各种手机,电脑,平板甚至家具,车都安装上了互联网设备,因此这个数量是不够用的。除了我们听说过的IPv6方法,还有就是CIDR(读音sider,Classless Inter-Domain Routing)。

该方法放弃了地址分类,所有的地址都是二级地址,表示为:
I P : : = { < 网 络 前 缀 > , < 主 机 号 > } IP::=\{<网络前缀>,<主机号>\} IP::={<>,<>}

前缀代表了网络号之后用斜线记法表示网络前缀所占的位数。

如:
128.14.35.7 / 20 = 10000000 ? 00001110 ? 0010  ̄ 0000 ? 00000000 128.14.35.7/20 = \underline{10000000\ 00001110\ 0010}0000\ 00000000 128.14.35.7/20=10000000?00001110?0010?0000?00000000

CIDR不划分子网,指的是网络号不划分,但是同一个网络号内依然可以对子网进行划分。划分后,依然可以显示为单个网络的多个子网。比如20位掩码后,对网络划分8个子网,需要3位,那么掩码就会变成23位。

这又出现了问题,假设现在某大学的学院A希望把报文发给同学校学院B,但是又不想经过学校的路由器。报文目的地址为:D=206.0.71.130,学校的IP网络为:206.0.68.0/22,学院B网络为:206.0.71.128/25。那么,通过与运算,发现二者网络号都匹配,这时该怎么办?

我们遵循最长匹配原则,即选择网络掩码最长的进行匹配,这样能更快定位到主机的地址。

此外,找IP地址不能遍历去找,如果一个路由表中有4w个地址,遍历的话太费时间。于是我们最常用的方式就是二叉搜索树。

在这里插入图片描述
这样可以匹配唯一前缀,增加了效率,对于每一个IP地址,最差时间复杂度也是 O ( l o g 32 ) O(log32) O(log32),也就是常数时间。

IP地址硬件地址

IP地址我们之前已经说明了,是管理网络的,那么硬件地址是什么呢?

硬件地址又称MAC地址,标识了唯一的设备。我记得本科的时候有一位同学问了一个问题:既然IP地址和MAC地址都是唯一的标识,那为什么不用一个呢?这个问题把老师问懵了,老师说教了这么多年头一次见这样的问题。

其实我们可以想想,我们每个人都有身份证号,是我们的唯一ID,假设我们每个人都有一个房子,房子只住一个人,那么房子的地址就是IP地址。我要找你,不可能根据身份证号找你,只能根据你家的地址取找你。MAC和IP的关系就类似于此。

之前我们说TCP或者UDP协议的时候,没提到的是这些报文也依附于其他报文的存在,那就是IP数据报,而IP数据报依附于MAC地址存在。

在这里插入图片描述

下一篇章仍是网络层,由于网络层东西太多,不得不分开说。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:59:17  更:2021-07-31 16:59:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 13:46:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计