IP 协议

楠枬 2024-09-14 10:37:01 阅读 68

目录

协议格式

地址管理

网段划分

特殊的 IP 地址

IP 地址的数量限制

私网IP地址 和 公网IP地址

路由选择


网络层负责在复杂的网络环境下确定一个合适的路径。IP 协议是网络层中的重要协议,在本篇文章中,我们就来学习 IP 协议

IP协议,主要的负责两方面:

地址管理:使用一套地址体系,来描述互联网上每个设备所处的位置

路由选择:一个数据包,如何从网络中的某个地址,传输到另一个地址

我们首先来了解一些基本概念:

主机:配有 IP 地址,但是不进行路由控制的设备

路由器:配有 IP 地址,还能进行路由控制

节点:主机 和 路由器 的通称

 

协议格式

4 位版本号(Version):指定协议的版本,对于IPv4,该字段为 4

4 位首部长度(Header Length):IP 头部的长度是多少个 32bit,也就是 length * 4 字节数,4bit表示最大的数字是15,因此,IP 头部的最大长度是 60 字节

8位服务类型(Type Of Service):3位优先权字段,4位TOS字段,1位保留字段(必须置为0),4位TOS分别表示:最小延时、最大吞吐量、最高可靠性 和 最小成本。这四者相互冲突,只能选择一个。例如:对于 SSH/Telnet,最小延时比较重要,而对于 FTP,最大吞吐量比较重要

16 位总长度(Total Length):IP 数据报整体(头部 + 数据)占多少个字节

16 位标识(id):唯一的标识主机发送的报文。若 IP 报文在数据链路层被分片了,那么,每一批里的 id 都是相同的

3 位标志位(Flags):

第一位保留(现在不使用,以后可能用到)

第二位为1表示禁止分片,若此时报文长度超过MTU,就会丢弃报文

第三位表示 更多分片,若进行了分片,最后一个分片置为1,其他为0,类似于一个结束标记

什么是分片?

分片就是将一个大的数据包拆分成多个小的数据包的过程,以适应网络中不同设备的最大传输单元(MTU) 。数据包可能会因为网络路径上的 MTU 限制而被分片,每个分片都是一个独立的IP数据包,包含原始数据包的一部分。接收端会重新组装这些分片,恢复成完整的数据包。

13位分片偏移(Fragment Offset):是分片相对于原始IP 报文开始处的偏移,表示当前分片在原报文的哪个位置,实际的偏移字节数为 偏移量 * 8,因此,除了最后一个报文之外,其他报文的长度必须是 8 的整数倍(否则就不连续了)

8 位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数(一般为 64),每次经过一个路由,TTL -= 1,一直减到0还没有到达,就丢弃。这个字段用来防止出现路由循环

8 位协议:上层协议类型

16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏

32 位源地址:发送端,发送数据包的源 IP 地址

32 位目的地址:接收端,接收数据包的目标 IP 地址

选项字段:不定长,最多 40 字节

数据:实际传输的数据,IP 头部之后的部分

地址管理

IP 地址本质上是一个 32 位的整数,为了方便,常用 点分十进制 的方式进行表示(通过 3 个 . 将其划分为 4 个部分,每个部分 1 字节,每个部分的取值都是 0 - 255)

IP 地址的存在,目的就是为了能够区分网络上的不同设备,希望每个网络设备都要唯一的一个 IP 地址

网段划分

IP 地址分为两个部分网络号主机号

网络号:保证互相连接的两个网段具有不同标识

主机号:同一网段内,主机之间具有相同的网络号,但必须具有不同的主机号

其中,不同的子网其实是将网络号相同的主机放到一起

若子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但主机号不能与子网中其他主机重复

通过合理设置主机号和网络号,就可以保证在互相连接的网络中,每台主机的 IP 地址都不相同

那么,该如何管理子网内的 IP 呢?

若我们手动管理,则会非常麻烦。有一种技术叫做 DHCP,能够自动的给子网内新增的主机节点分配 IP 地址,避免了手动管理 IP。一般的路由器都会带有 DHCP 功能,因此,路由器也可以看做一个 DHCP 服务器

在过去,提出过一种划分网络号和主机号的方案:将所有 IP 地址划分为 5 类:

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类却浪费了大量地址

例如:

申请了一个B类地址,理论上一个子网内能够有 6 万多台主机,A 类地址的子网内主机数量更多

但在实际的网络中,不会存在一个子网中有这么多台主机的情况,因此,大量的IP地址都被浪费掉了

针对这种情况,就有了新的划分方案 —— CIDR(Classless Interdomain Routing)

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号

子网掩码也是一个 32 位的正整数,通称以一串 0 来结尾

将 IP 地址和 子网掩码 进行 按位与 操作,得到的结果就是网络号

网络号和主机的划分就与这个IP地址是 A 类、B 类 还是 C 类无关了

例如:

IP 地址与子网掩码进行 与运算 就可以得到网络号,主机号从 全0 - 全1 就是子网的地址范围

IP 地址和子网掩码还有一种更简洁的表示方法:143.251.30.44/24,表示 IP 地址为 143.251.30,子网掩码的高 24 位为 1,也就是 255.255.255.0

特殊的 IP 地址

将 IP 地址中的主机地址全部设为0,就成了网络号,表示这个局域网

将 IP 地址中的主机地址全部设为1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包

127. * 的 IP 地址用于本机环回(loop back)测试,通常使用的是 127.0.0.1

IP 地址的数量限制

IP 地址(IPv4)是一个 4 字节(32位的正整数),也就是2的32次方个IP 地址,大概是 43 亿,而在 TCP/IP 协议中规定:每个主机都需要有一个 IP 地址。此外由于一些特殊的 IP 地址存在,可使用的 IP 数量远不足 43 亿。而且,IP 地址并非是按照主机台数来配置的,而是每个网卡都需要配置一个或多个 IP 地址

CIDR 虽然在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但IP地址的总数并没有增加),但仍然不够用,此时该如何解决呢?

动态分配 IP 地址:只给接入网络的设备分配 IP 地址,因此同一个 MAC 地址的设备,每次接入互联网中,得到的 IP 地址不一定相同

NAT技术:后面详讲

IPv6:IPv6 并不是 IPv4 的简单升级版,它们是互不干扰的两个协议,彼此并不兼容,IPv6 用 16 字节(128位)来表示一个地址,增加了 IP 地址的个数,是从根本上解决问题的方案,但目前 IPv6 还未普及

在了解 NAT 技术之前,我们先来学习 私网IP地址 和 公网IP地址

私网IP地址 和 公网IP地址

若一个组织内部组建局域网,IP地址只用于局域网内部通信,而不连接到互联网上,理论上,可以使用任意 IP 地址,但 RFC 1918 规定了用于组建局域网的私有 IP 地址:

10. * :前8位是网络号,共 16 777 216 个地址

172.16 - 172.31:前 12 位是网络号,共 1 048 567 个地址

192.168.* :前16位是网络号,共 65 536 个地址

在这个范围中的,都称为 私网IP,其余的则称为全局IP(或公网IP)

局域网内的设备访问局域网内的另一个设备没有任何问题,那局域网内的设备如何访问另一个局域网中的设备呢? 

一个路由器可以配置两个 IP 地址:一个 WAN 口IP,一个 LAN 口IP(子网IP)

路由器 LAN 口连接的主机,都从属当前这个路由器的子网中

不同路由器,子网IP其实都是一样的(通常是 192.168.1.1),子网内的主机 IP 地址不能重复,但是子网之间的 IP 地址可以重复

每一个家用路由器,又作为运营商路由器子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN 口 IP 就是一个公网 IP 了

子网内的主机需要和外网进行通信时,路由器首先将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址称为了一个公网IP,这种技术称为 NAT(Network Address Translation,网络地址替换)

这样,局域网内的主机就可以访问到局域网外的设备了

上述进行替换,就能够让一个 公网 IP 对应多台设备,从而达到节省 IP 地址的效果

局域网内的设备通过 NAT 访问外部信息,那返回数据时,该如何找到这台设备呢?

路由器进行 NAT 时,会把这次通信的相关信息记录下来

此时,路由器通过查表,找到对应表项,就能把 目的 IP 还原成之前 局域网设备的 IP 了

若局域网的各个设备,访问的是不同的服务器

路由器就可以简单的通过服务器 IP 地址来进行区分当前是哪次替换,之前是如何替换的,就如何替换回去

但是,若局域网内的多台设备,访问同一个服务器,此时又如何找到对应的设备呢?

上述的表中,不仅包含 源IP 和 目的IP,还包含 源端口 和 目的端口,路由器在进行查表时,不仅会查源 IP 和 目的 IP,还会查源端口和目的端口

 

路由器在收到响应后,就可以查询传输层中的 源端口

由于客户端的端口号是系统随机分配的,因此,两个主机之间的端口,大概率是不相同的

可万一局域网中的两台设备不仅访问同一个服务器,分配的端口号也相同呢?

此时路由器就会对端口号进行映射

这时,NAT 就会修改传输层的报头(此时,路由器就不是一个纯粹工作在网络层的设备,也会涉及到传输层的内容)

但是,在大部分情况下,局域网中的不同设备,访问的是不同网址,此时就可以直接通过服务器IP区分

少数情况下,访问的是同一个服务器,此时可以加上端口号进行区分

极少数情况下,访问的是同一个服务器,且端口号相同,路由器就会自动映射成不同端口,从而进行区分

NAT 本质上也是提高 IP 的利用率,没有增加 IP 地址,而是让 IP 地址被复用

路由选择

路由选择,目的是在复杂的网络结构中,找出一条通往目的主机的路线

路由选择的过程,是 一跳一跳 的 “问路” 过程

所谓 一跳,是数据链路层中的一个区间,在以太网中指从源 MAC 地址到 目的 MAC 地址之间的帧传输区间

 

IP 数据包的传输过程与 问路 类似:

当 IP 数据包到达路由器时,路由器会先查看目的 IP

路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器

依次反复,一直到达目标IP地址

那么,如何判定当前这个数据包该发送到哪里呢?

这需要依靠每个节点内部维护一个路由,路由表是一张包含网络路径的表格,帮助路由器决定将数据包转发到哪个下一跳设备(即下一个路由器或目的地)

若路由表中有精确匹配目标地址的条目,路由器将根据该条目决定转发路径;

若没有精确匹配,路由器会找到最长的匹配前缀,以便选择最优路径

路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由),如 距离向量算法



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。