网络协议-网络层协议-IP协议

宽带上网是如何实现的

网络层是 TCP/IP 的心脏,主要负责终端节点之间的通信,把网络包从源主机发送到目标主机,所以这种通信也叫点对点的通信。这一层主要包含两个协议:IP 协议和 ICMP 协议,我们先来介绍 IP 协议。

网络层的作用

我们上一篇介绍的数据链路层只能在同一种数据链路上的节点之间进行通信,而一旦跨越多种数据链路,就需要借助网络层才能通信,网络层可以跨越不同的数据链路,实现两个节点之间的数据包传递,而这些不同的数据链路通常通过路由器来连接:

或者简单来说,在局域网内部需要数据链路层进行通信,而不同的局域网之间(互联网其实就是将多个不同的局域网连接起来实现互联)需要借助网络层才能通信,完整的计算机网络需要借助这两个分层才能最终完成通信。

IP地址

在计算机网络通信中,为了识别通信对端,需要一个类似于地址的识别码对节点进行标识,就好比找一个人需要门牌号一样,MAC 地址用于标识同一链路上的不同计算机,而网络层用于表示地址信息的是 IP 地址。

IP 地址用于在连接到网络的所有主机中识别出进行通信的目标地址,因此,在 TCP/IP 中所有主机或路由器必须设定自己的 IP 地址。IP 地址是 TCP/IP 通信的基石。

公网 IP 与私有 IP

起初,互联网中任何一台主机和路由器都必须配置一个唯一的 IP 地址,然而,随着互联网的发展,IP 地址不足的问题日趋显著,于是就有了一种新技术,它要求不为每一台主机或路由器分配一个固定的 IP 地址,而是在必要的时候只为相应数量的设备分配唯一的 IP 地址。

尤其对那些没有连接到互联网的独立网络中的主机,只要保证在这个网络内地址唯一,可以不用考虑互联网即可配置相应的 IP 地址。不过,即使两个独立网络各自随意设置 IP 地址,也可能会出问题,比如两个独立网络互连时地址冲突,或者由于某种原因,需要连接到互联网,于是又出现了私有网络的 IP 地址,它的范围如下:

包含在这个范围内的 IP 地址都属于私有 IP,而在此之外的 IP 地址称为全局 IP,也叫公网 IP。

私有 IP 最早没有准备连接互联网,而只用于互联网之外的独立网络,不过当一种能够互换私有 IP 与公网 IP 的 NAT 技术诞生以后,配有私有地址的主机与配有全局地址的互联网主机实现了通信。

现在,每个学校、公司、家庭内部采用的正是在每个终端设置私有 IP 地址,在路由器或必要的服务器上设置公网 IP 地址,配置私有 IP 地址的主机连网时,通过 NAT 进行通信。

公网 IP 地址基本要在整个互联网内保持唯一,但私有 IP 地址不需要,只要在同一个域内保持唯一即可。在不同的域内出现相同的私有 IP 地址不影响使用。

家用宽带上网实现

有了上面的知识储备,想必你已经对我们平时公司、学校、家庭如何实现宽带上网有些眉目了,下面学院君就来给大家捋一下。

在世界范围内,全局 IP 地址由 ICANN(互联网名称与数字地址配置机构)管理,在中国,由其下属 CNNIC 这个机构负责分配国内的公网 IP 地址分配。

在互联网广泛商用之前,用户需要直接向 CNNIC 申请公网 IP 地址才能上网,随着 ISP(互联网服务提供商,比如电信、联通、移动、华数)的出现,在向 ISP 申请接入互联网的同时还会申请公网 IP 地址,这种情况下,ISP 其实充当了用户与 CNNIC 之间的代理。

对于 FTTH(光纤到户) 和 ADSL 宽带服务(目前比较常见的两种宽带服务),网络服务提供商会直接给用户分配公网 IP 地址,并且每次用户重新连接互联网时,该 IP 地址都可能发生变化,这时的 IP 地址由提供商维护,不需要用户自行申请。当然这个公网 IP 地址是分配到路由器上的。

而我们通过有线或无线方式连接到路由器的计算机和手机的 IP 地址,则是由 DHCP 动态分配的私有 IP 地址。关于 DHCP 动态分配 IP 地址我们后面会单独介绍。

现在,一般只有在需要固定 IP 的情况下才需要申请公网 IP 地址,比如服务器、云主机等托管网站的主机节点。

好了,有了上面的介绍,想必你应该对笔记本、台式机等计算机终端以及手机如何通过 IP 地址连接上互联网进行通信有了比较清楚的了解了吧,当然,这还只是一个比较感性的了解,我们继续从技术层面来理性分析基于 IP 协议的网络层通信是如何实现的。

IP 地址详解

我们将深入探讨 IP 地址的格式、组成、分类、广播以及子网掩码等技术细节。

IP 地址的格式

IP 地址目前分为 IPv4 和 IPv6 两种类型,目前主流的还是 IPv4 地址,后面的分享也主要基于 IPv4。

在计算机内部,IPv4 地址由 32 位二进制数字表示,为了方便人类识别,通常将其按照 8 位一组,分为 4 组,每组用 . 分隔,并将每组内的二进制数转化为十进制数,这样就有了我们常见的 IP 地址(IPv4)格式:

同时,这也是一个私有 IP 地址。

注:后面的分享中,我们默认约定 IP 地址就是代指 IPv4 地址。

IP 地址一般配置在网卡上,一般一块主机网卡会配置一个 IP 地址(也可以配置多个),而一台路由器通常会配置两块以上的网卡(因为路由器连接的是两个网段):

IP 地址的组成

IP 地址由网络标识(网络地址)和主机标识(主机地址)两部分组成。

网络地址用于标识节点所属的数据链路,一般不同的局域网之间网络地址必须不同,而同一个局域网内的主机必须有相同的网络地址;主机地址则用于标识同一个局域网内的不同主机,它们的主机地址不能重复。这样综合起来,我们就可以通过设置网络地址和主机地址来确保在相互连接的网络中每个节点的 IP 地址都不会重复。

以上面图示的 IP 地址为例,192.168.31 是网络地址,218 则是主机地址。起初,我们通过 IP 地址分类来区分网络地址和主机地址,现在通常通过子网掩码区分它们。下面我们就分别来介绍下 IP 地址分类和子网掩码。

IP 地址的分类

按照网络层次和规划的子网大小,通常将 IP 地址分为以下4类:

  • A 类地址:首位以 0 开头,第 1-8 位是网络地址,后24位是主机地址,0.0.0.0~127.0.0.0 是 A 类的网络地址,可容纳 16777214(224-2) 个主机地址;
  • B 类地址:前两位以 10 开头,第 1-16 位是网络地址,后 16 位是主机地址,128.0.0.0~191.255.0.0 是 B 类的网络地址,可容纳 65534(216-2) 个主机地址;
  • C 类地址:前三位以 110 开头,第 1-24 位是网络地址,后 8 位是主机地址,192.168.0.0~239.255.255.0 是 C 类的网络地址,可容纳 254(28-2) 个主机地址;
  • D 类地址:前四位以 1110 开头,第 1-32 位是网络地址,没有主机地址,224.0.0.0~239.255.255.255 是 D 类的网络地址,常用于多播;

要用比特位标识主机地址时,不可以全部为 0 或 1,因为全部为 0 只有在表示对应的网络地址或 IP 地址不可获知的情况下才用,而全部为 1 的主机地址通常作为广播地址。因此,在分配的时候,要去掉这两种情况(这就是为什么上面都做了-2的处理)。

子网掩码

很显然,如果以上面 A、B、C 三类来划分子网的话,存在着 IP 地址的浪费,全世界 IP 地址的上限是 43 亿(2的32次方),如果按照 A 类来划分,全世界只能划分出 128 个子网(2的7次方),这显然不够;如果是办公室、学校这样的局域网来说,B 类地址的主机承载容量显得太大;如果是在家庭这种小型的局域网,即使是 C 类地址都有着极大的浪费。

因此,为了解决上述问题,我们通过一种叫做「子网掩码」的识别码将子网网络地址细分为比 A、B、C 类粒度更小的网络。这种方式会将原来的 A、B、C 类主机地址的一部分也作为网络地址,从而让 IP 地址的网络地址和主机地址不再受限于 IP 地址的分类,将原有网络划分为更多的子网。

引入子网以后,原始的 IP 地址就要通过两部分来识别,一种是 IP 地址本身,一种是标识网络地址部分的子网掩码:

子网掩码和 IP 地址一样也是由 32 位二进制数表示,格式和 IP 地址类似,只不过其对应 IP 地址网络地址部分的位都是 1,主机地址部分的位都是 0,我们将 IP 地址与子网掩码做按位与运算,就可以计算出该 IP 地址的网络地址部分。

对于子网掩码,一般常见的有两种表示方式,一种是上面这种分两行的表示方式,还有一种是在 IP 地址后面追加网络地址位数,并通过 / 分隔开:

192.168.31.218/24

有了子网掩码,我们就可以按照需要将子网按照任何维度进行划分了。

在此基础上,为了解决全世界 IPv4 地址数量有限的问题,还诞生了 CIDR(无类型域间选路)和 VLSM(可变长子网掩码)技术,但是 IPv4 地址绝对数本身有限的事实无法改变,因此又有了 IPv6 地址。

公网 IP 和私有 IP,诞生的初衷也是为了解决 IPv4 地址不够用的问题,不同局域网之间的私有 IP 可以重复。

IPv6 地址简介

IPv6 是为了从根本上解决 IPv4 地址耗尽的问题而被标准化的网际协议。

IPv4 的长度是 4 个 8 位字节,总共 32 位,IPv6 的长度是其 4 倍,即 128 位,一般写成 8 个 16 位字节:

其中 inet6 后面就是 IPv6 的地址。

IPv6 地址可以容纳的设备数是个天文数字(2的128次方),足以满足可预见的未来人类对 IP 地址的需求。但是从 IPv4 切换到 IPv6 是一件极其耗时的事情,需要将所有主机和路由器的 IP 地址进行重新设置。因此,现在主流的 IP 地址还都是 IPv4 地址。

广播地址和环回地址

广播地址用于在同一个局域网中相互连接的主机之间发送数据。IP 地址中的主机地址部分全部设置为 1,就成为了广播地址。本地广播会被路由器屏蔽,不会到达外部网络。

环回地址是在同一台计算机内部的程序之间进行网络通信时所使用的默认地址,一般使用一个特殊的 IP 地址 127.0.0.1 作为环回地址,该地址还有一个与之具有相同意义的主机名 localhost,使用这个 IP 地址或主机名,数据包不会流向网络。

路由控制详解

IP 地址是网络层的基础,要真正将数据包从发送端成功发送到目标主机,还需要通过路由控制。现在我们来介绍路由控制的概念及其跳转流程。

路由控制定义

发送数据包时使用的地址就是 IP 地址,然而仅仅有 IP 地址还不足以将数据包发送到目标地址,在数据包发送过程中还需要指明下一跳路由器或主机,以便发往最终目标地址。

在这里我们需要先了解「跳」的概念,「跳」是网络中的一个区间(网段),IP 数据包正是在网络中一个个跳之间转发,因此 IP 路由也叫多跳路由,在每一个区间内决定着包在下一跳被转发的路径:

在以太网等数据链路中使用 MAC 地址传输数据帧,此时的一跳指的是源 MAC 地址到目标 MAC 地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其它路由器而能直接到达相邻主机或路由器网卡之间的一个区间。

为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表,该表记录 IP 数据在下一步应该发给哪个路由器,IP 数据包将根据这个路由表在各个数据链路上传输。

该路由控制表有两种生成方式,一种是管理员手动设置,一种是路由器根据与其他路由器相互交换信息时自动刷新。前者叫静态路由控制,后者叫动态路由控制。为了让动态路由及时刷新路由控制表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息(关于路由协议后面我们会单独介绍)。

路由控制流程

我们在上一篇介绍的 IP 地址的网络地址部分将会用于路由控制,根据网络标识选择下一跳的路由器。具体的跳转逻辑如下图所示:

要从源主机 10.1.1.30 发送一个数据包到目标主机 10.1.2.10,由于 10.1.2.10 的网络地址与源主机 10.1.1.0/24 的网络地址不匹配,所以数据包被转发到路由器,路由器的路由控制表中如果已经存在 10.1.2.0/24 的网络地址映射,则直接将请求转发到对应的路由器(关于路由控制表的生成逻辑我们后面会详细介绍),如果目标主机 IP 地址在该路由器所在的数据链路中,再将数据包发送过去,就完成了将数据包发送到目标主机的流程。

IP数据包的分片与合并

IP 数据包是在数据链路层处理的基础上对数据进行打包,不同数据链路的各自最大传输单位(MTU)不尽相同,但是 IP 协议又是可以实现多个数据链路之间通信的协议,所以,意味着它对不同的数据链路差异进行了抽象,使得上层无需关注底层网络构造细节。

在具体实现时,IP 协议采用了对数据包进行分片处理,将较大的 IP 包分割成较小的包,到了接收端以后再根据分片序号重新组合起来传递给上一层,通过这种方式实现了对数据链路层的抽象。

分片会导致路由器处理负荷加重,所以只要允许,都不会让路由器进行 IP 数据包的分片处理,其次,在分片过程中,如果某个分片丢失,整个 IP 数据包都会作废。实际实现过程中,为了避免路由器对 IP 数据包进行分片,还产生了一种叫做「路径 MTU 发现」的技术,所谓路径 MTU 指的是从发送端主机到接收端主机之间路由器不需要对 IP 数据包进行分片的最大 MTU 的大小,然后发送端根据这个 MTU 的大小对数据包进行分片发送,从而避免路由器对其进行分片处理。感兴趣的同学可以去了解下其实现细节,这里就不深入展开了。

猜你喜欢

转载自www.cnblogs.com/stringarray/p/12925878.html