网络层

767 阅读17分钟

IP协议篇

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

宽带是如何上网的

网络层的作用

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

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

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 地址不影响使用。

宽带上网实现思路

  • 对于 FTTH(光纤到户) 和 ADSL 宽带服务(目前比较常见的两种宽带服务),网络服务提供商会直接给用户分配公网 IP 地址,并且每次用户重新连接互联网时,该 IP 地址都可能发生变化,这时的 IP 地址由提供商维护,不需要用户自行申请。当然这个公网 IP 地址是分配到路由器上的。
  • 而我们通过有线或无线方式连接到路由器的计算机和手机的 IP 地址,则是由 DHCP 动态分配的私有 IP 地址。

IP地址详解

IP地址的格式

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

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

IP地址的组成

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

网络地址

网络地址用于标识节点所属的数据链路,一般不同的局域网之间网络地址必须不同,而同一个局域网内的主机必须有相同的网络地址

主机地址

主机地址则用于标识同一个局域网内的不同主机,它们的主机地址不能重复。

这样综合起来,我们就可以通过设置网络地址和主机地址来确保在相互连接的网络中每个节点的 IP 地址都不会重复。以上面图示的 IP 地址为例,192.168.31 是网络地址,218则是主机地址

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 类的网络地址,常用于多播

子网掩码

很显然,如果以上面 A、B、C 三类来划分子网的话,存在着 IP 地址的浪费,全世界 IP 地址的上限是 43 亿(232),如果按照 A 类来划分,全世界只能划分出 128 个子网(27),这显然不够;如果是办公室、学校这样的局域网来说,B 类地址的主机承载容量显得太大;如果是在家庭这种小型的局域网,即使是 C 类地址都有着极大的浪费。 因此,为了解决上述问题,我们通过一种叫做「子网掩码」的识别码将子网网络地址细分为比 A、B、C 类粒度更小的网络。这种方式会将原来的 A、B、C 类主机地址的一部分也作为网络地址,从而让 IP 地址的网络地址和主机地址不再受限于 IP 地址的分类,将原有网络划分为更多的子网。

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

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

广播地址和环回地址

  • 广播地址用于在同一个局域网中相互连接的主机之间发送数据。IP 地址中的主机地址部分全部设置为1,就成为了广播地址。本地广播会被路由器屏蔽,不会到达外部网络。
  • 环回地址是在同一台计算机内部的程序之间进行网络通信时所使用的默认地址,一般使用一个特殊的 IP 地址 127.0.0.1 作为环回地址,该地址还有一个与之具有相同意义的主机名 localhost,使用这个 IP 地址或主机名,数据包不会流向网络。

路由控制详解

要真正将数据包从发送端成功发送到目标主机,还需要通过路由控制

路由控制定义

发送数据包时使用的地址就是 IP 地址,然而仅仅有 IP 地址还不足以将数据包发送到目标地址,在数据包发送过程中还需要指明下一跳路由器或主机,以便发往最终目标地址。「跳」是网络中的一个区间(网段),IP 数据包正是在网络中一个个跳之间转发,因此 IP 路由也叫多跳路由,在每一个区间内决定着包在下一跳被转发的路径:

  • 在以太网等数据链路中使用 MAC 地址传输数据帧,此时的一跳指的是源 MAC 地址到目标 MAC 地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其它路由器而能直接到达相邻主机或路由器网卡之间的一个区间。
  • 为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表,该表记录 IP 数据在下一步应该发给哪个路由器,IP 数据包将根据这个路由表在各个数据链路上传输。
  • 该路由控制表有两种生成方式,一种是管理员手动设置,一种是路由器根据与其他路由器相互交换信息时自动刷新。前者叫静态路由控制,后者叫动态路由控制。为了让动态路由及时刷新路由控制表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息

IP数据包的分片与合并

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

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

IP 报文首部格式

通过 IP 协议进行网络通信时,需要在数据前面加上 IP 首部信息(有的地方称之为 IP 头,一个意思),IP 首部中包含着基于 IP 协议进行发包控制时所有的必要信息:

  • 版本:用于标识 IP 首部的版本号,IPv4 的版本号即4
  • 首部长度:IP首部的大小,单位为4字节
  • 区分服务(TOS):用来表示服务质量,IP 协议本身是一种尽力服务的协议,无法保证通信质量,但是近年来随着音视频服务对实时性要求的提高,在使用 IP 通信过程当中保证服务质量的技术也有了蓬勃发展。DSCP 字段用于在通过 DiffServ 控制网络质量的时候设置包的优先级;ECN 则主要用于网络通信中的显式拥塞通知。
  • 总长度:IP首部与数据部分结合起来的总字节数,最大长度是65535。
  • 标识:用于 IP 包分片重组,不同分片标识值不同。
  • 标志:表示包被分片的相关信息。
  • 片偏移:用来标识被分片的每一个分段相对于原始数据的位置。以上三个字段用于 IP 包的分片与重组。
  • 生存时间:最初设计为网络包的有效时间,实际用于可以中转多少个路由器,每经过一个路由器,TTL值减1,直到为0则丢弃该包。
  • 协议:标识 IP 首部的上一层首部隶属于哪个协议,比如 TCP 或 UDP
  • 首部校验和:只校验数据报的首部,不校验数据部分,主要用来确保 IP 数据报不被破坏。
  • 源地址:发送端 IP 地址。
  • 目标地址:接收端 IP 地址。
  • 可选项:通常在实验或诊断时才使用。
  • 填充:在有可选项的情况下,首部长度可能不是32位的整数倍,通过向该字段填充0,将其调整为32位整数倍,以方便计算机进行处理。
  • 数据:传输的具体数据(并不是首部的一部分)。

可以试试通过 WireShark 对网络请求进行抓包,就可以看到对应的 IP 首部信息了:

在实际通信中,仅凭 IP 协议还不够,还要借助众多支持 IP 协议的相关技术才能更好地实现最终通信。

IP 域名与 IP 地址是如何映射的

以 Laravel 学院为例,域名是 laravelacademy.org,其中 laravelacademy 表示 Laravel 学院的固有域名,org 表示顶级域名,固有域名和顶级域名通过.分隔,有的网站还细分出二级域名,比如腾讯视频的网站是 v.qq.com,我们可以将 v 称作二级域名。

  • 根 DNS 服务器:返回顶级域 DNS 服务器的 IP 地址
  • 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
  • 权威 DNS 服务器:返回固有域名对应主机的 IP 地址

每一个分层都设有 DNS 服务器,各层 DNS 服务器都了解该层以下分层中所有 DNS 服务器的 IP 地址,所有 DNS 服务器又都了解根 DNS 服务器的 IP 地址,以便在当前分层找不到映射的 IP 地址时,跳转到根 DNS 服务器从上往下继续查找。

进行 DNS 查询的主机或软件叫做 DNS 解析器,用户所使用的计算机或工作站就属于解析器,一个解析器至少需要注册一个以上 DNS 服务器的 IP 地址,通常,它至少包括组织内部的本地 DNS 服务器的 IP 地址:

DNS查询原理

  • 用户在浏览器中输入 www.baidu.com 访问百度首页,计算机会先从本地 hosts 文件或 DNS 缓存解析器中查询有无相应的 IP 地址映射记录,如果有的话直接返回,否则进入下一步;
  • 将域名发给本地 DNS 服务器(通过 DHCP 配置,一般由宽带运营商自动分配)进行查询,如果缓存中有记录则返回对应 IP 地址,否则进入下一步;
  • 将域名发给根 DNS 服务器进行查询,根 DNS 服务器不会直接解析域名,但是会返回查询域名对应顶级域名 DNS 服务器的 IP 地址,比如这里是 .com
  • 然后本地 DNS 服务器会到 .com 顶级域名服务器查询,顶级域 DNS 服务器会根据查询域名返回 baidu.com 对应的权威 DNS 服务器的 IP 地址;
  • 接下来,本地 DNS 服务器根据返回的权威 DNS 服务器的 IP 地址去对应的服务器(域名解析出处)进行查询,这一次就可以获取到 www.baidu.com 域名对应的 IP 地址了,拿到这个 IP 地址,就可以将其返回给对应的计算机。

上述流程走下来,还是很费劲的,所以不管是 DNS 解析器还是 DNS 服务器,都会将最新了解到的信息暂时缓存起来,这样,可以减少每次查询时的性能消耗。

IP 地址与 MAC 地址是如何映射的

通过 IP 地址获取 MAC 地址就需要借助 ARP,ARP 是一种地址解析协议,以目标 IP 地址为条件,来定位下一个应该接收数据包的网络设备的 MAC 地址,如果对应 MAC 地址不存在,意味着目标主机不在该网段内,接着通过 ARP 查找下一跳路由器的 MAC 地址。

ARP的工作原理

ARP 协议借助 ARP 请求和响应两种类型的包来确定 MAC 地址,以下是 ARP 请求和响应的一般流程:

  1. 主机 A 为了获取主机 B 的 MAC 地址,首先要通过广播发送一个 ARP 请求包,这个包中包含了想要了解其 MAC 地址的对应主机 IP 地址(即主机 B 的 IP 地址),由于广播包可以被同一链路上的所有主机或路由器接收,因此 ARP 的请求包就会被这个链路上的所有主机和路由器进行解析,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,这个节点就将自己的 MAC 地址塞入 ARP 响应包返回给主机 A。有了 IP 地址和 MAC 地址,就可以完成链路内的 IP 通信。
  2. 为了降低网络流量,提高通信效率,发送 ARP 请求包的主机会把获取到的 MAC 地址缓存一段时间,IP 地址与 MAC 地址映射关系表叫 ARP 缓存表,每执行一次 ARP,对应的缓存表内容

IP地址与MAC地址对比

整个互联网其实就是通过路由器将一个个网段连接起来,同一个网段(链路)内通过 MAC 地址即可通信,但是跨网段的通信需要通过 IP 地址,如果没有 IP 地址,仅仅通过 MAC 地址无法知道节点所处的位置(没有网络地址部分),就需要向全网发送数据包,可想而知这将会造成多大的网络流量,而且维护这个 MAC 地址的缓存表也非常庞大。所以,在互联网通信中,IP 地址和 MAC 地址缺一不可,于是就有了将这两个地址相关联的 ARP 协议。另外,有些时候我们可能还需要反过来通过 MAC 地址获取 IP 地址,相应的协议是 RARP。

下面是一个跨网段的网络请求根据 IP 地址和 MAC 地址最终到达目标主机的流程图:

如上所述,在整个过程中,IP 头没有变动,而数据链路帧头(MAC头)里的目标 MAC 地址随着链路的变动而变动,从而将网络包一步步转发到目标主机,完成整个通信。


原文来自Laravel学院君