# TCP 是用来解决什么问题?
5 min read
Table of Contents
TCP 是用来解决什么问题?
【核心定义】
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,用于在不可靠的IP网络之上提供可靠的数据传输服务。
【关键要点】
- 解决不可靠传输问题:IP协议本身不保证数据包的顺序、完整性和可达性,TCP通过确认应答、超时重传、序列号等机制确保数据可靠交付。
- 解决流量控制问题:通过滑动窗口机制动态调整发送速率,防止接收方缓冲区溢出。
- 解决拥塞控制问题:采用慢启动、拥塞避免、快重传、快恢复等算法,避免网络过载。
- 解决应用层数据流分割问题:将应用层的大数据块分割为适合网络传输的报文段,并在接收端重组。
【深度推导/细节】
- 可靠传输的核心矛盾:网络丢包、乱序、重复。TCP通过以下逻辑拆解解决:
- Step 1 序列号与确认应答:每个字节分配唯一序列号,接收方返回ACK确认已收到的连续数据最高序列号。
- Step 2 超时重传:发送方为每个报文段启动定时器,若超时未收到ACK则重发。
- Step 3 滑动窗口:允许发送方在未收到确认前连续发送多个报文段,窗口大小由接收方通告(流量控制)和网络拥塞程度(拥塞控制)共同决定。
- 拥塞控制的临界点设计:
- 慢启动阈值(ssthresh):初始为较高值(如64KB),在发生丢包时调整为当前拥塞窗口一半,作为慢启动与拥塞避免的分界点。
- 拥塞窗口(cwnd)指数增长转线性增长:慢启动阶段cwnd每RTT翻倍(指数增长),达到ssthresh后转为每RTT加1(线性增长),平衡效率与稳定性。
【关联/对比】
- TCP vs UDP:TCP面向连接、可靠、有拥塞控制,适用于文件传输、网页浏览;UDP无连接、不可靠、低延迟,适用于实时视频、DNS查询。
- TCP vs HTTP/3的QUIC:QUIC基于UDP实现类似TCP的可靠传输,但减少握手延迟,支持多路复用,解决TCP队头阻塞问题。
『面试官追问』
- TCP如何保证消息顺序性?
- 通过序列号对数据字节排序,接收方缓存乱序数据,仅向应用层交付连续数据。
- TCP粘包/拆包是什么?如何解决?
- 应用层报文在TCP流中无边界,可能被合并或拆分。解决方案:固定长度报文、分隔符、长度字段(如HTTP的Content-Length)。
- TIME_WAIT状态的作用?为什么是2MSL?
- 确保被动关闭方收到最后的ACK,并让网络中旧报文失效(最大报文生存时间MSL×2)。
【线程安全与版本差异】
- 线程安全:TCP协议本身是传输层规范,不涉及线程问题;但Socket API在多线程环境下需同步处理。
- 版本差异:
- 早期TCP(RFC 793):基础可靠传输机制。
- TCP Tahoe/Reno/NewReno:引入拥塞控制算法演进。
- 现代优化:TCP BBR(基于带宽和延迟估计的拥塞控制)、TCP Fast Open(减少握手开销)。
(注:本题未涉及数据结构与扩容机制,故未展开;若需扩展可讨论TCP头部结构、缓冲区动态调整等。)