xiaolin coding 图解网络笔记——IP 篇
1. IP 基本认识
IP 在 TCP/IP 模型中的第三层,网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
MAC(数据链路层)的作用是【直连】的两个设备之间的通信,而 IP 复杂在【没有直连】的两个网络之间进行通信传输。
在网络中的数据包传输中,源 IP 地址和目标 IP 地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化。
2. IP 地址的基础知识
在 TCP/IP 网络通信时,每个设备都需要配置正确的 IP 地址,IP 地址(IPv4 地址)由 32
位正整数来表示,这是计算机的二级制表示,人类为了方便记忆采取点分十进制的标记方式:
3. IP 地址的分类
最大主机个数就是主机号个数减 2,因为有两个 IP 地址是特殊的,分别是主机号全 0 或者 全 1,主机号全为 1 指定某个网络下的所有主机,用于广播,主机号全为 0 指定某个网络。
广播地址用于在同一个链路中相互连接的主机之间发送数据包,广播地址可以分为本地广播和直接广播两种,在本网络内广播叫做本地广播,在不同网络之间的广播叫做直接广播
D、E 类地址是没有主机号的,D 类常被用于多播(将包发送给特定组内的所有主机),E 类是预留的分类暂未使用。
IP 分类的优点是简单明了、选路(基于网络地址)简单,缺点是同一网络下没有地址层次,不能很好的与显示网络匹配,因为 C 类最大主机数量太小了,而 B 类的同一网络下的主机数量又太多了。
4. 无分类地址 CIDR
由于 IP 分类存在许多缺点,所以提出了无分类地址,即 CIDR
,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。
表示形式为a.b.c.d/x
,其中/x
表示前 x 位属于网络号,x 的范围是 0 ~ 32
,这就使得 IP 地址更加具有灵活性。
比如 10.100.122.2/24,就表示前 24 位是网络号,剩余的 8 位是主机号。
还有一种划分网络号与主机号形式,那就是子网掩码,意思就是掩盖掉主机号,剩余的就是网络号,将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
为什么要分离网络号和主机号?
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同,路由器寻址工作就是通过这样的方式找到对应的网络号,进而把数据包转发给对应的网络内
怎么进行子网划分?
子网掩码可以划分出网络号和主机号,还有一个作用就是划分子网,子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址
相当于,在原始网络位数确定后,通过增加子网掩码的1的部分可以进一步划分子网网络地址和子网主机地址,图中就是子网掩码从 255.255.255.0 变成了 255.255.255.192,主机号的两位因此变成了子网网络地址,原始网络中就有 4 个子网。
5. 公有 IP 地址与私有 IP 地址
在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址,公有 IP 地址是由 ICANN
组织管理,在中国是由 CNNIC 的机构进行管理。
6. IP 地址与路由控制
IP 地址的网络地址这一部分是用于进行路由控制。路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应地下一个路由器。如果路由控制表中存在多条相同网络地址的记录,选择最长匹配。
计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址,与该地址具有相同意义的是一个叫做 localhost
的主机名,使用这个 IP 活主机名时,数据包不会流向网络。环回地址是在同一个计算机的程序间进行网络通信时使用的默认地址。
7. IP 分片与重组
每种数据链路的最大传输单元MTU
都是不同的,因为其使用目的不同,可承载的 MTU 也就不同,最常见的以太网是 1500
字节,由于 TCP 有超时重传,所以引入了 MSS
在 TCP 层进行分片而不由 IP 层分片,对于 UDP 尽量不要发送大于一个 MTU
的数据报文。
8. IPv6 基础认识
IPv4 是 32 位,大约可以提供 42 亿个地址,但是早就被分配完了,IPv6 是 128 位,可分配地址变多了。
此外,IPv6 可自动配置,自动分配 IP 地址;包头包首部长度采用固定的 40 字节,去掉了包头校验和,大大提高传输的性能;提升了安全性。
IPv6 是 16 位为一组,每组用冒号:隔开。
IPv6 的地址主要有以下类型地址,单播地址,用于一对一的通信,组播地址,用于一对多的通信,任播地址,用于通信最近的节点,没有广播地址。
9. IPv4 首部与 IPv6 首部
IPv6 相比 IPv4,取消了首部校验和字段,因为在数据链路层和传输层都会校验;取消了分片/重新组装相关字段,不允许中间路由器进行分片与重组,大大提高了路由器转发速度;取消选项字段,使得首部成为固定长度的 40 字节。
10. IP 协议相关技术——DNS
在上网的时候,通常使用的方式是域名,而不是 IP 地址,因为域名便于记忆,实现这一技术的就是 DNS 域名解析,DNS 可以将域名地址自动转换为具体的 IP 地址。
域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器
- 权威 DNS 服务器
任何 DNS 服务器都可以找到并访问根域 DNS 服务器,然后顺藤摸瓜找到目标 DNS 服务器,得到目标 IP 地址。
11. IP 协议相关技术——ARP
在传输 IP 数据报时,通过主机【路由表】确定 IP 数据包下一跳的 IP 地址,然后通过 ARP 协议,求得下一跳的 MAC 地址,ARP 是借助 ARP 请求与 ARP 响应两种类型的包来确定 MAC 地址,具体来说,主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址,然后同个链路中的所有设备收到 ARP 请求时,会拆开 ARP 请求包里的内容,如果包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。
RARP 协议与 ARP 协议相反,是已知 MAC 地址求 IP 地址,例如将打印机服务器等小型嵌入式设备接入到网络,通常这需要架设一台 RARP
服务器,在这个服务器上注册设备的 MAC 地址,然后再将设备接入到网络,最后设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。
12. IP 协议相关技术——DHCP
DHCP 在生活中很常见,我们的电脑通常是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程,具体步骤如下:
- DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号。
- 客户端首先发起 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 交互中,全程都是使用 UDP 广播通信。
因此,为了解决 DHCP 服务器和客户端不在同一个局域网内,路由器不会转发广播包,所以出现了 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理
- DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
- 服务器端收到该包后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端。
因此, DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理 IP 地址。
13. IP 协议相关技术——NAT
由于 IPv4 的地址是非常紧缺的,尽管有无分类地址减缓其耗尽的速度,但是依然有耗尽风险。于是提出了一种网络地址转换 NAT 的方法,再次缓解了 IPv4 地址耗尽的问题。
简单来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。但是这种普通转换没什么意义,由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的,因此可以把 IP 地址 + 端口号一起进行转换。
这样,就用一个全球 IP 地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT。
如图,客户端 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 连接都将被重置。
解决的方案是,改用 IPv6,自然就不需要地址转换了;NAT 穿透技术,NAT 穿透技术能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目。也就是说,在 NAT 穿透技术中,NAT 设备后的应用程序处于主动地位,能够自己建立端口映射条目,然后对外通信。
14. IP 协议相关技术——ICMP
ICMP 全称是 Internet control message protocol,也就是互联网控制报文协议。
ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
在 IP
通信中如果某个 IP
包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。
ICMP 大致可以分为两大类:查询报文类型 和 差错报文类型。
15. IP 协议相关技术——IGMP
ICMP 和 IGMP 一点关系都没有。
IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间
16. ping 的工作原理
同个子网下的主机 A 和主机 B,主机 A 执行ping
主机 B 后,源主机首先会构建一个 ICMP 回送请求消息数据包。
ICMP 数据包内包含多个字段,最重要的是两个:
- 第一个是类型,对于回送请求消息而言该字段为
8
; - 另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。
每发出一个请求包,序号会自动加 1
。为了能够计算往返时间 RTT
,它会在报文的数据部分插入发送时间。
然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 1
表示是 ICMP
协议,再加上一些其他控制信息,构建一个 IP
数据包。
接下来,需要加入 MAC
头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP
协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本地的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机 B
收到这个数据帧后,先检查它的目的 MAC 地址,并和本地的 MAC 地址对比,如符合则接收,否则丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B
会构建一个 ICMP 回送相应信息数据包,回送响应数据包的类型字段为 0
,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。
在规定的时间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。
因此可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8)和 ECHO REPLY(类型为 0)。