网络层概述

网络层两个核心作用

图中符号 现实物流类比 具体作用
主机 A / 主机 B 发件人 / 收件人 数据的真正起点(A)和终点(B)。
网络 N1~N6 某个小区 / 某个城市 比如 “N1 是北京朝阳区”,“N2 是上海浦东新区”。它是路由器连接的一个区域
路由器 R1~R4 物流集散中心 / 中转站 路由器是网络层的核心设备。它的任务是:接收数据包,决定往哪条路走,然后转发出去。

路由寻址

通过路由器的路由表算出最优的路径,

例如是走A->N1->R1->N2->R2->N3->B

还是A->N1->R1->N4->R4->N6->R3->N5->R2->N3->B

分组转发

将数据切割成一个个小数据包,然后让路由器转发

网际协议IP

网际协议IP是TCP/IP体系结构网际层中的核心协议,注意区分网际协议IP,传输控制协议TCP

什么是网际协议IP?

IP协议是互联网世界的统一的底层规则,所有要上网的设备(手机,电脑,服务器),必须严格遵守这个协议,才能在互联网中传输数据

IP协议的3大核心作用

1.编址寻址:给每台上网设备分配全球唯一的IP地址

2.路由与转发:让数据包跨网络,跨地域,从源主机一站站传到目的主机

3.封装与解封:把上层应用数据(比如微信文字/视频)打包成标准IP数据包,到达目的地再拆包

IP协议核心特点

1.无连接:发数据包前不需要提前建立连接,不确认对方是否收到

2.不可靠(尽最大努力交付):不保证数据包100%可以到达,不保证顺序,不保证不丢包

3.透明传输:不管上层传的是文字,视频,语音,IP协议都一视同仁,只负责转发,不修改内容

这里给大家梳理一下思路:

网络层存在的原因是什么?

网络层存在的终极目的就是实现异构型网络互连;让全世界技术,协议,介质完全不相同的网络(比如你家的WiFi,你朋友的5G,小区的光纤网)能够实现互相通信,实现全球范围内端到端数据传输

网络层怎么实现异构型网络互连的?(核心功能)

路由寻址+分组转发,这也是网络层区别其他层的核心标志:

数据链路层:只负责同一个局域网内的传输(比如你家WiFi里手机到路由器)

网络层:负责跨网络,跨地域的传输,必须靠【路由选择+分组转发】才能实现

1.路由寻址:路由器根据目标地址,算出从源主机到目标主机的最优传输路径

2.分组转发:把数据切成一个一个小数据包,按照选好的路线,一站站接力转发到目标地

网络层是怎么实现核心功能的?(核心工具/协议)

IP协议;这是底层规则,给每台设备分配唯一的IP地址,统一封装数据包,屏蔽底层网络差异,让路由和转发成为可能

IPv4地址的表示方法及其编码方式

IPv4地址的编址方式经历了三个历史阶段:

分类编址(二级结构:网络号+主机号)->划分子网(三级结构:网络号+子网号+主机号)->无分类编址(二级结构:网络前缀+主机号)

表示方法:

IPv4地址由32位二进制数,用点分十进制表示

知识拓展:

网卡:

计算机"接受数据"的物理硬件,负责把设备连接到网络,把电信号转化为网络可以懂的语言

分为两种:

有线网卡(插网线的口)和无线网卡(连WiFi的模块)

就像我们手机的SIM卡槽,没有它,手机就不能打电话,上网

MAC地址

网卡的身份证号,出厂时烧录在硬件里,通常不可更改。全球唯一,格式如 00:1A:2B:3C:4D:5E

它是局域网内找设备的底层标识

子网掩码

它是一种规则,用来判断另一台计算机是“内人”(同处于一个局域网下,比如家里面的WiFi,手机,电脑,电视都是连着同一个WiFi)还是“外人”(互联网,彼此之间的通信则需要经过网关)

例如:

我的ip是“192.168.1.5

我的字码掩码是:255.255.255.0

子网掩码决定了哪些段是固定的,哪些段是可以变化的。

255:完全固定

0:随意变化(0-255)

所以只要子网在192.168.1.0到192.168.1.255之间的都属于子网

,可以直接通过MAC寻址找到另一台设备

网关

网关通常就是路由器,如果想访问外网(百度,抖音,微信),则需要通过网关联通互联网。网关通常有两个接口,一个是内网网关,一个是外网网关,我们在Windows电脑上使用ipconfig命令时看到的默认网关,就是内网网关。外网网关就是运营商分配给我们的公网ip,这是路由器连接光猫、连接运营商网络的接口。

IPv4地址的分类编址方法

ipv4地址由网络号+主机号组成

主机号:标识同一网络内的具体设备,同一网络内,所有设备的主机号必须唯一

网络号:标识设备所在的网络,同一网络内,所有设备的网络号相同

网络地址:作为一个网段的标识,代表这个网段的集合,通常是该网段的第一个地址,不分配给任何主机使用

广播地址:用于向同一个网络中所有的设备发送数据包,通常作为该网段的最后一个地址

IPv4编址方法

子网划分

为什么要子网划分?

1.减少广播流量,提高广播效能。如果不划分子网,一个地址通过广播地址发送,所有的设备都会收到,即使有的设备不需要。浪费资源

2.提高IP地址利用率,避免浪费。设备很少,但是地址很多,会导致闲置浪费,划分子网给不同的部门,提高利用率

无分类编址(CIRD)

为什么要有这个?

在 CIDR 之前,IPv4 地址是按固定分类分配的:

A 类:前 8 位网络号,主机号 24 位 → 一个 A 类网络有 1600 多万个地址(太大了,浪费严重)

B 类:前 16 位网络号,主机号 16 位 → 一个 B 类网络有 65534 个地址(很多组织根本用不完)

C 类:前 24 位网络号,主机号 8 位 → 一个 C 类网络只有 254 个可用地址(小公司不够用)

问题

要么太大(浪费),要么太小(不够),没有中间选项。

路由表爆炸,因为每个 C 类网都要单独一条路由记录。

解决方案:CIDR(1993 年提出,RFC 1517-1519)。
它彻底抛弃了 A/B/C 类,采用可变长度的网络前缀

怎么表示?

斜线记法:

例如:128.14.35.7/20

从左往右,前20位是网络前缀,代表网络号,后12位是主机号

什么是【路由信息】

路由器里面有路由表,里面记录着两件事:

1.目标网络:数据包要去的目标地址段

下一跳:这个数据包该发往哪个路由器

什么是【路由聚合】

就是把多个连续的小网络,合成一个大的网络前缀,让路由条目变少

IPv4地址的应用划分

1.定长子网掩码:容易造成浪费,平均分配

2.可变子网掩码:提高利用率,按需分配

IPv4地址与MAC寻址

接下来,我们举一个具体【微信发送消息】的的例子来讲解一下

例如:

你给你朋友【发消息:今晚吃火锅吗?】,点击发送之后,此时应用层发挥作用。

应用层作用

微信会把消息+自己的协议数据打包成应用层报文(软件按照自己的规则打包业务数据)

大概这样:

【消息ID: msg_20250520_123456】

【发送人ID: wxid_abc123xyz】

【接收人ID: wxid_def456uvw】

【消息内容: 今晚去吃火锅吗?】

【加密校验: xF9sK7p2】

【时间戳: 2025-05-20 18:30:22】

但是需要注意的是,数据报文只是应用层的最终生成的数据,但并不是所有的软件生成的数据报文都一样

例如:

【微信】:消息+微信自己的聊天协议

打包成:


消息ID: msg_20250520_123456

发送人ID: wxid_abc123xyz

接收人ID: wxid_def456uvw

消息内容: 今晚去吃火锅吗?

...


【浏览器】:操作+http协议

比如:把访问百度这件事,写成http格式


GET / HTTP/1.1 Host: baidu.com


由此可以看出,只是软件不同,他们的报文的格式也不同,但是他们的层级都一样,都是应用层的产物

特点:没有IP,MAC,没有端口,只关心内容

接下来,报文进入【运输层】

运输层的作用

运输层会给报文加上一个运输层首部 (TCP首部)

首部写清楚:

        源端口:53000(你的微信)

        目标端口:443(微信服务器)

作用:标记是哪个软件进程发送的,要发送给哪个软件进程,让收到数据的设备知道把数据交给微信APP,而不是其他软件(QQ,浏览器)

特点:现在数据有了“端口标识”,但是还没有IP和MAC地址

这里再来讲解一下知识点

什么是端口?

是运输层用于标识同一台主机内不同的应用程序/进程的编号,是一个0~65535的数字

作用:当数据到达一台主机后,端口号告诉操作系统这条数据应该交给哪个软件处理

什么是TCP协议(传输控制协议)?

是一种面向连接,可靠的传输层控制协议

作用:在通信双方之间建立可靠连接,保证数据不丢失,不错乱,不重复,并在丢包时自动重发

接下来就到网际层

网际层的作用

网际层会给运输层下来的数据【TCP首部+应用层报文】加上一个IP首部

首部写清:

源IP:192.168.1.10(你的手机地址)

目的IP:120.232.145.148(微信服务器IP)

网际层的主要作用是路由寻址+路由转发

主要负责的是在整个互联网中设备到设备的查找转发

接下来到数据链路层

数据链路层的作用

给上面的IP数据报【IP+TCP+报文】加帧首部和帧尾部

帧首部写清源MAC(你的手机),目标MAC(你家路由器LAN口MAC)

帧尾部是校验码,检查数据传输中有没有出错

作用:在当前这一段链路内找到下一个设备

MAC地址只在当前的局域网有效,出了你家WiFi就会被换掉

需要注意的是,IP地址固定不变,但是MAC地址会一直在变

例如你家的局域网内:

你的手机MAC地址->路由器 LAN口的MAC

出了你家局域网:

路由器WAN口MAC->运营商设备MAC

最后进入物理层

物理层的作用

把完整的数据帧换成0/1组成的无线电波,通过WIFI发给路由器

特点:转化为物理信号

ARP地址解析协议

所属层级:网际层

作用:通过IP地址,查询获取对应的MAC地址

为什么要有ARP?

1.网际层(IP):路由计算完毕,确定下一跳IP

2.数据链路层:封装数据帧必填源MAC,目的MAC

但是由于不知道目标的MAC,便无法封装发送不出去,所以必须用ARP查IP对应 的MAC

过程

手机发消息给路由器,不知道路由器的MAC,触发ARP

步骤1:ARP广播请求

同一个局域网内广播查找目标IP的设备,询问MAC地址,广播所有设备都可以收到

步骤2:目标设备单独回应

步骤3:双方保存ARP缓存表

手机记下:目标IP->路由器MAC

后续在发数据,直接查缓存表,不用广播重复询问,提高效率

IPv4数据报的首部格式

1.IPv4首部 固定最小20字节,后面有可选字段,最大60字节

版本 |  4位

内容:4/6

作用:标识是IPv4协议还是IPv6协议

首部长度 | 4位

最小取值5:5*4=20字节

最大取值15:15*4=60字节

作用:告诉设备IP头部一共多长,方便剥离头部读取数据

生存时间TTL | 8位

原理:每经过一台路由器,数字自动-1

作用:防止数据包无线循环转发

规则:TTL减到0,路由器直接自动丢弃报文,Windows默认128,linux默认64

协议 | 8位

标记IP上层用的是什么协议

常见的固定编号:

6=TCP(微信,网页,购物)

靠谱,稳重,慢一点但不出错

面向连接,数据不丢失,不乱序,不重复

丢包自动重发

17=UDP(抖音直播,视频)

超快,简单,不保证靠谱

不提前连接,直接发出去

不确认,不重发,不管丢不丢包

所读快,开销小

1=ICMP(ping命令)

应用:

分组网间探测ping:测试主机或路由器之间的连通性

路由追踪tracert:探测IP数据报从源主机到达目标主机之间经过哪些路由器

网络侦察,测试,报错专用协议

询问报文

测试网络通不通

差错报告报文:

网络报错:目标不可达,网络拥堵,TTL超时

首部校验和

作用:只校验IP首部有没有传输损坏

虚拟专用网VPN和网络地址转换NAT

NAT地址转换

把内网设备的私有IP转换成公网IP,让多台内网设备能共享少量公网IP访问互联网

工作在:路由器(网络层)

为什么要有NAT?

1.全球的公网IPv4地址数量有限,不够用

互联网只认公网

两种NAT

【SNAT】源地址转换
方向:内网 → 外网
场景:公司几十人共用 1 个公网 IP 上网

【DNAT】目的地址转换
方向:外网 → 内网
场景:把公网 IP:8080 映射到内网 192.168.1.50:8080

VPN虚拟专用网

在开放,公共的互联网上,强行搭建一条加密,封闭,专属的虚拟隧道

运输层 (核心协议:TCP、UDP)

需要注意的是,这是TCP/IP模型,把数据链路层和物理层合并了,叫网络接口层。

TCP/IP是工程实践出来的模型,不是教科书式的完美分层。


TCP传输控制协议

为其上层提供面向连接可靠的数据传输服务使用TCP通信的双方,在传输数据之前必须首先建立TCP连接(逻辑连接而非物理连接),数据传输结束之后必须释放TCP连接

什么叫面向连接?

发数据之前先“握手”,确认对方在线且能接收

源主机发送请求->目标主机确认请求->源主机确认目标主机收到请求

这就是著名的TCP三次握手协议,三次握手完成之后,才开始发数据

什么叫可靠?

TCP通过三个机制来保证数据完整,按序,不重复的送到

机制1:编号+确认(ACK)

源主机把一整个数据切割成许多小小的数据包,每一个小数据包都有编号(1,2,......10000)

每发送一个小数据包。目标主机收到后必须回复:收到了第3个数据包了(ACK=3)

如果源主机没有收到确认回复,就知道这个小数据包丢失了

机制2:超时重发

源主机发送的编号为5的数据包后,等了2秒没收到确认回复,TCP自动重发编号为5 的数据包,直到收到确认为止

机制3:按序组装+去重

编号2的数据包走的比编号3的数据包慢,目标主机先把编号3的数据包缓存起来,第编号2的数据包到了再按照1->2->3的顺序组装起来

如果因为网络抖动收到两份编号4的数据包,则TCP会自动丢弃重复的一份

使用场景

http/https(网页),SMTP(邮件),FTP(文件传输) ---------所有不能丢数据的场景

例如,网页数据量大,(HTML,CSS,JS,图片),TCP保证不丢,不错,按序

用户数据报服务UDP       ---不可靠传输

特点:无连接,不可靠,快

无连接:直接发,不握手

不可靠:不保证送达,不保证顺序,丢了不管

快:头部开销小,没有重传等待

使用场景:DNS(域名解析),RTP(视频/直播)

运输层的端口号,复用与分用的概念

端口号

端口号就操作系统是用来区分同一台设备上具体是哪个网络程序

范围 名称 谁在用 实习/日常例子
0 ~ 1023 熟知端口(Well-known) 系统保留,不能随便占用 80(HTTP网页)、443(HTTPS加密网页)、22(SSH远程登录)、53(DNS)
1024 ~ 49151 登记端口(Registered) 常用软件默认注册使用 3306(MySQL数据库)、6379(Redis缓存)、8080(测试环境/代理)、27017(MongoDB)
49152 ~ 65535 动态/私有端口(Dynamic/Private) 操作系统临时分配给客户端 你手机上的微信、抖音、浏览器打开网页时,系统随机从这里面挑一个


 

因为端口号在TCP/IP头部占16个比特(2字节),2的16次方是65536,所以端口的范围是0~65536

常见端口:HTTP 80HTTPS 443SSH 22MySQL 3306Redis 6379 DNS 53

复用和分用

复用和分用本质上是很多APP共用同一个通道发数据和到了之后按照编号分发给对应的APP

概念 方向 一句话
复用 发送方(从上到下) 手机上的微信、抖音、浏览器……很多个 App,共用同一个运输层(TCP/UDP)和同一个 IP 地址发数据
分用 接收方(从下到上) 数据包到了你的手机/电脑后,运输层根据端口号拆开,精准递给对应的 App

复用:多个上层应用,复用同一个下层运输层服务

例如:

微信的数据  ──┐
             ├──► 运输层(TCP)──► 网际层(IP)──► 网络接口层(WiFi)──► 互联网
抖音的数据  ──┤      (统一贴上不同端口号)
             │
浏览器的数据 ─┘

三者共用一个IP地址,共用一个TCP协议栈,但是运输层给每一个APP的数据贴上不同的端口号,防止混在一起

分用:运输层根据端口号将不同的数据分发给不同的应用程序

互联网 ──► 网卡 ──► 运输层(TCP)───┬──► 端口号 54000 → 交给微信
                                                                        ├──► 端口号 62001 → 交给抖音
                                                                        └──► 端口号 52138 → 交给浏览器

TCP和UDP的区别

对比项 TCP UDP
连接 面向连接:发数据前必须三次握手 无连接:直接发,不握手
可靠性 可靠:不丢、不错、不乱序、不重复 不可靠:可能丢、可能错、可能乱序
速度 慢(握手+确认+重传需要时间) 快(没有额外开销)
头部大小 大(至少 20 字节) 小(8 字节)
传输单位 报文段(Segment) 数据报(Datagram)
典型场景 浏览器网页、微信传文件、发邮件 DNS 查询、王者荣耀、抖音直播、视频通话

TCP三次报文握手连接

前提知识储备:

SYN:标志位,请求建立连接

seq:序号,随机生成

ACK:标识位:确认SYN

第一次握手

客户端->服务器

        客户端发送:

                SYN = 1                // 标志位:请求建立连接
                seq = x                // 序号:我这次发送的起始字节编号是 x(随机生成)

客户端从 closed -> SYN-SENT

第二次握手

服务器->客户端

        服务器收到第一次握手之后,回复:

                SYN = 1                // 标志位:我也请求建立连接(双方都要同步序号)
                ACK = 1                // 标志位:确认收到你的 SYN
                seq = y                // 序号:我这次发送的起始字节编号是 y(随机生成)
                ack = x + 1            // 确认号:我期待你下次从 x+1 开始发

服务器从 listen -> SYN -> RCVD

第三次握手

客户端->服务器

        客户端收到第二次握手之后:,回复:

                ACK = 1                // 标志位:确认收到你的 SYN
                seq = x + 1            // 序号:我从 x+1 开始发(呼应服务器的 ack)
                ack = y + 1            // 确认号:我期待你下次从 y+1 开始发

为什么不能是两次握手?

第一点:服务器不知道自己发送的能力是否被客户端验证

第二点:防止“历史重复连接”浪费资源

  • 你手机发了两次 SYN,第一次的卡在路由器里

  • 第二次的正常建立了连接、传完数据、关闭了

  • 半小时后,第一次的旧 SYN 突然到达服务器

  • 如果是两次握手:服务器直接回复 SYN+ACK,进入 ESTABLISHED,分配内存傻等

  • 但你手机早不管这个旧连接了,不会回第三次 ACK

  • 服务器资源白白浪费

三次握手能避免: 服务器回复 SYN+ACK 后,必须等第三次 ACK。等不到?就知道这是废连接,直接扔掉,不分配资源。

四报文挥手断开TCP连接

分四步:“我说完了”,“我知道了”,“我也说完了”,“我知道了”,才能彻底断开连接

DNS域名系统

因特网采用层次树状的域名结构

域名的结构由若干个分量组成,各分量之间用.隔开,分别代表不同级别的域名

·····.三级域名.二级域名.顶级域名

例如,湖南科技大学网络信息中心的域名

nic(四级域名,学校自行管理的国家信息中心  ).hnust(三级域名,湖南科技大学).edu(其下注册的二级域名,表示教育机构).cn(表示中国,顶级域名)

解析过程

                                         在 Edge 输入 www.baidu.com

第0步:浏览器缓存(最快)

第1步:查操作系统本机DNS缓存

cmd命令:ipconfig /displaydns

第2步:hosts文件(本地硬编码)

Windows:C:\Windows\System32\drivers\etc\host

这个文件里可以手写规则:

        127.0.0.1    localhost
        192.168.1.50    test.mycompany.com

如果在 hosts 里找到了 www.baidu.com 对应的 IP,直接返回,不再问任何 DNS 服务器。

第3步:路由器缓存(本地DNS代理)

hosts 没找到?请求发给你家路由器。很多路由器自带 DNS 缓存,或者帮你转发给运营商 DNS。

第4步:公网DNS查询

两种查询方式:递归查询/迭代查询

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐