系列文章目录
【网络通信基础】网络中的常见基本概念
【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)
【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)
【网络原理】TCP协议的相关机制(确认应答、超时重传)
【网络原理】TCP协议的连接管理机制(三次握手和四次挥手)
目录
系列文章目录
IP协议
1. IP协议的协议头格式(报文结构)
2. 地址管理
2.1 IP地址的数量限制
a. 动态分配地址
b. NAT机制(网络地址转换)
c. IPv6
2.2 网段划分
2.3 特殊的IP地址
3. 路由选择
IP协议
网络这个模块中,已经介绍了传输层中的两个非常重要的协议,UDP协议和TCP协议。这次介绍网络层中最基础的协议——IP协议(以下出现的IP协议指的都是IPv4协议)。
TCP/IP协议族是一套整个网络体系最基础也是最核心的协议。IP协议作为TCP/IP协议族中的一部分,类似于TCP,IP协议也非常复杂。
作为后端开发的程序员,大概率会直接和TCP打交道,而IP协议是从事路由器、网关,防火墙等相关网络设备开发的人员更应该关注的,因此这里介绍的是IP协议比较基础的部分(后面的数据链路层也一样)。主要从两方面进行介绍:
- 地址管理:分配和管理 IP 地址,确保每个设备在网络中具有唯一的标识。
- 路由选择:确定数据包从源到目的地所经过的路径。
1. IP协议的协议头格式(报文结构)
先认识IP协议的报头,再分别介绍地址管理和路由选择的内容。
基本结构如下:
4位版本号: 标识IP协议的版本号,取值只有两种。在IPv4中,这个字段的值是4,IPv6中,则为6。
4位头部长度: 和TCP的类似,表示IP头部的长度,表示有多少个4字节。
8位服务类型: 用于指定数据包的优先级和处理方式,实际上只有4位有效。
- 前3位是优先权字段,已被标记为弃用;接下来4位是服务类型字段,分别表示最小延迟、最大吞吐量、最高可靠性和最小成本,在同一时刻,只能选择这四种状态之一;最后一位是保留字段,必须置为0。
16位总长度: 表示整个IP数据包的总长度,包括头部和数据部分。
- 看到这个字段,就想到和前面UDP一样有64KB的限制了,那如果构造一个非常大的TCP数据,IP是否就传输不了了?
- 虽然IP自身确实有长度限制,但是IP提供了拆包和组包这样的功能。因此,即使数据很大,在IP这一层会自动拆成多个IP数据包,每个IP数据包来携带一部分数据。但是,其实IP数据包的拆包并不是因为达到64K,而是在数据链路层还有限制(后面再说)。
- 拆包和组包,则和接下来的三个字段有关联。
16位标识:用于标识一个IP数据包及其片段。当一个大数据包被拆分成多个小数据包时,这些小数据包的16位标识都是相同的,这样接收端就可以根据这个标识将它们正确重组起来。
3位标志位:控制数据包的分片和重组。只有两位有效,其中1位标识这个包是否拆包了,还有一位表示最后一个拆的包的位置,即指示了结束位置。
13位片偏移:表示数据包片段在原数据包中的位置。这样,在接收端进行组包时,就可以根据这个位置顺序将小数据包正确重组起来,还原成原始的大数据包。
8位生存时间(TTL):指定数据包在网络中的最大存活时间,防止数据包无限制在网络中循环和传输。
- 需要注意的是,此处的单位并不是真正的时间单位,而是一个整数,表示“次数”。
- 每当一个数据包经过一个路由器或者节点时,TTL的值就会-1。如果TTL的值减到0了,那么该数据包就会被丢弃。
- 比如,如果指定的接收方IP地址,是一个错误的IP地址,就不能让这个数据包无限循环和传输下去,找到一定程度还没找到,就应该丢弃了。TTL在操作系统中的设置值都有所不同,例如,Linux通常为64或255,Windows通常是128,Windows 98则为32。
- 这些数值看起来都不大,实际上传输到地球的任何地方都够用了。因为路由转发的过程采用了高效的路由算法和路由表结构。通过Windows的一个命令 tracert,就可以看到当前网络通信的路径是怎样的。此处通过访问巴西政府官网来看当前网络通信的路径情况:
这里显示最多30个跃点跟踪,好像并没有访问到巴西政府官网,但是我们可以通过IP地址查询工具,看看每次到达哪个位置了。其中“请求超时”是因为有些设备关闭了“ICMP功能”,看不到详情,但是不影响tracert的执行。当看到延时较高可能就是已经出镜了,这里查询几个IP地址看看:
可以看到,第12次就已经到美国了,第15次就到达巴西。
8位协议:指示数据包承载的传输层协议,如TCP、UDP等。
16位头部校验和:用于验证头部的完整性。这里只针对IP的头部进行校验,是因为封装的过程中,IP数据包的数据部分是TCP/UDP数据包,它们都自带了校验和。
32位源IP地址和32位目的IP地址:即表示发送方的IP地址,和接收方的IP地址。
可选字段: 长度可变,允许附加额外信息。
数据部分: 可变长度,包含传输的实际数据。
2. 地址管理
IP地址(IPv4)本质上就是一个 32 位的整数,为了方便,就以点分十进制的方式表示。通过3个点,分成4个部分(十进制数)。每个部分 8 位,即一个字节,每个部分的取值范围是 0 到 255。
IP地址的存在,目的就是为了能够区分网络上的不同设备,希望每个网络设备都有唯一的一个IP地址。
但是,IPv4 地址的格式和长度(32位整数),就决定了其能够表示的唯一 IP 地址数量,即约为 42 亿个。
这个数字看起来很大,但是随着互联网的发展和普及,这个数量已经远远不够满足需求了,尤其是考虑到每个人都可能拥有多个设备连接到互联网。
IP地址不够用的问题,就显得十分严峻了。这一问题,早在互联网发展初期就被意识到,但在20世纪90年代末和21世纪初变得更加显著。解决这一问题也有了多种方案。
2.1 IP地址的数量限制
a. 动态分配地址
考虑到全世界的设备,并不会同一时刻都在上网,管理机构就可以通过重新分配,和回收未使用的IPv4地址来延长IPv4地址池的使用寿命。
但是这只是权益之计,并不能根本上解决问题。
b. NAT机制(网络地址转换)
先把IP地址分成两个大类:
- 私网IP(局域网IP):IP地址以 10.*,172.16-172.31.*,192.168.*,这三类都是数据私网(局域网)地址,这些地址在局域网内部是唯一的。
- 公网IP(广域网IP):上述剩下的就都是公网IP了。公网IP则是在全球范围内都是唯一的。
由于上述设定,就有一些重要的限制:
- 公网设备访问公网设备,可以直接访问。
- 局域网设备访问同一个局域网的设备,也可以直接访问。
- 局域网设备访问不同局域网的设备,不允许直接访问。
- 局域网设备访问公网设备,需要对局域网设备的IP地址进行地址转换。
- 公网设备访问局域网设备,需要对公网IP地址进行地址转换
NAT机制的主要作用就是实现私有网络地址与公网地址之间的转换。
- 当局域网内的设备需要访问Internet上的资源时,NAT机制会将私有IP地址转换为公网IP地址,以便设备能够与Internet上的其他设备进行通信。同时,当Internet上的设备访问局域网内的设备时,NAT机制也会将公网IP地址转换为私有IP地址,以确保数据能够正确地路由到目标设备。
NAT机制的实现通常依赖于路由器或NAT服务器等设备。
- 这些设备会维护一个映射表,记录私有IP地址与公网IP地址之间的映射关系。当数据包从内网发送到外网时,路由器会修改数据包的源IP地址,将其替换为路由器的公网IP地址;当数据包从外网发送到内网时,路由器会根据映射表将目的IP地址转换为相应的私有IP地址。
总的来说,NAT机制通过地址转换和映射关系的建立,有效地解决了IP地址不足的问题。同时,NAT机制也增强了网络的安全性,因为外部设备无法直接访问内部网络的私有IP地址。
c. IPv6
IPv6是用于替代IPv4的下一代IP地址,它从根本上解决了IPv4地址不足的问题。
- IPv4 使用 4 个字节(32位)表示IP地址,能提供约为42亿9千万个IP地址.
- IPv6 使用 16 个字节(128位)表示IP地址,能提供约340 亿亿亿亿个IP地址.
IPv6能为地球每一粒沙子提供IP地址,这句话已经很熟悉了,只要人类还在地球生存,IPv6是一定够用的。
尽管 IPv6 已经存在多年,但是 IPv4 仍然是互联网最广泛使用的协议,而 IPv6 要广泛应用还需要一些时间,原因主要有以下几个方面:
- 兼容性问题:IPv4和IPv6并不兼容(报头结构也存在区别),这意味着IPv6无法直接替换IPv4。因此,要想升级到IPv6则需要更换支持IPv6的设备。
- IPv6的设备和软件成本较高:IPv6的部署需要新的设备和软件,这些设备和软件的成本较高,对于大多数企业来说,是一个较大的阻碍。
- IPv4仍然可用:IPv4仍然是目前互联网的主要协议,因此,许多组织并没有足够的动力去升级到IPv6。
综上,就导致当前IPv6的推进节奏非常缓慢。尽管如此,我国对IPv6的普及率还是很高的。截至2023年5月,我国IPv6的活跃用户数量达到7.63亿,用户占比达到71.51%。
为了推动IPv6的普及和应用,我国政府出台了一系列政策和措施。例如,政府要求基础电信企业加快IPv6规模部署,提升IPv6网络服务质量,推动IPv6在各个领域的应用。此外,政府还鼓励企业加强IPv6技术创新和应用研发,推动IPv6产业链的发展。
这点还是很容易验证的,打开一些应用程序,如淘宝/支付宝等,它们的首页的最下面就会有一行小字:支持IPv6协议。
国家如此大力推动IPv6的发展,除了是为我国的互联网发展提供更好的基础和支持外,还有一部分政治原因,具体的原因,真诚建议大家一定一定去看看下面这个视频,里面也有大量介绍计算机网络相关的基础知识:
电子监听、全国断网,棱镜门背后,中国如何从末路狂奔到世界之巅https://www.bilibili.com/video/BV1i14y157YV/?spm_id_from=333.337.search-card.all.click&vd_source=a3aa6ca18f9b64b%E2%80%A6
2.2 网段划分
一个IP地址分为两个部分,网络号和主机号。
- 网络号:保证相互连接的两个网段具有不同的标识。
- 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
在同一个局域网内,网络号(前半部分)都是相同的,主机号(后半部分)都是不同的。
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。
但是手动配置IP地址,是一件相当麻烦的事。并且我们也能发现,我们从来没有手动配置过IP地址,但是仍然能够上网。
- 这其实得益于一个技术,叫做DHCP,能够自动的帮我们配置局域网的IP地址。
- 一般的路由器都带有DHCP功能,因此路由器也可以看做是一个DHCP服务器。
哪些部分是网络号,哪些部分是主机号,则是通过子网掩码的方式来区分的。
子网掩码和IP地址一样,也是一个32位的二进制数,子网掩码中,1表示对应的IP地址位是网络号,0表示对应的IP地址位是主机号。子网掩码总是前面一段全是1,后面一段全是0,不会出现1和0交替出现的情况。
例如,子网掩码为255.255.255.0,则表示前3个字节是网络号,后1个字节是主机号,这也是家用宽带默认的子网掩码。
注意几点:
- 在同一个局域网中,网络号一定是相同的,如果主机号相同,是无法上网的。
- 如果该局域网的一个设备,网络号和路由器的网络号不相同,同样是无法上网的。
- 两个相邻的局域网,网络号不能相同。原因是相邻的局域网如果使用相同的网络号,那么它们会被视为同一个网络,导致通信混乱和数据传输错误。
子网掩码是现在使用的网段划分方案,过去使用的网段划分方案则把所有IP地址分为五类,如下图所示:
- A类 0.0.0.0到127.255.255.255
- B类 128.0.0.0到191.255.255.255
- C类 192.0.0.0到223.255.255.255
- D类 224.0.0.0到239.255.255.255
- E类 240.0.0.0到247.255.255.255
随着互联网的飞速发展,这种划分方案的局限性也很快显现出来,大多数组织申请B类网络地址,导致B类地址很快就分配完了。
而A类地址的主机号有24位,就导致A类地址的局域网能容纳的设备数量约 2^32。实际上没有这么大的局域网,能包含这么多主机,因此大量的IP地址就都被浪费了。
针对这种情况,大佬们提出了新的划分方案,称为CIDR(Classless Interdomain Routing),也就是前面所说的通过子网掩码的方式进行网段划分。
2.3 特殊的IP地址
- 127.* 的IP地址都是环回地址,用于本机环回测试,通常使用127.0.0.1。
- IP地址的主机号(主机地址)为全0,表示“这个网段”,也就是该局域网。
- IP地址的主机号(主机地址)为全1,表示“广播地址”,使用广播地址发送信息,局域网中的所有设备都会收到(必须使用UDP协议,TCP不支持广播)。
这里的主机号全1或者全0,指的是二进制比特位。例如最后一个字节表示主机号的情况,错误示例:192.168.0.111;正确示例:192.168.0.255。
除去这两种情况后,最后一个字节表示主机号,实际能分配的最多为254个。但是这里还有例外,很多路由器,在配置的时候,会有一个配置项,分配IP地址的范围,实际可用的主机号还会更少。
3. 路由选择
路由选择:确定数据包从源到目的地所经过的路径(规划路线)。
网络结构非常复杂,每个路由器无法掌握全局的信息,会根据当前网络状态等进行路由选择。因此,路由器规划出来的线路,是一个“较优解”,并不是绝对最优解。
例如,使用现在的导航软件进行导航,导航软件会给出多种方案,在这种情况下,最优解也是取决于多种因素的:
-
最快路线:导航软件可能会提供一条被认为是最快的路线,根据实时交通状况和历史数据计算得出。然而,这条路线可能并不是最适合你的需求,因为它可能会经过拥堵区域或高速公路收费站。
-
最短路线:另一方面,导航软件可能会提供一条被认为是最短的路线,即使这条路线可能需要经过一些小路或者交通相对繁忙的地区。
-
景观路线:有时,导航软件可能会提供一条风景优美的路线,虽然它可能比其他路线慢一些,但能够为你提供更愉悦的驾驶体验。
IP数据包的传输过程和问路是类似的:
- 当IP数据包,到达路由器时,路由器会先查看该数据包的目的IP;
- 路由器判断这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器:
- 依次反复,知道到达目的IP地址.
判定当前这个数据包要发送到哪里的依据,就是依靠每个路由器或交换机内部维护的一个路由表。这是路由器或交换机等网络设备上的一个重要的数据结构,它存储了网络中可达目的地的信息以及如何到达这些目的地的路由信息。
一个路由表通常包含:目的网络地址,下一跳地址,出跳口等内容。
路由表可以由网络管理员手动配置并维护(静态路由),也可以通过一些路由表生成算法自动生成(动态路由)