计算机网络
网络层概述
网络层两个核心作用

| 图中符号 | 现实物流类比 | 具体作用 |
|---|---|---|
| 主机 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 80、HTTPS 443、SSH 22、MySQL 3306、Redis 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查询
两种查询方式:递归查询/迭代查询

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


所有评论(0)