网络层与 IP 协议详解

网络层

它主要负责将数据包从 源主机 跨越多重网络路由 到目标主机

网络层最根本的任务是提供主机到主机的通信服务,它屏蔽了底层不同数据链路层(如以太网、Wi-Fi)的细节,让上层(传输层)感觉像是在一个统一的网络上通信。

1. 理解传输层和网络层

传输层提供策略,网络层提供能力。

网络层可以理解为提供的是一个功能完备的数据传送管道。它解决了如何将数据从源主机网络接口跨越复杂网络拓扑送达目标主机网络接口这一根本性问题,这是通信的能力

传输层自身并不扩展网络的基础传送功能,而是确立了一套管理网络层核心能力的策略框架 。它通过差异化的协议设计,对底层服务进行策略化封装

  • 当选择可靠传输策略 (如TCP)时,传输层通过连接控制、确认重传、流量管控等一系列端到端管理策略 ,在网络层提供的能力基础上,策略性构建出具有可靠性保证的通信能力。

  • 当选择效率优先策略 (如UDP)时,传输层则采取最小化干预策略,几乎直接透传网络层的基础能力,仅附加必要的端口号。

2. IP协议

IP协议是TCP/IP协议族乃至整个互联网的核心基石 。它是一个位于网络层(或TCP/IP模型中的网际层)的无连接、不可靠、尽力而为的数据包交付服务协议

2.1 IP协议报头格式

  • 4位版本:该字段的数值直接对应IP协议的版本号。

    • 数值 4(二进制 0100) :表示这是 IPv4 数据报。这是目前互联网上最主流的版本。

    • 数值 6(二进制 0110) :表示这是 IPv6 数据报。这是新一代的IP协议。

  • 4位首部长度:

    • 4位首部长度指的是IP报头(含选项)的长度

    • IP报头采用定长长度,不包含选项为20字节)。

    • 4bit位范围 [0 , 15],单位为 4字节 范围 [0 , 60] 字节,而因为IP报头定长20字节,因此4位首部长度的范围 [5 , 15],[20 , 60]字节。因此IP报头一定是要能整除4字节的。

  • 8位服务类型:

    • 3位优先权字段(已经弃⽤)。

    • 4位TOS字段:最⼩延时、最⼤吞吐量、最⾼可靠性、最⼩成本。这四者相互冲突,只能选择⼀个。对于ssh/telnet这样的应⽤程序,最⼩延时⽐较重要;对于ftp这样的程序,最⼤吞吐量⽐较重要。

    • 1位保留字段(必须置为0)。

  • 16位总长度:报头 + 有效载荷的长度。

    • IP总长度是 协议规范 中定义的、确保IP包能在 任何网络设备间独立传输和解析 的自描述字段,没有这个字段,任何中间设备都无法在连续的比特流中准确提取完整的IP数据报

    • 路由器(以及所有网络设备)接收到的IP包是黏在一起的、无结构的二进制比特流

  • 16位标识:将同一个原始IP数据报的所有分片关联起来(不同报文的标识不同,相同报文但是不同片的标识是相同的),以便接收端能够正确地重组它们。

  • 3位标志:

    • 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)

    • 第二位为1代表禁止分片,这时如果报文长度超过MTU,IP模块就会丢弃该报文。

      • MTU(Maximum Transmission Unit,最大传输单元) 是指某一条数据链路层协议规定所能承载的上层协议数据(即IP数据报)的最大长度,单位是字节(通常为1500字节)。
    • 第三位表示更多分片,最后一片为0,其余片为1,类似一个结束标志。

  • 13位片偏移:表示当前分片所携带的数据,在原始完整IP数据报的载荷中的偏移量。单位为8字节

  • 8位生存时间(TTL):TTL的 根本目的是防止数据包在网络中无限循环,避免路由环路耗尽网络资源。

    • 路由器A认为到达网络X需经过B、路由器B认为到达网络X需经过 A,数据包在A↔B之间来回转发,形成死循环。
  • 8位协议:这是IP层实现有效载荷交付也就是 报文分用 的核心机制,解决了接收方将数据交给哪个上层协议处理的根本问题。

    • 6: TCP

    • 17: UDP

  • 16位首部校验和:检测IP报头在传输过程中是否发生比特错误(比特位反转等问题)。

  • 32位源IP地址和32位目的IP地址:表⽰发送端和接收端。

两个问题:

  • 如何分离:通过4位首部长度和16位总长度字段完成分离。

  • 如何分用:通过8位协议字段。

2.2 网段划分

2.2.1 概念

子网划分,用于将一个大型网络分割成多个更小、更易管理的逻辑子网络(子网)。

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

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

  • 主机号:同一个网段内,主机之间具有相同的网络号,但是必须有不同的主机号(主机号不能重复)。

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

  • DHCP技术是一种自动给子网内新增的主机节点分配IP地址,避免手动管理IP的不便。

  • 一般的路由器自带DHCP功能。因此,路由器也可以看作一个DHCP服务器。

为什么要子网划分?

划分的本质是淘汰的过程。

  • 如果没有网络号,路由器必须在浩瀚的全球IP海洋里一对一线性查找,效率是极低的。

  • 有了网络号,路由器就可以通过分层查找(先大范围筛选,再小范围精找)。

    • 通过网络号批量淘汰,查找目标主机,必须先查找目标网络,本质就可以淘汰其他网络,在全网中提高查找目标主机的效率。
2.2.2 分类划分法(简单了解)

缺点:

IP地址是一个比较稀缺的资源,分类划分法会造成大量的浪费。比如,申请了一个B类网络,里面的主机号没有用完,而又因为这个网络号被你申请走了,别人无法使用造成浪费。

2.2.3 CIDR

针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)(无类别域间路由):

  • 抛弃了A/B/C类的固定划分方式。

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

  • 子网掩码是一个32位的正整数,通常用一串 0 结尾

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

CIDR是通过引入明确的前缀长度(用子网掩码表示),彻底取代了固定长度的网络号,实现了网络地址的灵活分配和高效路由。

例子:

  1. 可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。
  2. IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,等价255.255.255.0。

特殊的IP地址:

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

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

  • 127.*的IP地址用于本地环回(look back)测试,通常为127.0.0.1。

总结:

  • 通过改变子网掩码的长度,我们可以在一个IP地址段内,灵活的、设置1的个数,划分出不同的自网络,从而让每个子网的主机容量更精确的匹配实际需求和合理的划分原则。

2.3 IP地址的数量限制

IP地址是4字节32位的正整数,一共只有 2 32 2^{32} 232 个IP地址,实际上,由于一些特殊IP地址的存在,数量远不足 2 32 2^{32} 232 。CIDR在一定程度上缓解了IP地址不足的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加)。

三种方式解决:

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

  • NAT技术:核心是地址转换(内网IP转换为公网IP),让多个内网(私有)IP 共享一个或少量公网IP上网。

  • IPv6:拥有 2 128 2^{128} 2128 个IP地址,IPv6并不是IPv4的简单升级版,是互不相干的协议,彼此不兼容,但因迁移成本和技术惯性,普及缓慢。

2.4 私有IP和公网IP

2.4.1 理解私有IP

如果⼀个组织内部组建局域⽹,IP地址只⽤于局域⽹内的通信,⽽不直接连到Internet上,理论上使⽤任意的IP地址都可以,但是RFC 1918规定了⽤于组建局域⽹的私有IP地址。

  • 10.*,前8位是⽹络号,共16,777,216个地址。

  • 172.16.*到172.31.*,前12位是⽹络号,共1,048,576个地址。

  • 192.168.*,前16位是⽹络号,共65,536个地址。

包含在这个范围中的,都成为了私有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不能出现在公网上。

  • 你家的电脑可能分配到 192.168.1.100
  • 邻居家的手机可能也分配到 192.168.1.100

  • 这两个地址在各自局域网内唯一,但跨局域网时完全重复。

  • 为了解决局域网设备访问公网的需求,路由器会通过网络地址转换(NAT) 技术实现私有 IP 与公网 IP 的映射。

2.4.2 理解公网IP

公网是 全球范围内互联互通的公共通信网络 ,像国际骨干网、国内骨干网都属于公网的组成部分,它是不同国家、地区、组织的内部网络之间,实现通信的 公共通道

IP地址全局唯一,给每个国家分配了独有的公网网段(比如俄罗斯 1.0.0.0/8、中国 5.0.0.0/8),给国内每个省份分配了子网段(比如陕西 5.1.0.0/16、河南 5.2.0.0/16)。这些 IP 在全球范围内不会重复,相当于网络世界的 全球唯一邮编,能确保任何两个公网设备都能精准找到对方。

公网是分层级打通的:

  • 国际层:俄罗斯的网络通过国际骨干网连到美国、中国的网络;

  • 国内层:陕西的网络通过国内骨干网连到河南、浙江的网络;最终实现俄罗斯的设备能访问中国陕西的设备。这就是公网的核心作用:打破小网络的边界。

私有 IP 只用于最小范围的终端内部网络,公网层级(从国际到园区对外标识)必须用唯一公网 IP;私有 IP 需要通过出入口路由器转换成对应公网 IP,才能接入公网。

  • 路由器有构建子网的功能。
  • 路由器至少要配2套IP。

2.5 理解路由

路由就是路由器根据目标地址,通过路由表找到下一跳,最终把数据包从源网络送到目标网络的过程。

路由的过程,就是这样⼀跳⼀跳问路的过程。

  • 当IP数据包,到达路由器时,路由器会先查看⽬的IP,路由器决定这个数据包是能直接发送给⽬标主机, 还是需要发送给下⼀个路由器,依次反复,⼀直到达⽬标IP地址。

  • 每个节点(主机或路由器)内部维护了一个路由表。

    • 如果⽬的IP命中了路由表,就直接转发即可。

    • 路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当⽬的地址与路由表中其它⾏都

      不匹配时,就按缺省路由条⽬规定的接⼝发送到下⼀跳地址(比如:家庭路由器没有匹配上,默认路由的下一跳通常是小区或者片区路由器)。

2.6 IP的分片与组装

2.6.1 相关概念

分片与组装是由网络层完成的

IP的分片与报头中3个字段相关:

  • 16位标识:将同一个原始IP数据报的所有分片共享一个标识符(不同报文的标识不同,相同报文但是不同片的标识是相同的),以便接收端能够正确地重组它们。

  • 3位标志:

    • 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。

    • 第二位为1代表禁止分片,这时如果报文长度超过MTU,IP模块就会丢弃该报文。

      • MTU(Maximum Transmission Unit,最大传输单元) 是指某一条数据链路层协议规定所能承载的上层协议数据(即IP数据报)的最大长度,单位是字节(通常为1500字节)。
    • 第三位表示更多分片,最后一片为0,其余片为1,类似一个结束标志。

  • 13位片偏移:表示当前分片所携带的数据,在原始完整IP数据报的载荷中的偏移量。单位为8字节

    • 第一片的偏移量总是0。

    • 除最后一个分片外,数据部分长度必须是 8 字节的整数倍

MTU = 1500,IP报头20字节,因此,每个分片携带的最多为1480字节。

网络通信过程中,如果过多分片,就会导致丢包概率增加。分片和组装不是主流,而是被迫为之。因此,在传输层滑动窗口发送报文时,可能会主动控制发送的报文大小,避免触发 IP 层的分片机制

2.6.2 如何分片

原始 IP 报文参数:

  • IP 头长度:20 字节(最小固定头,无选项字段,简化计算);
  • 应用层数据(含上层协议头,如 UDP/TCP):4000 字节
  • 原始 IP 报文总长度 = 20(IP 头) + 4000(数据) = 4020 字节
  • 出接口 MTU=1500 字节(以太网默认),因 4020 > 1500,必须分片。

总数据 4000 字节,按 1480 字节 / 片分配:

  • 分片 1:1480 字节(8 的倍数,非最后一片);3位标志中第二位标志为1;13位片偏移为0。
  • 分片 2:1480 字节(8 的倍数,非最后一片);3位标志中第二位标志为1;13位片偏移 1480 / 8 = 185。

  • 分片3:4000 - 1480×2 = 4000 - 2960 = 1040 字节(1040 是 8 的倍数,但即使不是也可作为最后一片,此处恰好满足);3位标志中第二位标志为0;13位片偏移 2960 / 8 = 370。

2.6.3 如何组装
  • 如何判断报文是否被分片了

    1. 3位标志位中的第3位标志位是否为1,若是1就是分片。

    2. 3位标志位中的第3位标志位为0,但是片偏移大于0(考虑特殊情况:前面的分片全丢了,只剩最后一片。)

  • 如何保证分片收完整了?

    首先把相同标识的分片,聚合在一起。

    1. 第一片丢失:没有片偏移为0的分片。

    2. 中间丢失:可以把收到分片,按照片偏移进行升序排序。片偏移 + 自身报文长度 = 下一个分片的片偏移。

    3. 结尾丢失:没有更多分片为0的分片。

  • 组装:按照片偏移排序,向上层交付。

如何判断没有分片:3位标志位中的第3位标志位为0 && 片偏移也是0。

为什么一个16位标识就能判断唯一性 不是最大只有65535吗?怎么理解?

  • 16 位(65535 个取值)并非全局唯一,而是在特定上下文内唯一

  • 让目标主机能在接收同一组分片的时间窗口内,区分来自不同主机的原始报文的分片(通过源IP、目的IP等辅助判断),而非全球所有主机在所有时间内的所有报文都唯一。

  • 最坏情况:出现不同片但是重复的标识,导致不同片错误合并,最终组装失败直接丢弃。

相关推荐
北京耐用通信1 小时前
三步打通数据壁垒:耐达讯自动化Ethernet/IP转CC-Link方案全解析。建议点赞收藏
运维·tcp/ip·自动化
誰能久伴不乏2 小时前
为什么 TCP 服务端重启会出现 “Address already in use”问题解析
linux·服务器·c语言·网络·c++·tcp/ip
apihz2 小时前
批量获取3位未注册短域名免费API接口每日更新
android·服务器·网络·网络协议·tcp/ip
apihz2 小时前
域名注册状态查询免费API接口详细教程
android·服务器·网络·python·tcp/ip
njxiejing3 小时前
TCP连接详解:三次握手与实战分析(SYN,ACK,seq)
服务器·网络·tcp/ip
2401_865854883 小时前
云服务器的IP是干嘛的?有什么作用?
服务器·tcp/ip·php
2501_938810114 小时前
比特浏览器适用的IP类型
网络·网络协议·tcp/ip
tfjy19976 小时前
网络基础知识
网络协议·tcp/ip
哈里谢顿7 小时前
使用tcp协议的常用端口号
tcp/ip