前言
IP协议,可谓是程序猿必备的基础功之一,这不仅仅是因为IP协议为面试的常客,更是因为IP协议为整个网络协议中最重要、最常被人接触的一种协议。例如IP地址就几乎为所有人所熟知的一种概念,无论是浏览网页、聊天、打游戏,都离不开IP地址,想必这也说明了其重要性了吧。掌握IP协议不仅能够让你在面试脱颖而出,更能提高你的作为程序员的内功,学习IP协议刻不容缓,从现在开始!!!
IP协议基础
概念
IP协议是一种不可靠的网络传输协议 ,对于数据的传输只是尽力而为,主要负责将数据传输到网络中唯一标识的目的地址。IP协议工作在TCP/IP模型中的网络层,负责为数据包分配源IP和目的IP,并将选择合适的路由将数据传输到目的地。
IP协议分为IPV4与IPV6,IPV6是用于解决IPV4地址耗尽问题而被设计出来的终极解决方案,但因为IPV6与IPV4兼容性不好,难以推广,所以当今主流的版本还是IPV4.
IP的报文格式
下图为IP的报文格式。
cpp
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 4位版本 | 4位首部长度 | 8位服务类型(TOS)| 16位总长度 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16位标识 | 3位标志 | 13位片偏移 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 8位生存时间(TTL) | 8位协议 | 16位首部校验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32位源IP地址 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32位目的IP地址 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项 | 填充 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据报 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
版本:用于标识IP协议版本,如:IPV4则为4,IPV6则为6
-
首部长度:用于计算报头长度,计算方式为:首部长度 * 4
-
服务类型:一般服务有:最小延时、最大吞吐量、最高可靠性、最小成本。
-
总长度:IP数据报的总长度。
-
16位标识:用于标识报文的唯一性,当报文被分片时则分片的标识都一致
-
3位标识
- 第一位:用于保留,暂时不使用
- 第二位:标识为1则表示禁止IP数据报分片
- 第三位:标识为1则表示数据报分片了,为0表示数据数据之后没有分片了
-
13位片偏移:用于标识分片的数据在原数据的位置,计算方式为
-
8位生存时间:用于标识数据最多能经过多少次路由转发,最多经过为255个路由转发。
-
8位协议:用于标识上层的协议,为TCP则交付给上层TCP协议...
-
16位首部校验和:用于检验是否头部是否损坏
IP地址
子网掩码
一个IP地址被划分成网络号与主机号,子网掩码是用于区别IP地址中网络号与主机号的手段,子网掩码通过与IP之地进行按位与来区别主机地址与网络地址。
工作原理:
子网掩码 | CIDR表示法 | 可用主机数 | 描述 |
---|---|---|---|
255.0.0.0 | /8 | 16,777,214 | A类地址,超大规模网络 |
255.255.0.0 | /16 | 65,534 | B类地址,大规模网络 |
255.255.255.0 | /24 | 254 | C类地址,中小规模网络 |
255.255.255.128 | /25 | 126 | 子网掩码用于划分更小的子网 |
255.255.255.192 | /26 | 62 | 更小规模的子网 |
例子:
cpp
192.168.1.128/26 // 十进制
11000000.10101000.00000001.10000000/26 // 二进制
11111111.11111111.11111111.11000000 // 掩码
// 主机号范围:
192.168.1.129 ~ 192.168.1.190
// 网络地址:
192.168.1.128
// 广播地址:
192.168.1.191
//计算过程:
根据最后6位掩码得出:可用主机地址数为63个。除去网络地址与广播地址则为61个。
IP地址分类
IP地址分为4类地址:
- A类地址:0.0.0.0/8 ~ 127.0.0.0/8 为A类地址, 主机位有24位
- B类地址:128.0.0.1/16 ~ 191.255.0.0/16 为B类地址,主机位有16位
- C类地址:192.168.0.0/24 ~ 239.255.255.0/24 为C类地址,主机位有16位
- D类地址:224.0.0.0 ~ 239.255.255.255 为D类地址,没有主机位,常用于多播。
特殊地址:
-
本地环回:127.0.0.0/8 的地址都为本地环回,数据只会在本机内传输
-
私网IP:私网IP指的是不会传入公网(互联网)的地址,设置之初用于本地网络的数据传输,私网IP有以下三类:
- 10.0.0.0~10.255.255.255 (10/8) :能够容纳 2 24 2^{24} 224 个主机,一般用于大型网络
- 172.16.0.0~172.31.255.255(172.16/12) : 能够容纳 2 20 2^{20} 220 个主机,一般用于中型网络
- 192.168.0.0~192.168.255.255(192.168/16) : 能够容纳 2 16 2^{16} 216 个主机,一般用于小型网络
-
广播地址 :广播地址指的是主机位全为1的地址,如:192.168.255.255/16。广播地址允许设备将数据发送给同一网络中全部的主机。
-
网络地址 :网络地址指的是主机为全为0的地址,如:192.168.0.0/16.网络地址用来标识所在子网的地址,用于确定IP所属网络。
IP协议工作原理
IP地址划分
当今世界上拥有70多亿人口,而IPV4地址使用32个bit位组成的,最多只能容纳42亿台主机,为了解决IPV4地址短缺的问题,世界各地的科学家们也是绞尽脑汁,最终得到了子网划分与NAT模式这两种最常用的解决方案。
子网划分
我们在前面已经了解了子网掩码,那么也该介绍子网掩码相关的子网划分了。世界上的网络分为4大类,但现实是我们不太可能会存在一个子网内存在数十万台主机的情况,直接使用A类、B类会造成极大的浪费,为了解决这种情况,子网划分技术被设计了出来。
工作原理
子网划分其实就是把主机号的一部分划分给网络号,让一个大的网络地址空间划分成若干个较小的、更容易管理的子网,从而提高网络地址空间的利用率与管理性。
可变掩码长度
子网划分通过掩码的确提高了网络的利用率,但实际上不是每个子网都需要如此大的主机范围。
例如:
- 部门A需要500台主机
- 部门B需要100台主机
- 部门C需要50台主机。
像这种情况子网掩码如果保持一致,那么子网划分的效率将会降低不少,于是为了继续提高IP地址的利用率,可变长度子网掩码(VLSM)又由此诞生。
NAT模式
尽管子网划分技术提高了网络IP地址的利用率,但IP地址的总量也还是不会改变,如果每台主机都分配一个IP地址,那么还是远远不够的,毕竟当今人口70亿,而IP地址只有40亿个。
此时NAT技术便应声而起,~公网IP不够,私网IP来凑~,NAT技术允许将主机私网地址转换成公网地址,从此NAT技术便成为最重要的解决IP数量不足的解决方案,以至于严重阻碍到IPV6的发展。
工作原理
NAT技术通过映射技术来实现私网到公网的转换,每个连接通过私网IP:端口->公网IP:端口的方式来进行映射,当端口有冲突时则随机选择一个端口。
NAT技术的小细节
-
TCP与NAT:使用TCP连接时,NAT服务器会在接收到FIN信号时删除映射关系,如果连接长时间无响应则一般在5分钟后删除映射条目。
-
UDP与NAT: 使用UDP连接时,NAT服务器会建立一个临时映射条目,如果连接长时间无响应则自动删除映射条目。
NAT的限制
- 无法直接访问位于NAT服务器后的主机。
- 映射条目的创建和销毁会损耗一定性能。
- 一旦NAT设备出现异常,所有的TCP连接都会断掉。
路由选择
IP协议不能仅凭自己就将数据发送到远端地址,为了将报文发送到合适的网络,IP报文需要交付给路由器,让路由器选择最适合的地址。
路由器中拥有着一种叫做路由控制表的数据结构,当IP报文被发送到路由器时,路由器会根据其路由控制表选择一个最匹配的IP地址,如果没有匹配的IP地址,则发送到默认路由。
路由选择类型
- 静态路由:需要管理员手动设置路由表。
- 动态路由:自动计算更新路由表。
IP相关协议
ICMP
无论你是否为一名程序猿,相信ping指令都多多少少有所了解,而这个ping指令便是利用了ICMP协议而实现的程序。ICMP协议是为了辅助IP协议而被设计出来的协议,因为IP协议无法确定远端IP地址是否存在,
工作流程
一般情况下,IP报文如果转发到路由器,发现目的IP地址不存在,那么路由器将会丢弃该IP报文,但如果IP报文封装上ICMP协议,则路由器将会把将错误原因返回填上到ICMP的报文中,并返回。
DHCP
DHCP是一种自动分配IP地址的协议,意在实现即插即用,也就是当设备连接上网络后,DCHP服务器(一般在路由器上)会自动为你分配一个闲置的IP地址,免除了每次添加设备都要分配IP地址的麻烦。
工作流程
-
发现阶段:首先发送一条广播信息(源ip:0.0.0.0, 目的ip:255.255.255.255)来发现DHCP服务器,DHCP发现信息后将返回一条DHCP提供包信息(包含可分配的IP、子网掩码、租约时间等).
-
请求阶段:客户端选择一个IP地址,并发送请求信息给DHCP服务器,表明接受服务。DHCP服务器收到信息后,发送一个DHCP确认信息给客户端,表明正式分配IP地址给客户端。
DNS
DNS是一种将域名转换为IP地址的协议,打比喻来讲DNS就像是手机中的电话簿,我们可以用名字来标明电话号码,这样我们便减少了通信的成本。
工作流程
-
发送请求:用户向DNS服务器查询域名对应的IP地址。
-
检查缓存:用户的请求会先发送到本地DNS服务器,DNS服务器会检查是否有该域名的缓冲,如果没有则递归查询。
-
递归查询:本地DNS服务器没有域名信息,则会向根DNS服务器查询,层层向上查询,类似于在树中递归查找。
-
返回结果:如果找到了结果则将结果返回给客户端。
总结
IP协议是一种不可靠的网络协议,主机需要访问互联网则必须要有公网IP,为了解决IP地址不足的问题,子网划分与NAT技术被发明了出来。为了更好的服务IP协议,像DNS、DHCP、ICMP等协议被设计出来,互联网技术的发展也离不开这些辅助的协议。