八股知识梳理——计算机网络
面试着重考察应用层(HTTP, DNS)、运输层(TCP、UDP)的协议
1. OSI模型
|
是什么 |
为什么 |
怎么做 | |
|
应用层 |
定义进程之间通信的规则 |
规范通信内容 |
DNS:域名系统,域名服务器存储IP-域名映射表 HTTP:超文本传输协议。UDP实现 DHCP:动态主机配置协议。服务器为客户端分配IP。UDP实现 |
|
表示层 |
定义数据转换(加密、压缩、编码、解码)的方法 |
保证数据的安全,提高数据传输效率 |
SSL:加密传输协议 |
|
会话层 |
定义建立、管理、终止会话或连接的方法 |
保证会话的有效性 | |
|
运输层 |
定义进程间通信的方法 |
提供进程之间的逻辑通信服务 |
UDP:用户数据报协议。无连接的,尽最大可能交付的,没有拥塞控制,面向报文的,支持多对多的交互通信协议。 TCP:传输控制协议。面向连接的,提供可靠交付的,有拥塞控制的,面向字节流的,一对一的交互通信协议。 |
|
网络层 |
定义数据路由的方法,控制子网的运行 |
保证数据帧在主机之间有效传输 提供主机之间的通信服务 |
IP: 定义网络通信的基础标识IP ICMP:网际控制报文协议,测试主机之间的连通性,发送差错报告报文 路由选择协议:RIP、OSPF、BGP |
|
数据链路层 |
定义数据的格式,对比特流进行封装(MAC地址) |
保证数据在链路上有效传输 |
PPP:点对点协议,封装成帧 ARP:地址解析协议,维护IP-MAC地址的映射表 CSMA/CD协议:解决总线冲突(碰撞) |
|
物理层 |
在物理介质的基础上,定义的物理设备的标准 |
保证比特流在不同物理媒介上有效传输 |
调制技术:数字信号 -> 模拟信号 通信技术: 单工、半双工、全工 复用技术: 频分、波分、码分 |
2. 链路网络协议
2.1 IP协议
-
IP协议:定义主机的网络标识
-
定义数据包格式(IP报文头)
-
提供逻辑地址系统(IP地址)
-
实现跨网络路由选择
-
完成数据包的分片与重组
-
-
IP地址:共32位,分为4组
-
掩码计算:网络位全1,主机位全0(
255.255.255.0对应24位掩码) -
CIDR表示法:
IP地址/掩码位数(如192.168.1.0/24) -
子网地址:每个子网的首地址为网络地址,末地址为广播地址
-
-
NAT: 网络地址转换,私有IP地址转换为公有IP地址的技术
-
工作原理:NAT通过维护映射表,修改数据包实现地址转换
-
内部设备发送数据包(源IP为私有IP,目标IP为外部地址)。
-
NAT设备(如路由器)收到数据包,根据映射表将源IP替换为公有IP。
-
外部服务器收到数据包,认为请求来自NAT设备的公有IP。
-
外部服务器返回响应数据包,目标IP为NAT设备的公有IP。
-
NAT设备根据映射表将目标IP替换为内部设备的私有IP,转发到内部网络。
-
-
NAT类型:
-
静态NAT:映射表固定映射,用于对外提供服务的服务器(如Web服务器)
-
动态NAT:IP池动态映射,用于企业内部设备访问外部网络
-
2.2 ARP协议
-
Address Resolution Protocol地址解析协议:维护MAC-IP映射表
-
获取 MAC-IP 映射:主机的ARP缓存表没有存储MAC-IP映射

举例:主机A 需要获取 主机B 的MAC地址
-
主机A以广播方式发送一个ARP请求报文,此时目标MAC置0
-
主机B比较自己的IP地址和ARP请求报文中的目标IP地址,发现一致
-
主机B存储主机A的MAC-IP信息,以单播方式返回完整ARP响应报文
2.3 路由协议
-
路由协议:用于确定数据包在多个网络中的传输路径
-
路由表:每个路由器记录下一跳的IP
-
路由更新算法:路由协议维护和更新路由表的方法
-
RIP: 距离向量路由协议
-
网络结构:整个网络节点平级,网络是无向图
-
路由表更新机制:
-
周期性广播:每30秒全量广播路由表,导致带宽浪费和收敛慢
-
触发更新:仅在网络变化时发送增量更新(需手动配置)
-
-
路由更新算法:Bellman最短路径算法
每次网络结构更新,路由协议将本节点到所有其他节点的距离,发送给相邻节点,直到所有节点的距离向量被更新。最终每个节点都得到了到达目的节点的最短距离。
-
适用范围:小型网络
RIP的路由算法使得每次网络更新,整体网络的路由器都会更新路由表,开销大
5. OSPF: 链路状态路由协议
-
网络结构:网络分层
-
层级内部仅存储内部路由信息
-
层级暴露一个路由器接口,自治系统边界路由器ASBR
-
层级之间信息由区域边界路由器ABR管理
-
-
LSDB:存储路由器所在OSPF区域内的所有链路状态信息
-
触发更新:网络变化时立即发送LSA(链路状态通告),仅传播变化部分。
-
LSA刷新:每30分钟刷新一次LSA以确保数据库一致性
-
-
路由更新算法:Dijkstra
3. 运输层协议
3.1 UDP用户数据报协议
-
特点
-
无连接:发送数据之前不需要建立连接
-
尽最大努力交付:不保证可靠交付
-
面向报文:一次传送并交付一个完整的报文
-
没有拥塞控制:网络拥塞不改变报文的发送速率
-
支持多对多:支持 1/n:1/n
-
首部开销小:包括端口信息、数据报长度、校验和,仅8字节
-
-
通信流程:UDP数据报镶嵌在IP数据报内,指定IP接收UDP数据报后根据首部寻找端口。UDP报错由ICMP发送。
-
使用场景
-
时效性强:视频会议,在线游戏
-
情景简单:DNS解析,物联网
-
-
综合评价:UDP通信简单,传输速率快,但不可靠
3.2 TCP传输控制协议
-
什么是TCP协议:面向连接的,提供可靠交付的,面向字节流的,可以进行拥塞控制的通信协议
-
面向连接:发送数据前需要建立一对一的连接
-
提供可靠交付:通过连接提供可靠交付
-
面向字节流:一次传送并交付一个数据块,控制字节(多个数据块)序列。
-
拥塞控制:缓存机制
-
-
面向连接的实现

3次握手的作用分别是什么?
第 1 次握手:客户端发出SYN连接请求,并发出报文序列号seq。
第 2 次握手:服务器响应连接请求,发出ACK确认报文,并发出报文序列号seq。
第 3 次握手:客户端响应服务器确认报文,发出ACK确认报文。此次握手能够排除迟滞报文导致的错误。
4次挥手的作用分别是什么?
第 1 次挥手:客户端发出FIN断开请求。
第 2 次握手:服务器确认断开请求,并发出ACK确认报文。此时,服务器进入CLOSE_WAIT状态,屏蔽接收请求,只发送资源。
第 3 次挥手:服务器在发送完所有资源后,响应断开请求,发出FIN断开响应。
第 4 次挥手:客户端响应服务器确认报文,发出ACK确认报文。此次挥手能够排除迟滞报文导致的错误(同作用同第 3 次握手)。此时,客户端进入TIME_WAIT状态,接收服务器发送的延迟的数据包。
2MSL后,请求方关闭连接
3. 可靠交付的实现:停止等待协议:超时重传,确认丢失,确认迟到
4. 面向字节流的实现:滑动窗口
-
滑动窗口实现可靠传输
-
滑动窗口实现流量控制:粘包与拆包
-
粘包:发送方写入数据<接收方socket缓冲区大小,会合并多个TCP数据
-
拆包:发送方写入数据>接收方socket缓冲区大小,会拆分TCP数据
-
5. 流量控制的实现:接收窗口rwnd,发送方会根据接收方rwnd的大小控制发送速度
6. 拥塞控制的实现:
-
拥塞窗口cwnd:根据网络状态限制发送窗口的大小
-
拥塞控制算法:慢开始、拥塞避免
-
拥塞控制算法:快重传、快恢复

慢开始:从1开始指数增长
拥塞避免:达到阈值,缓慢加1
超时:阈值变为窗口大小的一半,重新慢开始

快重传:收到3个重复的seq,立刻重传seq+1
快恢复:快重传后,阈值变为窗口大小的一半,进入拥塞避免
7. 综合评价:TCP通信流程复杂,传输速率慢,但是通信可靠
4. 应用层协议
4.1 DNS协议
-
IP和域名的关系:IP:域名=1:n,单个IP可以有多个域名
-
DNS授权模型:倒置点分字符串的树形结构寻址

3. DNS服务器查询全过程

-
多级缓存查询:查询过程类似于多级缓存,不存储全部子节点信息。只有未命中时,才会向父节点发出递归查询请求
-
分布式授权管理:如果某个域名对应的IP改变了,只需要通知父节点即可
4.2 HTTP超文本传输协议
-
什么是HTTP:基于TCP的无状态的超文本传输协议
-
超文本:可以使用超链接跳转的文本
-
无状态:不记录连接状态,每次请求是独立的
-
-
HTTP报文
请求报文
|
内容 | |
|
请求行 |
HTTP版本,url,请求方法 |
|
请求头 |
cookie,host,encoding,user-agent |
|
请求体 |
响应报文
|
方法 | |
|
响应行 |
HTTP版本,响应码 |
|
响应头 |
set-cookie,encoding,cache-control |
|
响应体 |
3. 请求方法
|
方法 |
执行效率 |
安全性 |
应用场景 | |
|
GET |
发送一个带有url的报文,没有请求体 |
高 |
低 |
请求资源 |
|
POST |
先发送一个只有请求头的报文, 等待服务器响应 code 100 再发送带有数据的报文 |
低 |
高 |
|
HEAD - 请求资源的响应头信息。
PUT - 上传文件或者更新资源。
DELETE - 删除指定的资源。
OPTIONS - 请求获取服务器支持的请求方法。
4. 状态码
|
1xx |
通知 |
|
2xx |
成功 |
|
3xx |
重定向 |
|
4xx |
客户端错误 |
|
5xx |
服务器错误 |
5. HTTP有状态连接的实现:该机制通常用于用户信息验证(登录场景)
-
Cookie与Session
-
Cookie :浏览器端的存储机制
-
Session:服务器端的存储机制
-

-
Cookie + Session的状态存储
-
服务端接收未带有Session ID的客户端验证请求,服务端验证通过后,会创建唯一的 Session ID 并存储
-
服务端将Resbonse报文携带Session ID返回客户端,客户端浏览器通过Cookie存储Session ID
-
后续客户端对服务端同一域名的请求中,客户端请求携带 Session ID
-
服务端接收带有Session ID的客户端请求,服务端会查询Session ID数据库验证。如果验证通过可直接登录
-
Session ID通常有过期时间限制
-
Token与Jwt:
-
token:无状态令牌,以
加密(uid+timestamp+sign)的方式存储用户信息
-
Token是Session的替代方案,其思路是直接将用户信息加密存储在令牌中。如果服务端使用Token存储用户信息,在保证了用户信息的安全性的同时,服务端就不用维护一个Session ID数据库了,降低了服务端压力
-
Jwt:Token 的一种具体实现标准,明确定义了token需要包含的格式与信息
-
Header:令牌+加密算法信息
-
Payload:传输的数据
-
Signature:对Header签名,保证令牌没有篡改
-

-
Cookie + Jwt的状态存储
-
服务端接收未带有jwt的客户端验证请求,服务端验证通过后,会通过加密算法提取登录信息生成jwt
-
服务端将Resbonse报文携带jwt返回客户端,客户端浏览器通过Cookie存储jwt
-
后续客户端对服务端同一域名的请求中,客户端请求携带jwt
-
服务端接收带有jwt的客户端请求,服务端会对jwt进行安全校验。如果验证通过可直接登录
-
Jwt除了使用Cookie存储也可以直接在请求头的Authorization中存储
-
Jwt的常见应用流程
-
首次登录:客户端请求(无token) -> login页面 -> 对应Controller生成JWT -> 返回token给客户端
-
后续请求:客户端(携带token)-> 其他page页面 -> 拦截器验证token -> 对应Controller
-
6. 连接管理
-
短链接:每发出一次HTTP请求,建立一个TCP连接。HTTP/1.0默认使用短链接。
-
长连接:多个HTTP请求,复用同一个TCP连接,由HTTP请求行
{Connection:keep-alive}控制。HTTP/1.1默认使用长连接。
7. HTTPS:指的是TCP和HTTP之间使用SSL隧道进行通信,即 HTTP + SSL。
-
加密
-
对称加密:加密与解密的密钥相同
-
非对称加密:使用公开密钥加密,使用私有密钥解密。
-
-
认证:服务器向证书认证机构CA申请认证,CA会服务器的公开密钥签名,分发给客户端。CA认证收费。
-
总结:与HTTP的区别
-
优点:HTTPS 能够加密(防窃听)、认证(防伪装)、完整性保护(防篡改)
-
缺点:速度会更慢,证书要付费
-
8. HTTP/2.0
-
二进制格式
-
多路复用:将单个请求拆分为帧,不同的帧使用单个TCP交错发送
解决了HTTP 1.1 使用阻塞队列导致的等待问题
-
首部压缩:缓存请求头信息
HTTP发展脉络总结:
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
| 连接方式 | 短连接 | 持久连接 | 多路复用 | QUIC流 |
| 传输格式 | 文本 | 文本 | 二进制 | 二进制 |
| 头部处理 | 无压缩 | 无压缩 | HPACK | QPACK |
| 队头阻塞 | 严重 | 存在 | 应用层解 | 完全解决 |
| 加密要求 | 无 | 无 | 非必须 | 强制加密 |
| 典型延迟 | 高 | 中 | 低 | 极低 |
| 移动网络适应 | 差 | 一般 | 较好 | 优秀 |
4.3 WebSocket协议
-
什么是WebSocket协议:基于TCP,HTTP的双向通信协议,解决了服务器与客户端双工通信的问题
-
WebSocket协议的特点:
-
可靠传输:建立在TCP之上,是可靠性传输协议
-
保持连接:WebSocket支持持久连接
-
全双工通信:WebSocket是双向通信协议,服务器可以向客户主动推送数据
-
-
WebSocket与HTTP的关系:
-
都是应用层协议,均建立在TCP的基础上
-
WebSocket是基于HTTP完成的,其一部分握手借用了HTTP完成
-
-
WebSocket握手的过程:
-
客户端发起HTTP请求,包含Upgrade请求头,表明升级协议为WebSocket
-
服务器收到请求,如果支持WebSocket,返回101状态码,HTTP完成升级
-
-
WebSocket通信机制:使用消息帧传输数据
-
FIN:指示是否是消息的最后一个帧。
-
Opcode:指示帧的类型(如文本、二进制、关闭等)。
-
Payload Length:指示有效载荷的长度。
-
Payload Data:实际的数据。
-
WebSocket 的消息帧设计已经足够高效,不需要额外的 ACK 机制
6. WebSocket的应用:消息推送
4.4 负载均衡
-
什么是负载均衡:将网络流量分摊到多个服务器的技术
-
为什么需要负载均衡:分摊网络请求,实现高可用,高性能
-
负载均衡的基本原理:负载均衡器接收并分发请求
-
负载均衡的常见算法:
-
轮询法:依次分配
-
最少链接法
-
源地址哈希法
-
-
负载均衡的实现方法:
-
硬件负载均衡器:一些交换机内置负载均衡器
-
软件负载均衡器:Nginx(默认使用轮询)
-
5. 面试常见问题
5.1 Web页面的请求过程是什么?
-
联网
-
获取IP地址:路由器使用DHCP从ISP获取IP地址
-
ARP解析:客户端获取IP地址后,向路由器发送ARP请求
-
DNS解析域名
-
浏览器输入URL进行访问
-
获取DNS服务器IP:在DHCP从ISP获取IP的同时,也会提供默认DNS。另外也可以手动配置
-
访问DNS服务器:利用网络层的网关协议(RIP,OSPF,BGP),查找DNS服务器的IP
-
DNS解析域名:DNS服务器在数据库中查找域名对应的IP,放入IP数据报返回
-
HTTP请求
-
建立TCP连接:客户端与服务器三次握手,建立TCP连接
-
发送HTTP请求:浏览器生成HTTP GET报文,发送给服务器
-
响应HTTP请求:服务器响应报文,发送Web内容
-
浏览器渲染:客户端浏览器渲染HTML/JS文本,进行绘制
-
断开TCP连接:客户端与服务器四次挥手,断开TCP连接

5.2 TCP连接为什么要挥手3次?2次可不可以?
不可以。第 3 次握手的作用是防止迟滞报文。
存在一种情景:客户端首先发送了一个TCP连接请求,由于某些原因该请求迟滞在网络中。于是,客户端重新发送了一个新的TCP请求,被服务器接收,建立了TCP连接。最后,客户端和服务器在通信后断开连接。此时,迟滞的连接请求被服务器接收,那么:
如果只握手 2 次,那么服务器会发出ACK确认报文,并建立TCP连接。舍弃的报文重新连接,发生错误。
如果握手 3 次,那么服务器会发出ACK确认报文,等待客户端的确认。此时客户端比对ACK序号,发现是错误连接,遂不回复/发出错误报告。服务器在没有接受报文/接收错误报文后,放弃连接。
5.3 TIME_WAIT是什么?存在的意义是什么?
TIME_WAIT指的是断开TCP连接的四次挥手过程中,在客户端发送最后一次确认报文后,会进入TIME_WAIT状态,这个状态的时长为2MSL。MSL指的是Maximum Segment Lifetime,即报文最长寿命。TIME_WAIT存在的目的是:
确保最后的ACK报文能够到达服务端,确保可靠的关闭
服务端在第三次回收之后,进入监听状态,等待ACK报文,时长小于等于1MSL。如果此期间未收到ACK报文,会进行超时重传,重新发送FIN报文,要求客户端重新发送ACK报文。
对于客户端来说,从接收到第三次挥手的FIN报文,再到可能接收到的FIN报文时长总共不超过2MSL,即ACK报文的发送与FIN报文的接收。为了保证TCP连接能够正常关闭,服务端能够正常接收ACK报文,需要进入长达2MSL的TIME_WAIT状态。
防止新旧连接之间的混淆
在TIME_WAIT期间,客户端不会发送新的报文,即便客户端有新的连接请求,也会在这之后发送。防止服务端误将新的连接请求,当作旧连接的重启。
5.4 TCP协议是怎么处理异常的?
TCP有Keep-Alive机制。TCP建立连接后,为了保持可靠传输,每隔一段时间会发送心跳检测报文,如果服务器没有响应,TCP协议会使连接自动断开。
5.5 粘包问题是什么?怎么解决?
TCP的粘包问题指的是多个数据包被粘在一起,仅看TCP无法区分数据分片。原因是TCP是面向字节流的通信协议,他的拥塞控制机制使得数据包不是以报文为单位发送的。
解决方案:
-
给数据包添加标识:开头附带长度,结尾添加分隔符
-
升级协议:升级为HTTP,WebSocket
5.6 WebSocket是怎么应用于业务的?
WebSocket是基于HTTP实现的,因为HTTP协议是互联网最基础,广泛使用的协议,兼容性很强。通过HTTP协议升级WebSocket的方法,可以复用基础设施,简化开发。
WebSocket的应用场景有二:
-
需要进行实时数据更新的场景
-
需要服务器进行主动推送的场景
这都利用了WebSocket全双工通信的特点。通过保持连接,数据的实时更新不需要像HTTP的请求-响应模式,每次通信都需要确认,提高效率,实现了实时数据更新。通过全双工通信,服务器可以主动向每一个保持连接的客户端广播。而传统的HTTP Web项目只能通过轮询(客户端定期向服务器发送HTTP请求)的方式实现。当然,使用消息队列也可以实现同样效果。
Spring Boot集成websocket可以通过原生注解来实现
5.7 HTTP协议不同版本之间的区别是什么?
HTTP/1.0:不支持长连接。没有Host头
HTTP/1.1:支持长连接,且默认为长连接。引入Host头。引入了PUT,DELETE等请求方法
HTTP/2.0:优化了HTTP性能,包括二进制分帧,多路复用,头部压缩,流量控制
5.8 推流是怎么实现的?
推流指的是将音频,视频等多媒体数据通过网络传输到服务器或云端,再将数据分发给多个用户进行播放的过程。推流常用于实现直播、视频会议、视频监控等实时播放的场景。
推流基于UDP或TCP实现通信,RTP作为载体,主要流程为:视频采集、视频编码、媒体传输、视频解码、视频播放
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)