面试题学习笔记 | 计算机网络 TCP 协议
在应用层之下,负责数据传输的是传输层,其中最主要的协议是 TCP 和 UDP。我们需要了解它们的特性、区别和设计思路,以便在开发时选择合适的传输方式,设计合理的接口和业务逻辑。
TCP 和 UDP 的区别是什么?
TCP 和 UDP 的区别可以从它们的全称看出。
TCP(Transmission Control Protocol)强调“控制”(Control),是一个对数据传输进行严格管理的协议(参考《图解 TCP/IP》)
UDP(User Datagram Protocol)不提供复杂的控制机制,而是依靠 IP 实现无连接的通信
具体来说,它们的区别包括以下几点:
连接方式:TCP 是面向连接的,UDP 是无连接的
数据可靠性:TCP 通过确认应答(ACK)和重传机制保证数据可靠传输,而 UDP 不保证数据可靠性
数据顺序:TCP 确保数据按顺序到达,UDP 不保证顺序
速度与开销:TCP 传输较慢但稳定,UDP 轻量、传输速度快
广播支持:TCP 不支持广播,UDP 支持
头部长度:TCP 头部长度可变(最小 20 字节),UDP 头部固定(8 字节)
因此,在实际应用中:
需要可靠传输和数据顺序保证时,选择 TCP(如 HTTP、FTP、邮件传输)
需要高速传输且能容忍数据丢失时,选择 UDP(如视频通话、在线游戏、DNS 查询)
TCP 解决了哪些问题?
TCP 通过一系列控制机制,解决了数据在不可靠的 IP 网络上传输的问题,主要包括:
1. 可靠传输
TCP 通过 序列号 和 确认应答(ACK) 机制保证数据的完整性和顺序
序列号:用于数据包排序,保证接收方能正确组装数据
ACK 机制:接收方收到数据后发送 ACK 确认,发送方若未收到 ACK,会在超时后重传数据
超时重传:超时时间(RTT + 偏差)通常以 0.5 秒为单位,第一个数据包通常超时设为 6 秒,超时后指数级增加重传间隔,达到上限后断开连接
2. 流量控制
TCP 使用 滑动窗口 机制,接收方通过 窗口大小通告 告诉发送方可接收的最大数据量,防止数据溢出,提高传输效率
3. 拥塞控制
TCP 采用 拥塞控制算法 保证网络稳定性,主要步骤包括:
慢启动:发送窗口从小到大指数增长,直到检测到网络拥塞
拥塞避免:达到一定阈值后,窗口增长速率从指数变为线性,避免拥塞
快速重传与快速恢复:收到 3 个重复 ACK 认为数据丢失,立即重传丢失的数据,调整窗口大小,快速恢复传输速度
4. TCP 三次握手与四次挥手
三次握手(建立连接):
客户端发送 SYN(同步序列号)
服务器返回 SYN-ACK(同步确认)
客户端回复 ACK,连接建立
四次挥手(断开连接):
客户端发送 FIN(关闭请求),进入 FIN_WAIT_1 状态
服务器返回 ACK,进入 CLOSE_WAIT,客户端进入 FIN_WAIT_2
服务器发送 FIN,表示数据发送完毕,进入 LAST_ACK
客户端返回 ACK,进入 TIME_WAIT(等待可能的重传 FIN),超时后关闭连接,服务器进入 CLOSED 状态
TCP 的粘包和拆包
TCP 传输是 面向字节流 的,不保证数据边界,因此会出现 粘包 和 拆包(也称半包)问题
粘包:多个数据包在接收方合并为一个,导致数据边界不清晰
拆包:一个数据包被拆成多个小包,导致接收方无法一次性获取完整数据
问题来源:
发送方可能会合并小包一起发送,导致粘包
由于 MTU(最大传输单元) 限制,单个大包可能会被拆分,导致拆包
解决方案:
定长消息:所有消息固定长度,接收方按照固定大小读取数据
添加分隔符:在数据包之间加入特殊分隔符(如
\n
、|
),接收方根据分隔符解析使用消息头:在每个数据包前加上长度信息,接收方根据长度解析完整数据
总结
TCP 作为一种可靠的、面向连接的协议,通过 序列号、ACK、流量控制、拥塞控制 等机制解决了数据在不可靠网络上的传输问题,适用于对数据可靠性和顺序要求高的应用场景
然而,TCP 由于需要建立连接、维护状态和进行流量控制,传输效率相对较低。相比之下,UDP 轻量、无连接,适用于对实时性要求高但可以容忍数据丢失的场景,如直播、游戏等
理解 TCP 的工作原理,不仅有助于更好地优化网络通信,还能在开发中选择合适的协议,提高系统性能和稳定性