5.1 IP 基础知识全家桶
IP 基本认识
IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。
网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。
类似于从一个地方到另一个地方,IP是这两个地方的地址(跨越链接,去往途中不会发生变化),MAC是你在每个路口需要往哪个方向走(直连,会随着路线的移动不断发生变化)
IP 地址
IPv4: 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。
32位最大允许 43 亿台计算机连接到网络。
但IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。
会根据一种可以更换 IP 地址的技术 NAT,使得可连接计算机数超过 43 亿台。
IP 地址的分类
IP 地址分类成了 5 种类型:
- A 类:0开头,后七位网络号,最后24位主机号
- B 类:10开头,后14位网络号,最后16位主机号
- C 类:110开头,后21位网络号,最后8位主机号
- D 类:1110开头,后28位组播地址
- 组播:用于将包发送给特定组内的所有主机(路由不会不转发)
- E 类:1111开头,后28位待定
- 类别判定
- 第一个是0则是A类,否则
- 第二个是0则是B类,否则
- 第三个是0则是C类,否则
- 第四个是0则是D类,否则
- 第五个是0则是E类
- 每一类IP有两个IP是特殊的
- 主机号全为1,指定某个网络下的所有主机,用于广播,分为两类:
- 本地广播:全1的网络地址,255.255.255.255,通常在不知道网络号的情况下发送(通常计算机启动时,希望从网络IP地址服务器DHCP处获得一个IP地址)。不会通过路由**
- 直接广播:指定网络号,主机号全1,通常用于当主机需要寻找网络中的邻居时,发出直接广播包(可能会有安全问题,会在路由器上设置为不转发)。会通过路由
- 主机号全为0,指定某个网络
- 主机号全为1,指定某个网络下的所有主机,用于广播,分为两类:
- 缺点:1、一个类别中地址没有层次,2、A类IP主机量太多,C类IP主机量太少
无分类地址 CIDR
舍去地址分类,直接通过子网掩码区分网络号和主机号,比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
区分网络号和主机号位了判定当前通讯两台主机是否在同一个网络地址内,如果是就可以不通过路由
子网掩码还有一个作用,那就是划分子网:将主机地址分为两个部分:子网网络地址和子网主机地址。即 ip 地址构成:网络地址+(子网网络地址+子网主机地址)
假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。
C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知从 8 位主机号中借用 2 位作为子网号,就有四个字网
公有 IP 地址与私有 IP 地址
在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。

平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的。
公有 IP 地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买一个公有 IP,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一。

私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN 组织管理,中文叫「互联网名称与数字地址分配机构」。
IP 地址与路由控制
IP 地址的网络地址这一部分是用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
环回地址是不会流向网络
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。
计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。
IP 分片与重组
以太网的 MTU(Maximum Transmission Unit 最大传输单元) 是 1500 字节。当 IP 数据包大小大于 MTU 时,IP 数据包就会被分片。
经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。
假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。
在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU 的数据报文。
IPv6 基本认识
IPv6: 128 位,是以每 16 位作为一组(通常16进制表示),每组用冒号「:」隔开。出现连续的 0 时还可以将这些 0 省略,并用两个冒号「::」隔开。只能出现一次两个连续冒号,否则无法确定具体的IPv6地址
可分配的地址数量是大的惊人, IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。
IPv4 和 IPv6 不能相互兼容,所以需要设备支持,还需要网络运营商对现有的设备进行升级,所以普及率比较慢。
优势:
地址多
IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配 IP 地址,真是便捷到即插即用啊。
IPv6 包头包首部长度采用固定的值
40字节- 1、去掉了包头校验和,因为传输层和数据链路层也会校验
- 2、不允许在中间路由器进行分片与重组,只能在源主机和目标主机进行,提高路由转发速度
IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
... (由你发现更多的亮点)
IPv6 的地址主要有以下类型地址:
- 单播地址,用于一对一的通信
- 组播地址,用于一对多的通信
- 任播地址,用于通信最近的节点,最近的节点是由路由协议决定
- 没有广播地址
IP 协议相关技术
DNS
DNS 域名解析:将域名网址自动转换为具体的 IP 地址。
- 域名层级,越靠右的位置表示其层级越高,如
.com、.cn就是顶级域 - 根服务器
.> 顶级服务器.cn等 > 权威服务器server.com等 > 本地服务器- 根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器。
- 每个ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器,其实就是一个缓存作用,严格来说不属于这个行列内。
- URL中有:
- 协议:一般是http或者https
- 域名:解析IP地址用
- 端口:默认http为80,https为443
- 资源路径:域名(端口)后面紧接着的,第一个
/开始的,是服务器上的资源路径 - 参数:一般是对于get请求,通过
?拼接,用 & 连接不同参数,使用key=value进行表示 - 锚点:要访问的页面大部分都多于一页,其定位作用,相当于一个小书签,以
#开头,并且不会作为请求的一部分发送给服务端。
解析流程如下:
- 首先会在本地的hosts列表查找,没有就会进行域名解析
- 直接:请求本地DNS,如果有直接返回
- 没有,直接问根DNS,根DNS返回顶级域名 -> 然后问顶级DNS -> 问权威DNS得到IP地址
- 递归:请求本地DNS,如果有直接返回
- 没有,直接问根DNS,根DNS去问顶级DNS -> 顶级DNS问权威DNS得到IP地址,依次返回,这种对根DNS消耗过大,一般不用
- 这个 域名<->IP 对应关系多级缓存
- 浏览器自身缓存
- 操作系统缓存
- hosts文件缓存
- 本地DNS服务器缓存
- 当然这些缓存有过期时间
ARP
ARP(Address Resolution Protocol 地址解析协议)由IP地址解析MAC 地址。
通过 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的:
- 主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
- 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。
不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
RARP(Reverse Address Resolution Protocol 反向地址转换协议)正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到(无法使用DHCP或者没有任何输入接口的设备)。
DHCP
DHCP(Dynamic Host Configuration Protocol 动态主机配置协议) 在生活中我们是很常见的了,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。
- 客户端广播发起DHCP发现报文,目标地址全一,源地址全0
- DHCP服务器收到后发器DHCP提供报文响应,也是广播,包含IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期。
- 客户端收到一个或多个响应,选择一个发送DHCP请求报文,回显参数
- 服务器发送DHCP确认报文
- 一旦客户端收到 DHCP ACK 后,交互结束,客户端可以在租用期内使用 DHCP 服务器分配的 IP 地址。
- 快到期,客户端会像服务器发送请求续租的请求报文,服务器可以同意或者拒绝。
- DHCP 交互中,全程都是使用 UDP 广播通信。
DHCP 中继代理用来解决一个DHCP服务器在不同网段内统一管理IP地址,中继服务器进行向上(单播,服务器地址已知)和向下(广播,客户端没有IP地址)转发报文。
NAT
NAT(Network Address Translation 网络地址转换)用于缓解了 IPv4 地址耗尽的问题。
- 对称型NAT:内部 IP 和外部 IP 一对一转换
- 非对称型NAT:内部 IP 和外部IP 多对一转换
- NAPT(Network Address Port Translation 网络地址与端口转换):把 IP 地址 + 端口号一起进行转换可以实现一个公有IP绑定N个私有IP ,也是使用一个缓存转换表。
- 两者都称为 NAT 穿透
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
- 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
- 转换表的生成与转换操作都会产生性能开销。
- 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
可以使用以下方法解决:
- 改用 IPv6
ICMP
ICMP(Internet Control Message Protocol 互联网控制报文协议):确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP 大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」
读者问答
读者问题:“组播不太懂。。。假设一台机器加入组播地址,需要把 IP 改成组播地址吗?如果离开某个组播地址,需要 dhcp 重新请求个 IP 吗?”
组播地址不是用于机器 ip 地址的,因为组播地址没有网络号和主机号,所以跟 dhcp 没关系。组播地址一般是用于 udp 协议,机器发送 UDP 组播数据时,目标地址填的是组播地址,那么在组播组内的机器都能收到数据包。
是否加入组播组和离开组播组,是由 socket 一个接口实现的,主机 ip 是不用改变的。
