计算机网络篇——面试
1. 到底什么是 TCP 连接?
TCP 连接的定义
TCP(传输控制协议)是一个面向连接的传输层协议。TCP 连接是通过 三次握手 确立的可靠数据通信链路,保证了在不可靠网络(如互联网)上的数据传输的准确性、有序性和完整性。
TCP 连接的特性
- 面向连接: 通信前建立连接(三次握手),通信结束释放连接(四次挥手)。
- 可靠传输: 提供数据分段、确认(ACK)、重传机制,确保数据不丢失、不重复。
- 有序传输: 数据按序号重组,确保顺序。
- 全双工: 支持双向同时通信。
- 流量控制与拥塞控制: 防止发送过快或网络拥堵。
2. HTTP 1.0 和 HTTP 2.0 有什么区别?
| 特性 | HTTP 1.0 | HTTP 2.0 | 
|---|---|---|
| 连接复用 | 不支持,每次请求需建立新连接(无连接复用)。 | 支持多路复用,一个 TCP 连接可发送多个请求。 | 
| 传输格式 | 基于纯文本。 | 基于二进制帧,效率更高。 | 
| 头部压缩 | 不支持,头部信息冗余较大。 | 支持 HPACK 算法压缩,减少网络传输量。 | 
| 服务器推送 | 不支持。 | 支持服务端主动推送资源(Server Push)。 | 
| 队头阻塞 | 存在,阻塞一个请求会影响整个连接性能。 | 解决了应用层的队头阻塞问题(但仍有 TCP 层问题)。 | 
3. HTTP 2.0 和 HTTP 3.0 有什么区别?
| 特性 | HTTP 2.0 | HTTP 3.0 | 
|---|---|---|
| 底层协议 | 基于 TCP 协议。 | 基于 QUIC 协议(UDP)。 | 
| 连接建立 | 需要 TCP 三次握手+TLS 握手,延迟较高。 | 支持 0-RTT 快速握手,大幅降低延迟。 | 
| 队头阻塞 | 存在 TCP 队头阻塞问题。 | 无队头阻塞(QUIC 的流独立)。 | 
| 加密传输 | 通过 TLS 实现加密。 | 内置加密,数据始终安全传输。 | 
| 部署 | 需要依赖操作系统的 TCP 协议栈支持。 | 基于用户态协议,灵活易更新。 | 
4. HTTP 和 HTTPS 有什么区别?
| 特性 | HTTP | HTTPS | 
|---|---|---|
| 安全性 | 明文传输,容易被窃听或篡改。 | 数据加密传输,防止窃听和篡改。 | 
| 协议 | 基于 HTTP 协议。 | HTTP+SSL/TLS 实现加密。 | 
| 端口 | 默认使用端口 80。 | 默认使用端口 443。 | 
| 性能 | 无需加密计算,性能略高。 | 数据加密解密需额外计算,性能略低。 | 
| 证书需求 | 无需证书。 | 需要申请 SSL 证书,成本较高。 | 
5. TCP 是用来解决什么问题?
TCP 的主要问题解决:
- 可靠传输: 确保数据包正确、无丢失地到达目标。 - 解决:序列号、确认机制、超时重传。
 
- 顺序传输: 确保数据包按发送顺序到达。 - 解决:序列号与接收端排序机制。
 
- 流量控制: 避免发送端数据过快,导致接收端处理不过来。 - 解决:滑动窗口协议。
 
- 拥塞控制: 避免网络拥堵,降低整体传输性能。 - 解决:慢启动、拥塞避免算法。
 
6. TCP 和 UDP 有什么区别?
| 特性 | TCP | UDP | 
|---|---|---|
| 连接方式 | 面向连接(需三次握手)。 | 无连接,直接发送。 | 
| 可靠性 | 可靠传输,有确认和重传机制。 | 不可靠传输,无确认机制。 | 
| 数据顺序 | 有序传输,接收方数据按序排列。 | 无序传输,数据可能乱序。 | 
| 开销 | 开销较大,需要维护连接状态和控制信息。 | 开销较小,无需连接管理。 | 
| 速度 | 速度较慢,但稳定。 | 速度快,但可能丢包。 | 
| 适用场景 | 文件传输、Web 浏览、邮件等需要可靠性的场景。 | 视频直播、在线游戏、DNS 查询等需要低延迟的场景。 | 
7. TCP 的粘包和拆包能说说吗?
粘包和拆包的定义:
- 粘包: 多个小数据包被合并为一个包,接收端无法区分数据边界。
- 拆包: 一个大数据包被拆分为多个小包传输。
产生原因:
-  粘包: - 发送端将多个小数据包合并为一个大数据包(节约资源)。
- TCP 流是无边界的,接收端无法判断每个数据包的分界点。
 
-  拆包: - 单个数据包大小超过了 TCP 最大传输单元(MTU)。
 
解决方法:
-  固定长度协议: - 每个数据包规定固定长度,接收端按长度解析。
 
-  分隔符协议: - 使用特定分隔符(如 \n或\r\n)标记数据边界。
 
- 使用特定分隔符(如 
-  长度前缀协议: - 在数据包前附加长度信息,接收端根据长度解析。
 
示意图:
- 粘包:发送端:包1[Hello] + 包2[World] => 合并为 [HelloWorld] 接收端:无法区分 Hello 和 World。
- 拆包:发送端:包 [LargeData] 接收端:分为 [Large] 和 [Data]
代码举例:
# 粘包问题示例:发送两条消息,但接收端读取到的是拼接后的数据
client.send("Hello".encode())
client.send("World".encode())# 接收端可能收到:HelloWorld
1. 说说 TCP 的三次握手?
TCP 的三次握手是建立连接的过程,用于确保通信双方都准备好数据传输并确认网络稳定。
三次握手步骤:
-  第一次握手(SYN): 
 客户端发送一个带 SYN(同步)标志的数据包,表示请求建立连接,同时指明自己的初始序列号 (Seq = x)。
-  第二次握手(SYN-ACK): 
 服务器收到客户端的 SYN 后,发送一个带 SYN 和 ACK 标志的数据包,表示同意连接,并告知自己的初始序列号 (Seq = y) 和确认号 (Ack = x+1)。
-  第三次握手(ACK): 
 客户端收到 SYN-ACK 后,发送一个带 ACK 标志的数据包,确认号 (Ack = y+1),表示握手完成,连接建立。
示意图:
客户端                服务端|---SYN(x)--->||<--SYN-ACK(y)-||---ACK(x+1)--->|
连接建立成功
2. 说说 TCP 的四次挥手?
TCP 的四次挥手是断开连接的过程,用于保证双方都可以正常关闭通信。
四次挥手步骤:
-  第一次挥手(FIN): 
 客户端发送一个带 FIN 标志的数据包,表示数据发送完毕,请求关闭连接。
-  第二次挥手(ACK): 
 服务器收到 FIN 后,发送 ACK 确认,表示同意关闭连接,但可能还有未处理完的数据。
-  第三次挥手(FIN): 
 服务器处理完数据后,发送 FIN 请求,表示可以关闭连接。
-  第四次挥手(ACK): 
 客户端收到 FIN 后,发送 ACK 确认,并进入 TIME_WAIT 状态,等待一段时间以确保服务器收到 ACK。
示意图:
客户端                服务端|---FIN--->||<---ACK---||<---FIN---||---ACK--->|
连接断开成功
3. 为什么 TCP 挥手需要有 TIME_WAIT 状态?
TIME_WAIT 的作用:
-  确保数据的可靠性: - 确保服务器收到客户端的最后一个 ACK,如果服务器未收到,会重新发送 FIN。
 
-  避免端口重用: - 等待旧连接的残留数据清理完毕,避免新连接受到干扰。
 
TIME_WAIT 的持续时间:
- 通常为 2 × 最大报文段寿命(2×MSL),约 60~240 秒。
4. TCP 超时重传机制是为了解决什么问题?
超时重传机制的目的:
确保数据可靠传输,即使由于网络丢包、拥塞等原因导致数据包未被接收。
工作流程:
- 发送方发送数据包并启动定时器。
- 若在超时时间内未收到确认(ACK),则重新发送数据包。
- 若多次超时仍无响应,则认为连接中断。
关键参数:
- RTT(Round Trip Time): 确认包的往返时间。
- RTO(Retransmission Timeout): 超时时间动态调整,通常为 RTT 的倍数。
5. TCP 滑动窗口的作用是什么?
滑动窗口的作用:
控制数据的流量,防止发送方发送过快导致接收方处理不过来。
特点:
- 动态调整窗口大小: - 窗口大小表示发送方可连续发送的最大数据量,无需逐一等待确认。
 
- 提高传输效率: - 通过批量发送多个数据包,减少等待时间。
 
示意图:
滑动窗口机制:
窗口大小 = 4
发送方: [1] [2] [3] [4] | [5] [6]
接收方: ACK [1] => 滑动窗口更新 => [5] 可发送
6. TCP/IP 四层模型是什么?
TCP/IP 模型层次:
-  应用层: 
 提供用户直接使用的网络服务(如 HTTP、DNS、SMTP)。
-  传输层: 
 提供可靠或不可靠的端到端通信(如 TCP、UDP)。
-  网络层: 
 确定路由并传输数据包(如 IP 协议)。
-  网络接口层: 
 定义数据在物理网络上的传输方式(如 Ethernet)。
7. OSI 七层模型是什么?
| 层次 | 功能描述 | 示例协议 | 
|---|---|---|
| 应用层 | 为用户提供网络服务接口。 | HTTP、FTP、SMTP | 
| 表示层 | 数据格式转换和加密解密。 | SSL、TLS | 
| 会话层 | 建立、管理和终止会话。 | NetBIOS | 
| 传输层 | 提供可靠传输或无连接服务。 | TCP、UDP | 
| 网络层 | 选择路由并传输数据包。 | IP、ICMP、ARP | 
| 数据链路层 | 确保数据在同一网络中的节点间可靠传输。 | Ethernet、PPP | 
| 物理层 | 负责硬件设备间的数据传输。 | 光纤、电缆等传输介质。 | 
8. Cookie、Session、Token 之间有什么区别?
| 特性 | Cookie | Session | Token | 
|---|---|---|---|
| 存储位置 | 客户端浏览器。 | 服务器端。 | 客户端,通常结合 Authorization 头传输。 | 
| 安全性 | 较低,易被篡改或劫持。 | 较高,敏感数据存储在服务器。 | 高,通过签名防篡改。 | 
| 生命周期 | 有效期受限于设置的失效时间。 | 随 Session 存续,通常依赖 Cookie。 | 有效期受限于令牌的过期时间。 | 
| 适用场景 | 简单状态管理(如购物车)。 | 用户认证、敏感数据操作。 | 跨域认证、分布式系统。 | 
9. 如何解决页面请求接口大规模并发问题?
解决思路:
-  前端优化: - 合并请求:减少接口调用次数。
- 缓存策略:使用浏览器缓存或 CDN。
- 限流:对请求进行排队或批量处理。
 
-  服务端优化: - 负载均衡: 使用 Nginx 或 LVS 分担流量。
- 分布式架构: 数据库、缓存服务(如 Redis)分片部署。
- 数据库优化: 建立索引、读写分离。
 
-  缓存机制: - 使用 CDN 分担流量压力。
- 热点数据缓存到 Redis 或 Memcached。
 
-  消息队列: - 使用 RabbitMQ、Kafka 等,将请求异步化,平滑高峰流量。
 
-  监控与扩展: - 监控系统性能,动态扩展服务器。