目录
一、IP协议的概念
二、IP协议的报头
(一)IP协议报文的封装、解包和分用
(二)8位生存时间
(三)IP分片
三、IP协议的网段划分
(一)为什么需要网段划分
(二)划分方法
1、基于IP地址分类的静态划分
2、动态子网划分CIDR
四、特殊的IP地址
五、解决IP地址的数量限制
六、公网IP与私有IP
(一)NAT技术
(二)NAPT技术
(三)NAT技术的缺陷
七、路由及路由表
一、IP协议的概念
IP协议是互联网中的核心协议,属于TCP/IP体系中的网络层协议,其核心功能是是实现异构网络的互联互通,通过统一的规则解决不同物理网络之间的通信问题。
IP地址为目标网络中的一台目标主机的逻辑地址,其主要解决异构网络中网络互联时的寻址问题。
二、IP协议的报头
版本:标识 IP 协议版本;
首部长度:标识 IP 首部长度(单位4字节),无选项时最小为5;
服务类型:定义数据报优先级和服务质量,如低延迟、高吞吐量;
总长度:整个IP数据包的总字节数;
标识:唯一标识数据报,用于分片重组;
标志:第一位保留、第二位DF用于表示是否禁止分片、第三位MF用于表示更多分片;
片偏移:分片数据在原数据包中的偏移量;
生存时间:限制数据包经过的最大路由器跳数;
协议:用于表示上层协议类型;
首部校验和:校验 IP 首部完整性;
源IP地址:发送方的 IPv4 地址;
目的IP地址:接收方的IPv4地址;
选项:可选扩展功能,现代网络极少使用;
数据:承载的上层协议数据;
(一)IP协议报文的封装、解包和分用
当上层应用层的数据交付给网络层时,由操作系统在该数据前封装 IP 协议首部并填写相应的内容完成封装。
当网络层收到数据链路层交付的数据时,首先会读取第1个字节的低4位获取4位首部长度字段,再读取IP协议首部中16总长度字段获取整个报文长度(暂不考虑IP分片),其中4位首部长度单位为4字节,而16位总长度字段单位为1字节。当获取到首部长度和总长度后即可获取数据长度,即可完成解包。
通过IP协议首部的8位协议则可知道将数据交付给上层具体哪个协议进行数据处理。
(二)8位生存时间
在网络传输中,报文一旦发出便不再受主机的控制,报文会在一一个个路由器中进行传递,而报文传输的路径选择也由路由器控制。因此如果某些网段中路由器出现些问题可能会导致报文传输出现环路转发等问题,如果没有生存时间字段,那么这条报文会一直在环路中转发,消耗网络资源。
因此引入生存时间,实际是规定了IP数据报最大跳数,与时间无关,也就是经过路由器的最大个数,当该字段减少至0时会被路由器丢弃掉该报文.一般Linux下该字段默认值为64.
(三)IP分片
在上节传输层我们提到TCP协议的滑动窗口中,并不是一股脑地把窗口内的数据一次性全部发送出去,因为下层数据链路层MAC帧的最大帧长度为1500字节,因此向下交付的数据不能过大。
那么如果传输层依然向网络层发送了很大的数据段,而传输链路层的数据帧数据部分最长1500字节,那么中间的网络层应该如何做呢?
面临以上情况,作为中间人的网络层实际采取的行为是:将上层交付的数据进行分片,当数据大小满足下层数据链路层的要求后即将数据交付给下层。
那么IP协议如何将报文进行分片呢?
除了将数据进行分割以外,还需要依靠IP数据报首部的16位标识、3位标志和13位片偏移字段。
当传输层交付的数据过大需要进行分片时,IP层首先将数据进行分割并填写相应的报头信息,其中被原始的数据报分配唯一的标识位,所有分片继承该标识,除了最后一个分片外,其他分片的标志位中的MF = 1,最后的标识位置0。置1表示后续还有分片,而置0表示后续没有分片即该数据报为最后一个分片。在分片的同时也需要填写片偏移大小,该字段用于表示该数据报的数据原处分配前数据的起始位置,其中除了最后一个分片以外,其他的分片的偏移量必须是8的整数倍。
例如:IP层收到数据3000字节,假定MTU(MAC帧最大长度)为1500字节,那么IP应该进行分片呢?
首先MTU是指得是MAC帧的数据部分最大为1500字节,而其数据 = IP首部 + IP数据,假定IP首部就为20字节,那么第一片IP数据报数据部分最大为1480字节,剩余1520字节,同样的,数据部分最高1480字节,因此第二片数据大小也为1480字节,剩余40字节为第三片数据部分大小。因此分片后的第一片MAC帧数据大小为1500字节(20+1480),第二片也同样为1500字节(20+1480),最后的大小为60字节(20+40)。
那么如何确认收到的报文是不是被分片后的报文?如何确定收到的报文是否完整呢?假如接受完整了那么如何将所有的IP分片组装起来呢?
当收到一个报文时,查看标志位的MF是否为1,若为1则说明该报文进行过分片操作并不是完整报文,若为0则需要查看该报文的偏移量,若偏移量不为0则说明该报文是被分片后的最后一个IP报文,若为0则说明该报文本身是个完整的报文;
当收到报文时,通过以上步骤即可验证该报文是否被分片,若没有进行分片该报文本身就是一个完整报文,若该报文进行过分片,需等到最后一个报文的到达。偏移量为数据处原始数据的起始地址,其中偏移量以8字节为单位,也就是IP报文起始地址(偏移量 * 8) + IP报文的数据部分长度 = 下一片IP报文的起始地址。因此当收到最后一个报文后,只需要将各个报文按偏移量大小进行排序,验证各个相邻报文之间的是否连续即可判断收到的所有分片报文是否完整。
再保证收到的分片报文完整后,只需要按照偏移量大小排序后进行解包组装后交付上层即可。
三、IP协议的网段划分
IP地址共32位,分为两个部分,网络号和主机号。
网络号:保证相互连接的两个网段具有不同的标识;
主机号:在同一网段内,主机之间的网络号相同,因此必须需要不同的主机号用于标识主机
(一)为什么需要网段划分
现如今入网的主机非常多,如果不进行子网划分的话,我们只能通过遍历去寻找目标主机,非常困难,进行网段划分将大型网络拆分为多个较小且相互逻辑隔离的子网,通过查询子网的网络号可以快速识别目标主机是否在该子网内,便于查找。此外进行网段划分也能提高IP地址的利用率,方便管理。
(二)划分方法
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类地址时,主机号为8位,也就是一个子网内最多可以有2^16 - 2个主机(主机号全0为网络号,全1为广播地址),但实际在使用时一个子网内可能并没有这么多台主机从而导致了大量的IP地址被浪费掉,因此引入了新方案——动态子网划分。
2、动态子网划分CIDR
引入一个额外的子网掩码来区分网络号和主机号。
- 子网掩码是一个32位的正整数,通过用一串“0”来结尾;
- 将IP地址和子网掩码进行按位与操作得到的结果就是网络号;
- 使用该方法进行划分便与静态划分无关。
通过子网掩码灵活定义网络号和主机号的边界。
对于一个子网来说,子网掩码二进制位下最低位的1及其以前为该子网的网络号,最低位的1以后为主机号。
IP地址 & 子网掩码 = 该地址的网络号。
例如IP地址为 140.252.20.68,子网掩码为255.255.255.0,因此该地址的网络号为140.252.20.0。
在IP报文传输的过程中,可以通过该报文的目的IP地址与路由器中各个条目的子网掩码相与快速得出该报文的发送路径,通过以上操作可以得到该目的IP地址的网络号,若与条目中的网络号相同则确定了该报文的发送路径,在实际中若多个条目符合以上要求则选择最长掩码条路作为选择的路径。
四、特殊的IP地址
- 将IP地址中的主机地址全部设置为0,即可得到该主机所在网段的网络号;
- 将IP地址中的主机地址全部设置为1,即可得到该主机所在网段的广播地址,用于给同一个链路中互相相连的所有主机发送数据包;
- 127.*的IP地址用于本地环回测试,通常是127.0.0.1
五、解决IP地址的数量限制
IP地址是一个4字节32位的正整数,即使全部都作为IP地址,那么也只有2^32次方个IP地址,而想接入网络就必须拥有IP地址,随着互联网的发展,IP地址出现了不够用的问题。因此还需要采取一些措施:相比于静态划分IP地址,动态划分IP地址一定程度上缓解了IP地址不够用的问题,但仅是如此IP地址的使用依然很紧张,
- 动态分配IP地址:只给接入网络的设备分配地址,也就是当一台设备离线以后IP地址被回收。因此同一台设备每次接入互联网中,得到的IP地址不一定相同;
- NAT技术:利用公网IP和私有IP大大缓解了IP地址不够用的问题;
- IPv6:以上我们提到的IP地址是IPv4地址,而IPv4使用16字节128位来表示IP地址,IP地址并不是IPv4的简单升级,这是两个互不相干的协议,彼此不兼容。
六、公网IP与私有IP
公网IP指的是在互联网(公网)上全局唯一的IP地址,一般用于直接连接互联网的设备;私网IP用于局域网内的设备通信,由路由器或网络管理员分配,仅在网络内部唯一。
如果一个机构内部组建局域网,那么这个网络内部的私有IP地址只用于局域网内通信,无法直接连接至公网上的设备。因此需要一个设备完成公网IP和私有IP的转换——NAT技术,一般这个设备都是路由器。
一般私有IP需要遵循以下规则:
1、10.*,前8位是网络号,共16,777,216个地址 (企业级路由器使用)
2、172.16.到172.31.,前12位是网络号,共1,048,576个地址 (企业级路由器使用)
3、192.168.*,前16位是网络号,共65,536个地址(家用路由器使用)
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)
- 不同的网段之间的转发全靠路由器,所有路由器这种设备隶属于多个网段。路由器也相当于一台主机,拥有独立的IP地址,并且一个路由器可以拥有多个IP地址;
- 子网(局域网)内的主机号不能重复;
- 在一个子网中,管理子网中的IP设备通常时路由器,通过DHCP,路由器可以给子网内的新增主机节点分配IP地址;
(一)NAT技术
在上一小节我们提到了IPv4地址数量不足的情况,而NAT技术就是解决IP地址不够用的主要手段,这是路由器的一个重要功能。
- NAT技术能够将私有IP对外通信时转为全局IP,也就是一种将私有IP和全局IP相互转化的技术方法;
- 全局IP要求唯一,但是不同局域网中可以出现相同的私有IP,但在同一局域网内私有IP唯一。
下图是私有IP转换为公网IP进行通信的过程:
在局域网中,作为公网入口的路由器,其WAN口通过ISP(互联网服务提供商)分配的公网IP地址与外部网络通信,而LAN口则通过私有IP地址(如192.168.x.x)管理内部网络设备,并通过NAT技术实现内外网数据转换。
客户端根据本地路由表规则,将所有目标IP不属于局域网(如10.0.0.0/24)的数据包直接发送至默认网关(即NAT路由器的LAN口IP)。NAT路由器收到局域网中需要发送的数据包后,基于目标IP查询路由表,确认需通过WAN口转发后,会将该数据包的源IP地址替换为NAT路由器的WAN口IP地址并发送数据包。由此便完成了私有IP到公网IP的转换,也完成了局域网向公网中设备的通信。
以上的过程是局域网中的主机向公网中的设备进行通信时的地址转换,那么公网中的设备如何向局域网中的主机发送数据呢?NAT路由器收到公网的数据包如何知道该数据包是发送给局域网中的哪一台主机呢?因此还需要NAPT技术。
(二)NAPT技术
当局域网内的多台主机通过NAT路由器向公网上的服务器发送数据后,那么对于服务器回送的数据中,其目前IP地址都是NAT路由器的WAN口地址,NAT路由器如何区分这些数据包是发送给局域网中的哪台主机呢?因此仅仅靠IP地址替换是无法完成公网IP和私有IP的相互转换的。
因此引入了NAPT技术,使用IP地址+端口号来建立映射关系。
相较于NAT技术,实际NAT路由器还会维护一张互为键值的转换表,其是私有IP与端口和公网IP和与端口的相互映射。
当局域网中多台主机需要与公网上的设备进行通信时,多态主机的数据包经过NAT路由器时,路由器基于目标IP查询路由表,确认需通过WAN口转发后,执行NAT转换并发送数据包。NAT路由器不仅仅只替换数据包的源IP地址,还会将数据包的端口号替换随机一个端口号并记录映射关系。而对于公网服务器回送的数据包,通过查询NAT表再将目的IP地址和目的端口号还原为局域网内IP地址和端口号后再发送给局域网内的主机,完成公网IP和私有IP的相互转换。
(三)NAT技术的缺陷
无法从NAT外部向内部服务器建立连接;
转换表的生成、维护和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开。
七、路由及路由表
路由是指数据报从源地址到目的地址传输路径选择的过程,其本质是网络层的寻址和转发机制。路由器通过分析数据包中的目的IP地址,结合路由表动态选择最优路径,将数据包逐跳转发至目的网络和主机。
因此IP数据报的发送路径实际是由路由表决定的,在Linux环境下可以使用route命令查看路由表。
[X@VM-8-8-centos ~]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.0.8.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
- Destination:目标网络或主机的地址;
- Gateway:数据包转发至的下一跳地址;
- Genmask:子网掩码;
- Flags:路由状态标志;
- Metric:路由的优先级数据,数值越小优先级越高;
- Ref:路由引用次数(Linux未使用)
- Use:路由被查找的次数;
- Iface:数据包发出的网络接口。
下面是简化后的路由表:
目的网络 | 子网掩码 | 下一跳地址 | 物理接口 |
192.168.32.0 | 255.255.255.192 | 10.1.1.1 | eth1 |
192.168.32.0 | 255.255.255.0 | 10.1.1.2 | eth2 |
192.168.32.0 | 255.255.224.0 | 10.1.1.3 | eth3 |
0.0.0.0/0 | 默认路由 | 203.0.113.1 | eht0 |
当我们收到一个目的IP位 192.16.32.100 的数据包。
将目的IP与每个路由条路的掩码进行按位与运算:
1、255.255.255.192 & 192.16.32.100 = 191.168.32.64 不符合条目的目的网络;
2、255.255.255.0 & 192.16.32.100 = 192.168.32.0 符合条目的目的网络;
3、255.255.224.0 & 192.16.32.100 = 192.168.32.0 符合条目的目的网络;
因为条目2和3都可以满足条件,但条目2的掩码长度更长,因此选择条目2的物理接口作为发送接口。
路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由),例如距离向量算法, LS算法, Dijkstra算法等。