四大金刚之计算机网络
1. OSI 七层模型 vs TCP/IP 四层模型? 每层的功能和协议有哪些?
2. 数据封装过程?
- 应用层
- 数据来源:用户应用(比如浏览器发起 HTTP 请求)。
- 操作:应用层生成原始数据(HTTP 报文)。
- 输出:应用层数据(message)。
- 传输层
- 功能:负责端到端传输,标识源端口和目标端口,可靠性控制。
- 操作:加上 传输层首部(TCP/UDP 头),包含:源端口、目的端口、序列号、校验和等。
- 输出:段 Segment(TCP Segment / UDP Datagram)。
- 网络层
- 功能:逻辑寻址和路由选择。
- 操作:加上 网络层首部(IP 头),包含:源 IP 地址、目的 IP 地址、TTL、协议号等。
- 输出:分组 Packet(IP Packet)。
- 数据链路层
- 功能:成帧,链路寻址,差错检测。
- 操作:加上 帧首部和帧尾部(MAC 地址,CRC 校验码等)。
- 输出:帧 Frame。
- 物理层
- 功能:传输比特流。
- 操作:把帧转换为电信号/光信号/无线电波进行传输。
- 输出:比特流 Bit Stream。
3. TCP 粘包/拆包?
- 粘包(Sticky Packet):
多个 应用层消息 在 TCP 传输时被合并到一个 TCP 报文里,接收方一次read()
读到多个消息。 - 拆包(Half Packet):
一个应用层消息太大,被拆成多个 TCP 报文,接收方一次read()
只能读到一部分。
粘包和拆包并不是 TCP 的错误,而是 TCP 字节流特性导致应用层无法直接区分消息边界。
为了解决这个问题,需要 人为设计应用层协议,常见方法有:
- 固定长度消息;
- 每条消息长度固定,比如 128 字节;
- 如果不足 → 补空格或特殊填充符。
- 优点:简单,解码逻辑快;
- 缺点:浪费带宽,不适合大多数业务场景。
- 使用分隔符;
- 每条消息结尾加上一个分隔符,例如
\n
、|
; - 接收端根据分隔符来切割消息。
- 优点:实现简单,常见于文本协议(HTTP/1.0、SMTP、FTP)。
- 缺点:分隔符可能出现在正文,需要转义。
- 每条消息结尾加上一个分隔符,例如
- 使用“消息头 + 消息体”的格式(最常用)。
- 在消息前添加一个 固定长度的头部(例如 4 字节),存放消息体的长度;
- 接收端先解析头部,知道接下来要读多少字节。
- 优点:灵活高效,适合二进制协议,主流框架(Netty、gRPC、Kafka)都采用这种方式。
- 缺点:协议解析稍复杂,但最通用。
4. UDP 有哪些应用场景?
UDP 常用于对 实时性要求高、对可靠性要求不那么严格 的场景。
典型应用有:
- 实时音视频(VoIP、直播、视频会议);
- 网络游戏(低延迟比可靠更重要);
- DNS、DHCP 等请求响应型协议;
- 物联网设备上报(CoAP);
- 流媒体传输(RTP、RTSP);
- 新一代传输协议 QUIC/HTTP3。
5. 滑动窗口与流量控制?
TCP 是 面向字节流的可靠传输协议。如果发送方每次都等接收方返回 ACK 确认再继续发数据,就会导致 传输效率低。
为了解决这个问题,TCP 引入了 滑动窗口机制:
- 窗口大小:接收方通过 ACK 报文中的 Window 字段 告诉发送方自己还能接收多少字节。
- 滑动:随着接收方处理并确认一部分数据,窗口会向前滑动,发送方就可以继续发送新的数据。
- 效果:这样发送方能在没有收到所有 ACK 之前,持续批量发送数据,实现 流水线传输,大幅提升效率。
同时,窗口大小由接收方决定,这就天然实现了 流量控制:
- 当接收方处理不过来时,窗口缩小甚至为 0,发送方必须停发;
- 当接收方处理完成释放了缓存,窗口再扩大,发送方继续发送。
滑动窗口既是 TCP 提升传输效率的机制,也是实现流量控制的核心手段。
6. 拥塞控制策略?
“流量控制”是为了防止 接收方被压垮,而 拥塞控制 是为了防止 网络被压垮。
TCP 发送方要根据 网络的承载能力 来调整发送速率,避免过量数据导致路由器丢包、超时重传。
核心是维护一个变量 拥塞窗口(cwnd, Congestion Window):
- 实际发送窗口 =
min(cwnd, rwnd)
- 实际发送窗口 =
cwnd
:网络拥塞控制窗口rwnd
:接收方流量控制窗口
TCP 拥塞控制的四大算法:
- 慢启动:cwnd 从小开始指数增长;
- 拥塞避免:达到阈值后,cwnd 线性增长;
- 快速重传:三个重复 ACK 就立即重传丢失分段;
- 快速恢复:丢包后 cwnd 减半,并线性增长,而不是回到 1 MSS。
7. TIME_WAIT 是什么?
TIME_WAIT 的定义
TIME_WAIT
状态,也叫 2MSL(Maximum Segment Lifetime)等待状态。- 出现的时机:
在 TCP 四次挥手过程中,主动关闭连接的一方(通常是客户端)在发送了最后一个ACK
后会进入TIME_WAIT
状态。
为什么需要 TIME_WAIT有两个关键原因:
- 确保对方收到最后的 ACK
- 在四次挥手中,最后一次
ACK
可能会丢失。 - 如果对方(被动关闭方)没有收到 ACK,会重发
FIN
。 - 处于
TIME_WAIT
的一方还能重新发送 ACK,保证连接能可靠关闭。
- 在四次挥手中,最后一次
- 保证老连接的数据不会影响新连接
- TCP 是面向字节流的,老连接里可能还存在未到达的延迟报文。
- 通过等待 2 倍的 MSL 时间(报文在网络中存活的最长时间),确保旧连接的数据包在网络中完全消失,避免和新连接混淆。
8. TCP 怎么实现有序?
- 序列号(Sequence Number)
每个 TCP 字节流中的字节都有一个 唯一序列号。
发送方在发送数据段时,会标注 序列号。
接收方根据序列号可以 按顺序重组数据。
举例:
数据流:ABCDEFG
分段发送:A(Seq=1)、B(Seq=2)、C(Seq=3)
接收方收到 C, A, B → 按序列号重新排列:A, B, C
- 确认号(ACK)
接收方对收到的字节流发送 确认号(表示下一个期望接收的字节序列号)。
发送方根据 ACK 判断哪些数据已经被接收,并继续发送后续数据。
- 滑动窗口
TCP 使用 滑动窗口 支持 流水线传输。
发送方可以在未收到所有 ACK 的情况下继续发送窗口范围内的数据。
接收方利用接收窗口告知发送方可以接收的数据量,从而 保证按顺序接收。
- 乱序数据缓存与重组
接收方可能会收到 乱序报文(比如网络延迟不同)。
TCP 会在内存中 缓存乱序数据,等待缺失的前面报文到达,再按序交给应用层。
- 丢包重传机制
如果发送方在 超时时间 内没有收到 ACK,或者收到 重复 ACK,就会 重传丢失的报文。
结合序列号和 ACK,保证最终 应用层收到的数据是完整且有序的。
9. IP 地址分类与子网划分?
IPv4 地址分为 A/B/C/D/E 类,A/B/C 类用于普通主机网络,D 类用于多播,E 类保留。
子网划分是通过 借用主机位作为子网位 来创建多个小网络,每个子网都有独立的网络地址、广播地址和可用主机地址范围。
子网掩码表示网络位和主机位,通过 /n
或点分十进制形式表示。
10. ARP 和 RARP 是什么?
ARP (Address Resolution Protocol, 地址解析协议)
作用:在局域网内,把 IP 地址 → MAC 地址。
- IP 用于网络层寻址,但最终在局域网中通信需要依靠 MAC 地址。
- 当主机要向同一局域网的另一台主机发送数据时,会先知道对方的 IP 地址,但不知道 MAC 地址,就要用 ARP。
RARP (Reverse Address Resolution Protocol, 反向地址解析协议)
作用:把 MAC 地址 → IP 地址。
- 早期场景:一些无盘工作站(diskless workstation)只有网卡,没有硬盘,开机后只知道自己的 MAC 地址,但不知道该用哪个 IP 地址。
- 于是它广播 RARP 请求,请求服务器告诉它应该用的 IP 地址。
应用层数据 → 传输层 → 网络层 → 数据链路层 → 物理层
- 传输层(TCP/UDP)
- 把应用层数据加上 TCP/UDP 头,形成 报文段(Segment)。
- TCP:面向连接、可靠;UDP:无连接、尽力而为。
- 网络层(IP 协议)
- 在报文段外加上 IP 头,形成 IP 数据包(Packet)。
- IP 头里有源 IP、目的 IP。
- 数据链路层(Ethernet、PPP 等)
- 在 IP 数据包外加上 MAC 头(源 MAC、目的 MAC),形成 数据帧(Frame)。
- 如果不知道目的 IP 对应的 MAC,需要先通过 ARP 查询(广播请求 + 单播应答)。
- 数据帧最后再加上 CRC 校验等。
- 物理层
- 把数据帧转换为电信号、光信号或无线电波,在物理媒介上传输。
11. ICMP 协议?
ICMP 是网络层的控制协议,用于报告 IP 层的错误和传递诊断信息(如 ping、traceroute),它本身不传输业务数据,而是 IP 协议的“反馈助手”。
- 全称:Internet Control Message Protocol(互联网控制报文协议)
- 位置:运行在 网络层,是 IP 协议的辅助协议
- 作用:主要用于 传递差错信息 和 网络状态信息,帮助网络进行诊断和控制。
⚠️ 注意:
- ICMP 不是传输层协议(不用于应用层数据传输),而是 封装在 IP 包里的报文。
- 例如,IP 层在转发数据包时出错,ICMP 就会回报。
12. NAT 的作用?
NAT 的核心作用是:在私网和公网之间进行地址转换,实现多个内网主机共享少量公网 IP 上网,同时起到隐藏和安全保护作用。
- 定义:一种在 网络层(IP 层) 实现的技术,用于在 私有 IP 地址 和 公网 IP 地址 之间进行转换。
- 背景:IPv4 地址不够用,而内网通常用 私有地址(如 192.168.x.x、10.x.x.x、172.16–31.x.x),这些地址在公网中不可路由。
- NAT 让多个内网主机 共享一个或少量公网 IP,从而访问外网。
13. 路由协议有哪些?
小网络用 RIP,企业网用 OSPF,运营商网用 IS-IS,互联网靠 BGP。
a. IGP(内部网关协议)
- RIP(Routing Information Protocol)
- 算法:距离向量(用跳数表示距离,最大 15 跳)
- 优点:简单、配置容易
- 缺点:收敛慢、规模小、环路问题
- 应用:小规模网络
- OSPF(Open Shortest Path First)
- 算法:链路状态(Dijkstra)
- 特点:收敛快,支持区域划分(分层次管理)
- 应用:大型企业网、运营商网
- IS-IS(Intermediate System to Intermediate System)
- 算法:链路状态
- 特点:与 OSPF 类似,但更适合超大规模运营商网
- 应用:电信运营商骨干网
b. EGP(外部网关协议)
- BGP(Border Gateway Protocol)
- 算法:路径向量
- 特点:控制互联网中自治系统之间的路由选择,是互联网的“核心路由协议”
- 当前版本:BGP-4
- 应用:互联网骨干网
14. DNS 的作用?
- 全称:Domain Name System(域名系统)
- 位置:应用层协议(基于 UDP/TCP 53 端口)
- 核心作用:将域名解析为 IP 地址(反之亦然),让用户可以用 人类友好的名字 访问网络资源,而不是记一堆 IP。
- DNS 的核心作用就是“域名到 IP 的翻译器”,同时也支持负载均衡、服务发现和高可用切换。
没有 DNS,用户只能记一堆 IP,互联网几乎没法用。
15. 对称加密 vs 非对称加密?
- 对称加密:AES、DES、3DES、ChaCha20
- 非对称加密:RSA、DSA、ECC、DH(密钥交换)
16. 常见攻击手段?
网络层攻击
DDoS / DoS:大量请求让服务器瘫痪
IP/ARP 欺骗:伪造 IP 或 MAC 窃听或篡改流量
中间人攻击(MITM):截获或篡改通信
应用层攻击
SQL 注入:输入恶意 SQL 改数据库
XSS:注入脚本窃取用户信息
CSRF:利用用户身份发起恶意请求
文件上传漏洞:上传 WebShell 或恶意文件
身份/密码攻击
暴力破解:穷举密码
会话劫持:窃取 Cookie 或 Token 冒充用户
社会工程学:钓鱼邮件、假冒电话获取信息
17. MQTT 的作用?
MQTT 是一种轻量级的发布/订阅消息传输协议,适合带宽受限或高延迟环境,常用于物联网设备、移动端消息推送和实时监控系统。
- 发布/订阅(Pub/Sub)模型:
- Publisher(发布者):发送消息到 主题(Topic)
- Subscriber(订阅者):订阅某个主题,接收消息
- Broker(消息代理服务器):负责接收、存储和分发消息
- 解耦了生产者和消费者,发布者和订阅者互不直接感知
18. 如何实现服务端推送?
HTTP 长轮询(Long Polling)
原理:客户端发起请求,如果没有数据,服务器 不立即返回,等有数据或超时才返回;客户端收到响应后立即重新发起请求。
特点:
简单,基于普通 HTTP
支持浏览器端、传统服务
缺点:客户端频繁请求,延迟高,开销大
WebSocket
原理:建立 TCP 全双工连接,服务端和客户端可以随时互发消息
特点:
双向通信、低延迟
适合实时聊天、游戏、股票行情等场景
服务器可直接向客户端推送数据
消息队列 + 推送
原理:服务端把消息发送到 MQ(如 Kafka、RabbitMQ、RocketMQ),然后推送到客户端
特点:
解耦业务逻辑和推送逻辑
支持分布式、消息可靠投递
可与 WebSocket 或 SSE 配合使用
19. 整体的网络协议交互
访问域名时,先通过 DNS 解析得到目标 IP;然后主机根据路由表选择下一跳,如果没有对应 MAC,就通过 ARP 获取;数据包由 IP 协议负责传输,中途若有错误会通过 ICMP 报告;如果跨私网和公网,还要经过 NAT 转换;至于 RIP、OSPF、BGP 等路由协议,它们不是直接传输数据,而是帮助路由器建立和维护路由表,确保数据能找到正确的路径。