type
status
date
slug
summary
tags
category
icon
password
计算机网络系列(四):IP篇

IP基本概念

IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信
那么网络层与数据链路层有什么关系呢?
MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输
notion image
MAC只负责两个直连设备间的数据传输,当数据包在两台直连的设备上从一端传输到另外一端时,这时候源MAC地址就会被赋值当前的目标MAC地址(因为数据包已经传输到当前目标MAC地址了),而目标MAC地址就会被就会被赋值下一台直连设备的MAC地址。
所以数据包在两个远程主机间传输的过程中,源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标 MAC 一直在变化
IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以 「 . 」隔开,再将每组转换成十进制。
notion image

IP协议格式

notion image

IP地址的分类

最初设计互联网络时,为了便于寻址以及层次化构造网络,IP地址由 网络号主机号 两部分组成。同一个物理网络上的所有主机都使用同一个网络ID。
notion image
为什么要分离网络号和主机号?
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。
IP地址根据 网络号的不同 分为5种类型:A类地址B类地址C类地址D类地址E类地址。A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
notion image
  • A类IP地址:由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是 0。前八位取值范围是 [1,126],注意没有包括0和127。
  • B类IP地址:由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是 10。前八位取值范围是 [128,191]
  • C类IP地址:由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是 110。前八位取值范围是 [192,223]
  • D类IP地址:不分网络地址和主机地址,网络地址的最高位必须是 1110,用于多播。由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。多播用于将包发送给特定组内的所有主机。
  • E类IP地址:不分网络地址和主机地址,网络地址的最高位必须是 11110,用于保留实验。
各类IP地址对应的相关内容如下:
分类
前缀码
最高位范围
网络地址位数
主机地址位数
主机开始地址
主机结束地址
对应CIDR修饰
网络数
每个网络的主机数
默认子网掩码
A类地址
0
[1,126]
8
24
1.0.0.1
126.255.255.254
/8
126
16,777,214
255.0.0.0
B类地址
10
[128,191]
16
16
128.0.0.1
191.255.255.254
/16
16,384
65,534
255.255.0.0
C类地址
110
[192,223]
24
8
192.0.0.1
223.255.255.254
/24
2,097,152
254
255.255.255.0
D类地址(群播)
1110
[224,239]
未定义
未定义
224.0.0.1
239.255.255.254
/4
未定义
未定义
未定义
E类地址 (保留)
11110
[240,255]
未定义
未定义
240.0.0.1
255.255.255.254
/4
未定义
未定义
未定义

私有地址

ABC三种类型的网络有一部保留地址用来作为私有地址或内部地址,这些地址不能用于外网,因为他们不可路由。
  • A类私有地址:10.0.0.010.255.255.255
  • B类私有地址:172.16.0.0172.31.255.255
  • C类私有地址:192.168.0.0192.168.255.255

本机地址

IP地址 0.0.0.0 表示本机宿主机地址。

回环地址

127开头的地址,127.0.0.1127.255.255.255 属于网络测试地址,也称为 loop-back 回环地址。
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址,与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

网络地址

网络地址是指主机号全为 0,即网段下面第一个地址,指定识别某个网络。

广播地址

广播地址是指主机号全为1的地址,即网段下面的最后一个地址,用于同一个链路中相互连接的主机之间发送数据包。发向该地址的数据包会广播到网段内的所有设备。
计算分类地址最大主机个数
因为每个网段下的第一个地址(网络地址)和最后一个地址(广播地址)不能用于主机地址分配,所以我们得到关系:
  • 最大可容纳主机地址数 = 2 ^ 主机位数
  • 可用的主机地址数 = 最大可容纳主机地址数 - 2

无分类地址 CIDR

A、B、C类有个尴尬处境,就是不能很好的与现实网络匹配。C 类地址能包含的最大主机数量实在太少了,只有 254 个,而 B 类地址能包含的最大主机数量又太多了,一般中小企业用不到6万多台主机。所以后面提出了无分类地址的方案,即 CIDR
CIDR 不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于网络号,x 的范围是 0 ~ 32 ,这就使得 IP 地址更加具有灵活性。
比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
notion image

子网划分

网段和子网

比如某企业被分到一个B类网络号172.10.0.0,这个企业可以使用该网络号分配6万多台主机,这6万多台主机就处于同一个网段
但该公司还希望在网段内不划分出多个不同的小网络,不同的小网络分给不同的部门使用,这就需要用到子网划分的功能。
notion image
子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址。
  • 未做子网划分的 ip 地址:网络地址+主机地址
  • 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
子网划分需要用到子网掩码

子网掩码

子网掩码是连续的1和连续的0组成的32位地址。子网掩码不能单独存在,它必须结合IP地址一起使用。例如
notion image
在CIDR表示法里面,以上地址也可以表示为 x.x.x.x/24/24 表示掩码地址左边是24个1。
IP默认分配的子网掩码有:
  • A类的默认子网掩码:255.0.0.0 或者 /8
  • B类的默认子网掩码:255.255.0.0 或者 /16
  • C类的默认子网掩码:255.255.255.0 或者 /24
掩码的意思就是掩盖掉主机号,剩余的就是网络号。所以子网掩码的作用是将某个IP地址划分成网络地址和主机地址两部分
如果给定网络地址,子网掩码划分出来的网络地址位数比给定的网络地址要多,多出来的几个位就属于子网网络地址,所以子网掩码的另外一个作用是将某个IP地址划分成网络地址、子网网络地址和主机地址三部分

利用子网掩码计算网络地址

将子网掩码和 IP 地址按位计算 AND,就可得到网络地址
notion image

利用子网掩码划分子网

假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。
C 类地址中前 24 位是网络号,最后 8 位是主机号,子网掩码相当于 /26。根据子网掩码可知从 8 位主机号中借用 2 位作为子网号
notion image
由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11。所以被划分为四个子网:
  • 192.168.1.00000000 ~ 192.168.1.00111111
  • 192.168.1.01000000 ~ 192.168.1.01111111
  • 192.168.1.10000000 ~ 192.168.1.10111111
  • 192.168.1.11000000 ~ 192.168.1.11111111
notion image

IP相关技术

DNS

我们在上网的时候,通常使用的方式是域名,而不是 IP 地址,因为域名方便人类记忆。但我们的 IP 协议里面只能用 IP,所以需要将域名转成 IP 地址,实现这个过程的技术就是 DNSDNS 的作用是将域名网址自动转换为具体的 IP 地址
DNS的解析层级是一个树状结构
notion image
  • 根 DNS 服务器
  • 顶级域 DNS 服务器(com)
  • 权威 DNS 服务器(server.com)
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问 根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到 位于下层的某台目标 DNS 服务器。
DNS 的解析过程:
notion image

ARP

在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就需要确定 IP 数据包的下一跳 MAC 地址。但是我们主机的「路由表」中只能找到下一跳的 IP 地址,所以我们需要把下一跳的 IP 地址转换成下一跳的 MAC 地址。这就需要用到 ARP 协议。
ARP 协议的全称是 Address Resolution Protocol(地址解析协议),ARP 协议的作用是实现从 IP 地址到 MAC 地址的映射。ARP 协议在 IPv4 中极其重要。

ARP工作原理

ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的:
  • 主机会通过广播向同一链路的所有主机发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
notion image
  • 当同一链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。
notion image
如果目标主机不在同一个链路上,那么会查找下一跳路由器的 MAC 地址。

ARP缓存

如果每次查找 MAC 地址都需要经过广播 -> 封装 ARP 响应 -> 返回给主机这一系列流程,网络传输的效率会很低。这时候就需要 ARP缓存
每个主机和路由器上都有一个 ARP 缓存(或表)。这个缓存维护着每个 IP 到 MAC 地址的映射关系。通过把第一次 ARP 获取到的 MAC 地址作为 IP 对 MAC 的映射关系到一个 ARP 缓存表中,下一次再向这个地址发送数据报时就不再需要重新发送 ARP 请求了,而是直接使用这个缓存表中的 MAC 地址进行数据报的发送。每发送一次 ARP 请求,缓存表中对应的映射关系都会被清除。
notion image
通过 ARP 缓存,降低了网络流量的使用,在一定程度上防止了 ARP 的大量广播。不过 MAC 地址的缓存有一定期限,超过这个期限后,缓存的内容会被清除。

RARP

与 ARP 相对的,RARP(Reverse Address Resolution Protocol) 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议,将打印机服务器等小型嵌入式设备接入网络时会使用到。
通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接 入到网络,接着:
  • 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。
  • RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。

DHCP

当我们的设备连到局域网上的时候,需要被分配一个 ip 地址,如果每次都手动分配静态地址,难以保证这个 ip 地址不会和局域网内的其他设备冲突,所以我们需要一种动态管理 ip 地址的技术,而且必须要有一个服务器来集中管理,这就是 DHCPDHCP 的作用是在子网内对地址进行统一规划,分配和管理,以及租约,续租的动态管理
上面我们提到 RARP 技术也可以将 MAC 地址转换成 IP 地址,那么 RARP 和 DHCP 的区别是什么?
RARP只能实现简单的从MAC地址到IP地址的查询工作,RARP server上的MAC地址和IP地址是必须事先静态配置好的。但DHCP却可以实现除静态分配外的动态IP地址分配以及IP地址租期管理等等相对复杂的功能。
RARP是在数据链路层实现的,无法穿透子网,DHCP基于UDP协议,在应用层实现的,可以穿透子网。

DHCP 工作原理

使用 DHCP 协议需要先搭建一个 DHCP 服务器。我们的服务器通常内置 DHCP 服务器。
notion image
  • 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后 将帧广播到所有的网络中设备。
  • DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍 然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、 DNS 服务器以及 IP 地址租用期。
  • 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。
  • 最后,服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。 如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:
  • 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延⻓租期。
  • 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。
可以发现,DHCP 交互中,全程都是使用 UDP 广播通信。

DHCP 中继代理

那如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络 都要配一个 DHCP 服务器?
这种情况就需要 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也 可以由一个 DHCP 服务器统一进行管理。
notion image
  • DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
  • 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。

NAT

我们的设备在局域网内使用的时候,被分配的地址都是私有 IP 地址。当我们的设备需要和局域网外的其他主机进行通信的时候,需要把私有 IP 地址转换成公有 IP 地址,这就是 NAT 技术。
如果私有 IP 地址和公有 IP 地址的转换是一对一对应关系,我们现有的 ipv4 地址数量远远不能满足世界上的所有设备。由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的,我们可以把私有 IP 地址 + 端口号一起进行转换公有 IP 地址 + 端口号,这就是 NAPT 技术。

NAT/NAPT工作原理

notion image
两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的 本地端口都是 1025。转换之后两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。
最后会生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。这种转换表在 NAT 路由器上自动生成。例如,在 TCP 的情况下,建立 TCP 连接首次握手时的 SYN 包一经发出,就会生成这个表。而后又随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。

NAT穿透

由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
  • 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
  • 转换表的生成与转换操作都会产生性能开销。
  • 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
这些问题的根源是转换表。如果我们有一种技术让局域网内的设备不依赖转换表就可以把私有地址转换成公有地址,就可以解决这些问题,这就是NAT穿透技术。
在NAT穿透技术下,客户端可以主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设 备的公有 IP,并为自己建立端口映射条目,然后用这个条目对外通信, 就不需要 NAT 设备来进行转换了。

ICMP

网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,我们需要获得反馈报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。这就需要 ICMP 协议。
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。例如在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。

ICMP工作原理

notion image
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在, 这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。

ICMP协议格式

从 ICMP 的报文格式来说,ICMP 是 IP 的上层协议。但是 ICMP 分担了 IP 的一部分功能,一般我们把 ICMP 当作和 IP 协议同层的网络层协议
ICMP 报文被封装成 IP 数据包。在 IP 数据包中如果协议类型字段的值是 1 的话,就表示 IP 数据是 ICMP 报文。IP 数据包就是靠这个协议类型字段来区分不同的数据包的。
notion image
ICMP 包头的类型字段,大致可以分为两大类:
  • 一类是用于诊断的查询消息,也就是「查询报文类型」
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型」

查询报文类型

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息, ping 命令 就是利用这个消息实现的。
  • 回应请求消息,类型为 0
  • 回应应答消息,类型为 8
notion image
notion image
相比原生的 ICMP,这里多了两个字段:
  • 标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符;
  • 序号:序列号从 0 开始,每发送一次新的回送请求就会加 1,可以用来确认网络包是否有丢失。
在选项数据中, ping 还会存放发送请求的时间值,来计算往返时间,说明路程的⻓短。

差错报文类型

常见的差错报文类型有:
  • 目标不可达消息,类型为 3
  • 原点抑制消息,类型为 4
  • 重定向消息,类型为 5
  • 超时消息,类型为 11
目标不可达消息
IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个目标不可达的 ICMP 消息,并在这个消息 中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。代码类型:
  • 网络不可达代码为 0
  • 主机不可达代码为 1
  • 协议不可达代码为 2
  • 端口不可达代码为 3
  • 需要进行分片但设置了不分片位代码为 4
原点抑制消息
在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息。收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵 的情况。然而,由于这种 ICMP 可能会引起不公平的网络通信,一般不被使用。
重定向消息
如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机。在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。
超时消息
IP 包中有一个字段叫做 TTL ( Time To Live ,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。此时,路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。

查询报文的应用——ping

ping的原理就是基于 ICMP 协议的查询报文:类型为8的回送请求消息和类型为0的回送应答消息。
notion image

差错报文的应用——traceroute

有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute
traceroute 的第一个作用是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。它的原理就是利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息。工作流程:
  1. 将 TTL 设置 为 1 ,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超 时。
  1. 接下来将 TTL 设置为 2 ,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据 包,如此往复,直到到达目的主机。
  1. 继续重复,traceroute 就可以拿到了所有的路由器 IP。
traceroute 的第二个作用是故意设置不分片,从而确定路径的 MTU。因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以 外网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。工作流程:
  1. 首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由 器不会对大数据包进行分片,而是将包丢弃。
  1. 随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分 片但设置了不分片位」。
  1. 发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU 值,以便来达到目标主机。
Elasticsearch系列:入门基础计算机网路系列(三):TCP篇
mcbilla
mcbilla
一个普通的干饭人🍚
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉欢迎来到飙戈的博客🎉
-- 感谢您的支持 ---
👏欢迎学习交流👏