计算机网络学习(五)——TCP
一、TCP
TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、字节流服务的传输层协议,在计算机网络中广泛用于可靠数据传输,如网页加载、文件传输、电子邮件、远程登录等。
TCP 主要用于在两个主机之间建立稳定连接,确保数据完整、按序、无重复地传输,是现代网络中最关键的传输协议之一。
核心特点:
特性 | 说明 |
---|---|
面向连接 | 在通信前必须先建立连接(三次握手) |
可靠传输 | 确保数据不丢失、不重复、按顺序到达(确认与重传) |
全双工通信 | 双方可同时发送和接收数据(使用独立的发送/接收缓冲区) |
字节流服务 | 数据被当作无结构的字节流发送,传输过程透明 |
流量控制 | 控制发送速率,避免接收方被“淹没” |
拥塞控制 | 避免过多数据注入网络导致拥堵 |
二、TCP 的通信过程
1. 建立连接(三次握手)
Client Server| --------- SYN ------------> || <-------- SYN+ACK -------- || --------- ACK ------------> |
- 第一次:客户端发送
SYN
报文,请求建立连接,附带初始序列号Seq=x
; - 第二次:服务器回复
SYN + ACK
表示同意,附带初始序列号Seq=y
; - 第三次:客户端发送
ACK
确认,连接建立。
三次握手确保双方都准备好通信,防止失效连接被误认为有效。
2. 数据传输(确认机制)
- TCP 将数据分段发送,每个段都有序号(Seq)和确认号(Ack);
- 接收方对收到的数据发送
ACK
确认; - 若发送方长时间未收到确认,则进行重传。
3. 连接释放(四次挥手)
Client Server| -------- FIN -------------> || <------- ACK -------------- || <-------- FIN ------------- || -------- ACK -------------> |
- 第一次:客户端发送
FIN
,请求关闭; - 第二次:服务器回应
ACK
,进入CLOSE_WAIT
状态; - 第三次:服务器准备好后发送
FIN
; - 第四次:客户端回应 ACK,进入
TIME_WAIT
状态,等待一段时间后关闭连接。
每一方单独关闭发送方向,需要 4 个分组完成关闭,双方完全关闭后,连接释放。
三、TCP 报文段结构(重点字段)
TCP报文段结构:
其中,重点字段的作用:
字段 | 作用 |
---|---|
源端口/目标端口 | 标识应用进程 |
序号 Seq | 标识数据的位置 |
确认号 Ack | 指明希望下一个收到的字节编号 |
标志位 Flags | SYN 、ACK 、FIN 、RST 等 |
窗口大小 | 控制对方最多发送多少字节(流量控制) |
校验和 | 数据完整性验证 |
可选字段 | 时间戳、窗口扩展等 |
四、TCP 的重传机制
在计算机网络中,TCP(传输控制协议)是一种面向连接、可靠的传输层协议。
为了保证数据的可靠性,TCP 提供了 重传机制,即当某个数据包在传输过程中丢失或出现错误时,会进行 重新发送。
1. TCP 重传的触发机制
TCP 重传一般由以下几种情况触发:
(1)超时重传(Timeout Retransmission)
- 每个 TCP 发送的数据包都会设置一个定时器;
- 如果在指定时间内未收到
ACK
(确认应答),就认为该包可能丢失; - 超时后进行重传。
关键参数:
RTO(Retransmission Timeout,重传超时时间)是根据 RTT
(往返时延)动态估算出来的,遵循如下公式:
RTO = SRTT + max(G, 4 * RTTVAR)
SRTT
:平滑往返时间估计RTTVAR
:RTT 偏差G
:时钟粒度
(2)快速重传(Fast Retransmit)
- 接收方如果收到乱序的数据包,会重复发送对前一个正确数据包的
ACK
; - 发送方如果连续收到三个重复的
ACK
,就认为这个包可能丢失; - 此时不等超时,立即重传丢失的数据包。
这是 TCP 的一个优化策略,用于加快丢包检测速度。
2. 选择性重传(Selective Repeat)
传统的 TCP 只支持基于累计确认的重传方式,但为了提高效率,现代 TCP 实现中引入了:
SACK
(Selective Acknowledgment):
- 接收方可以告诉发送方:我虽然丢了某个包,但其他后续包我都收到了;
- 发送方可以只重传丢失的数据包,避免重传已收到的部分,提升效率。
3. 重传相关的 TCP 状态与字段
TCP 报文段头部中涉及以下关键字段来配合重传机制:
- 序号(Sequence Number): 标识发送的数据位置;
- 确认号(Acknowledgment Number): 告知发送方已经成功接收到的数据;
- 窗口大小(Window Size): 用于流量控制;
ACK
标志位: 表示确认应答;SACK
(选择性确认): 允许接收方告诉发送方哪些乱序包已经收到,从而支持“选择性重传”(Selective Retransmission)。
五、TCP 的流量控制——滑动窗口机制
TCP(Transmission Control Protocol)中的滑动窗口机制是实现流量控制和可靠传输的核心机制之一。它允许 TCP 在不等待确认的情况下发送多个数据包,从而提高网络吞吐量,并根据接收端的处理能力动态调整发送速率。
1. 滑动窗口
滑动窗口是 TCP 中用来控制数据传输的一种机制,它定义了在未收到确认的前提下,发送方最多可以连续发送的字节数。
它包括:
- 发送窗口(Send Window);
- 接收窗口(Receive Window);
- 拥塞窗口(Congestion Window,cwnd)(属于拥塞控制,不是滑动窗口的一部分,但协同工作)。
作用:
- 提高传输效率:不必每发一个数据就等待
ACK
; - 实现流量控制:根据接收端的缓冲区动态调整窗口大小;
- 实现可靠传输:通过确认机制配合重传,保证数据正确送达。
2. 发送窗口与接收窗口结构
对发送方而言,发送窗口包括以下几个部分:
+--------+-------------------+------------------------+
| 已确认 | 已发送未确认数据 | 可发送数据(窗口) |
+--------+-------------------+------------------------+
^ ^ ^ ^
send.una send.next send.window send.max
send.una
:最早未确认的数据的序列号;send.next
:下一个准备发送的字节序号;send.window
:当前允许发送的窗口大小(由接收端通告);send.max
:最大可发送序列号(= send.una + window size)。
对接收方而言:
接收窗口也维护一个结构,表示当前可以接收的数据范围。
+------------------------+-----------------+
| 已接收数据 | 可接收的窗口 |
+------------------------+-----------------+
^ ^ ^
rcv.buf rcv.nxt rcv.nxt + rcv.wnd
rcv.nxt
:期望接收到的下一个字节序号;rcv.wnd
:接收窗口大小(由应用程序缓冲区大小决定);- 接收方在
ACK
中通告窗口大小,发送方据此控制发送速率。
3. 滑动窗口的工作过程
(1)发送方根据接收方窗口大小,计算自己可发送的数据量;
(2)每次发送一个或多个数据包,等待 ACK
;
(3)接收方收到数据后发送 ACK
,并通告自己的可用窗口;
(4)发送窗口向前滑动:只要收到 ACK
,就将窗口前移;
(5)若窗口变大,可以继续发送新的数据。
六、TCP 的拥塞控制(发送方控制发送速率)
TCP 的拥塞控制机制是为了防止网络中出现过载(即网络拥塞),从而导致数据包丢失、延迟增加和吞吐下降。与滑动窗口负责“流量控制”不同,拥塞控制更多是从网络整体角度出发,控制发送方的数据发送速率。
拥塞控制的流程图:
1. 拥塞控制
TCP 通过动态调整拥塞窗口大小(cwnd
),来控制一次能发送多少数据。它遵循的基本原则是:
发现网络没有拥塞 → 增加拥塞窗口;
检测到网络拥塞(如丢包)→ 减小窗口。
这样可以在最大限度利用带宽的同时,避免引发过度拥塞。
2. 拥塞控制的四个阶段(核心算法)
TCP 拥塞控制分为四个阶段,统称为“AIMD(加性增、乘性减)”策略。
TCP拥塞控制的FSM描述:
(1)慢启动(Slow Start)
- 初始时设置
cwnd = 1 MSS
(最大报文段长度); - 每收到一个
ACK
,cwnd
增加 1 MSS(即指数增长); cwnd
每往返一次 RTT 就翻倍;- 一直增长到慢启动阈值(
ssthresh
)为止; - 进入下一阶段:拥塞避免。
(2)拥塞避免(Congestion Avoidance)
- 当
cwnd >= ssthresh
,每个 RTTcwnd
增加约 1 MSS; - 即线性增长;
- 当检测到网络出现拥塞时(例如超时或三次重复
ACK
)就进入下一阶段。
(3)快速重传(Fast Retransmit)
- 如果接收到3 个重复
ACK
,表示可能有一个报文段丢失; - 不等超时,立即重传丢失的报文段;
- 此时不进入慢启动,而是进入“快速恢复”。
(4)快速恢复(Fast Recovery)
- 将
ssthresh = cwnd / 2
; - 将
cwnd = ssthresh + 3 MSS
(表示收到了 3 个重复ACK
); - 随后每收到一个重复
ACK
,cwnd += 1 MSS
; - 一旦收到新的
ACK
(非重复),将cwnd = ssthresh
,重新进入“拥塞避免”。
3. 窗口控制:发送窗口 = min(rwnd, cwnd)
rwnd
:接收窗口,由接收方控制,表示接收能力;cwnd
:拥塞窗口,由发送方控制,表示网络允许的发送速率;- 发送方实际能发的数据量是两者的较小值。
4. 拥塞控制的关键变量
变量 | 含义 |
---|---|
cwnd | 拥塞窗口 |
ssthresh | 慢启动阈值,决定从慢启动进入拥塞避免 |
rwnd | 接收窗口,流量控制用 |
RTT/RTO | 判断是否丢包 |
5. 拥塞窗口随时间变化(示意)
cwnd|20| _______| __/10| _______/| __/5| __/| __/1|_/__________________________> 时间|SLOW |AVOID | FAST | AVOID...|START| |RECOV.|
- 最初:
cwnd
快速增长(慢启动); - 到达阈值后:线性增长(拥塞避免);
- 突然丢包:快速重传 & 快速恢复;
- 然后再次进入拥塞避免。
6. 实际实现(TCP Reno / NewReno / Cubic 等)
不同操作系统和内核实现中,TCP 拥塞控制算法略有差异:
算法 | 特点 |
---|---|
TCP Reno | 标准实现,支持快速重传 & 快速恢复 |
TCP NewReno | 对 Reno 的改进,改进了快速恢复 |
TCP Cubic | Linux 默认算法,适合高速长距离网络,增长非线性 |
TCP BBR | Google 提出,基于带宽估计而非丢包控制,低延迟高吞吐 |
七、典型应用场景
- Web页面传输(
HTTP
、HTTPS
); - 文件传输(
FTP
); - 邮件协议(
SMTP
、POP3
、IMAP
); - 远程登录(
SSH
、Telnet
); - 数据库通信(
MySQL
、PostgreSQL
)。