面试着重考察应用层(HTTP, DNS)、运输层(TCPUDP)的协议

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协议

  1. IP协议:定义主机的网络标识

    1. 定义数据包格式(IP报文头)

    2. 提供逻辑地址系统(IP地址)

    3. 实现跨网络路由选择

    4. 完成数据包的分片与重组

  2. IP地址:共32位,分为4组

    1. 掩码计算:网络位全1,主机位全0(255.255.255.0对应24位掩码)

    2. CIDR表示法:IP地址/掩码位数(如192.168.1.0/24

    3. 子网地址:每个子网的首地址为网络地址,末地址为广播地址

  3. 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协议

  1. Address Resolution Protocol地址解析协议:维护MAC-IP映射表

  2. 获取 MAC-IP 映射:主机的ARP缓存表没有存储MAC-IP映射

举例:主机A 需要获取 主机B 的MAC地址

  1. 主机A以广播方式发送一个ARP请求报文,此时目标MAC置0

  2. 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,发现一致

  3. 主机B存储主机A的MAC-IP信息,以单播方式返回完整ARP响应报文

2.3 路由协议

  1. 路由协议:用于确定数据包在多个网络中的传输路径

  2. 路由表:每个路由器记录下一跳的IP

  3. 路由更新算法:路由协议维护和更新路由表的方法

  4. RIP: 距离向量路由协议

  • 网络结构:整个网络节点平级,网络是无向图

  • 路由表更新机制:

    • 周期性广播:每30秒全量广播路由表,导致带宽浪费和收敛慢

    • 触发更新:仅在网络变化时发送增量更新(需手动配置)

  • 路由更新算法:Bellman最短路径算法

每次网络结构更新,路由协议将本节点到所有其他节点的距离,发送给相邻节点,直到所有节点的距离向量被更新。最终每个节点都得到了到达目的节点的最短距离。

  • 适用范围:小型网络

RIP的路由算法使得每次网络更新,整体网络的路由器都会更新路由表,开销大

        5. OSPF: 链路状态路由协议

  • 网络结构:网络分层

    • 层级内部仅存储内部路由信息

    • 层级暴露一个路由器接口,自治系统边界路由器ASBR

    • 层级之间信息由区域边界路由器ABR管理

  • LSDB:存储路由器所在OSPF区域内的所有链路状态信息

    • 触发更新:网络变化时立即发送LSA(链路状态通告),仅传播变化部分。

    • LSA刷新:每30分钟刷新一次LSA以确保数据库一致性

  • 路由更新算法:Dijkstra

3. 运输层协议

3.1 UDP用户数据报协议

  1. 特点

    1. 无连接:发送数据之前不需要建立连接

    2. 尽最大努力交付:不保证可靠交付

    3. 面向报文:一次传送并交付一个完整的报文

    4. 没有拥塞控制:网络拥塞不改变报文的发送速率

    5. 支持多对多:支持 1/n:1/n

    6. 首部开销小:包括端口信息、数据报长度、校验和,仅8字节

  2. 通信流程:UDP数据报镶嵌在IP数据报内,指定IP接收UDP数据报后根据首部寻找端口。UDP报错由ICMP发送。

  3. 使用场景

    1. 时效性强:视频会议,在线游戏

    2. 情景简单:DNS解析,物联网

  4. 综合评价:UDP通信简单,传输速率快,但不可靠

3.2 TCP传输控制协议

  1. 什么是TCP协议:面向连接的,提供可靠交付的,面向字节流的,可以进行拥塞控制的通信协议

    1. 面向连接:发送数据前需要建立一对一的连接

    2. 提供可靠交付:通过连接提供可靠交付

    3. 面向字节流:一次传送并交付一个数据块,控制字节(多个数据块)序列。

    4. 拥塞控制:缓存机制

  2. 面向连接的实现

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. 面向字节流的实现:滑动窗口

  1. 滑动窗口实现可靠传输

  2. 滑动窗口实现流量控制:粘包与拆包

    • 粘包:发送方写入数据<接收方socket缓冲区大小,会合并多个TCP数据

    • 拆包:发送方写入数据>接收方socket缓冲区大小,会拆分TCP数据

5. 流量控制的实现:接收窗口rwnd,发送方会根据接收方rwnd的大小控制发送速度

6. 拥塞控制的实现:

  1. 拥塞窗口cwnd:根据网络状态限制发送窗口的大小

  2. 拥塞控制算法:慢开始、拥塞避免

  3. 拥塞控制算法:快重传、快恢复

慢开始:从1开始指数增长

拥塞避免:达到阈值,缓慢加1

超时:阈值变为窗口大小的一半,重新慢开始

快重传:收到3个重复的seq,立刻重传seq+1

快恢复:快重传后,阈值变为窗口大小的一半,进入拥塞避免

7. 综合评价:TCP通信流程复杂,传输速率慢,但是通信可靠

4. 应用层协议

4.1 DNS协议

  1. IP和域名的关系:IP:域名=1:n,单个IP可以有多个域名

  2. DNS授权模型:倒置点分字符串的树形结构寻址

3. DNS服务器查询全过程

  • 多级缓存查询:查询过程类似于多级缓存,不存储全部子节点信息。只有未命中时,才会向父节点发出递归查询请求

  • 分布式授权管理:如果某个域名对应的IP改变了,只需要通知父节点即可

4.2 HTTP超文本传输协议

  1. 什么是HTTP:基于TCP的无状态的超文本传输协议

    1. 超文本:可以使用超链接跳转的文本

    2. 无状态:不记录连接状态,每次请求是独立的

  2. 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.0HTTP/1.1HTTP/2HTTP/3
​连接方式短连接持久连接多路复用QUIC流
​传输格式文本文本二进制二进制
​头部处理无压缩无压缩HPACKQPACK
​队头阻塞严重存在应用层解完全解决
​加密要求非必须强制加密
​典型延迟极低
​移动网络适应一般较好优秀

4.3 WebSocket协议

  1. 什么是WebSocket协议:基于TCP,HTTP的双向通信协议,解决了服务器与客户端双工通信的问题

  2. WebSocket协议的特点:

    1. 可靠传输:建立在TCP之上,是可靠性传输协议

    2. 保持连接:WebSocket支持持久连接

    3. 全双工通信:WebSocket是双向通信协议,服务器可以向客户主动推送数据

  3. WebSocket与HTTP的关系:

    1. 都是应用层协议,均建立在TCP的基础上

    2. WebSocket是基于HTTP完成的,其一部分握手借用了HTTP完成

  4. WebSocket握手的过程:

    1. 客户端发起HTTP请求,包含Upgrade请求头,表明升级协议为WebSocket

    2. 服务器收到请求,如果支持WebSocket,返回101状态码,HTTP完成升级

  5. WebSocket通信机制:使用消息帧传输数据

    1. FIN:指示是否是消息的最后一个帧。

    2. Opcode:指示帧的类型(如文本、二进制、关闭等)。

    3. Payload Length:指示有效载荷的长度。

    4. Payload Data:实际的数据。

WebSocket 的消息帧设计已经足够高效,不需要额外的 ACK 机制

        6. WebSocket的应用:消息推送

4.4 负载均衡

  1. 什么是负载均衡:将网络流量分摊到多个服务器的技术

  2. 为什么需要负载均衡:分摊网络请求,实现高可用,高性能

  3. 负载均衡的基本原理:负载均衡器接收并分发请求

  4. 负载均衡的常见算法:

    1. 轮询法:依次分配

    2. 最少链接法

    3. 源地址哈希法

  5. 负载均衡的实现方法:

    1. 硬件负载均衡器:一些交换机内置负载均衡器

    2. 软件负载均衡器:Nginx(默认使用轮询)

5. 面试常见问题

5.1 Web页面的请求过程是什么?

  • 联网

  1. 获取IP地址:路由器使用DHCP从ISP获取IP地址

  2. ARP解析:客户端获取IP地址后,向路由器发送ARP请求

  • DNS解析域名

  1. 浏览器输入URL进行访问

  2. 获取DNS服务器IP:在DHCP从ISP获取IP的同时,也会提供默认DNS。另外也可以手动配置

  3. 访问DNS服务器:利用网络层的网关协议(RIP,OSPF,BGP),查找DNS服务器的IP

  4. DNS解析域名:DNS服务器在数据库中查找域名对应的IP,放入IP数据报返回

  • HTTP请求

  1. 建立TCP连接:客户端与服务器三次握手,建立TCP连接

  2. 发送HTTP请求:浏览器生成HTTP GET报文,发送给服务器

  3. 响应HTTP请求:服务器响应报文,发送Web内容

  4. 浏览器渲染:客户端浏览器渲染HTML/JS文本,进行绘制

  5. 断开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作为载体,主要流程为:视频采集、视频编码、媒体传输、视频解码、视频播放

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐