计算机网络学习(五)——TCP

一、TCP

TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、字节流服务的传输层协议 ,在计算机网络中广泛用于可靠数据传输,如网页加载、文件传输、电子邮件、远程登录等。

TCP 主要用于在两个主机之间建立稳定连接,确保数据完整、按序、无重复地传输,是现代网络中最关键的传输协议之一。

核心特点:

特性 说明
面向连接 在通信前必须先建立连接(三次握手
可靠传输 确保数据不丢失、不重复、按顺序到达(确认与重传
全双工通信 双方可同时发送和接收数据(使用独立的发送/接收缓冲区)
字节流服务 数据被当作无结构的字节流发送,传输过程透明
流量控制 控制发送速率,避免接收方被"淹没"
拥塞控制 避免过多数据注入网络导致拥堵

二、TCP 的通信过程

1. 建立连接(三次握手)

text 复制代码
Client                          Server
  | --------- SYN ------------> |
  | <-------- SYN+ACK -------- |
  | --------- ACK ------------> |
  • 第一次:客户端发送 SYN 报文 ,请求建立连接,附带初始序列号 Seq=x
  • 第二次:服务器回复 SYN + ACK 表示同意,附带初始序列号 Seq=y
  • 第三次:客户端发送 ACK 确认,连接建立。

三次握手确保双方都准备好通信,防止失效连接被误认为有效。

2. 数据传输(确认机制)

  • TCP 将数据分段发送,每个段都有序号(Seq)确认号(Ack)
  • 接收方对收到的数据发送 ACK 确认;
  • 若发送方长时间未收到确认,则进行重传

3. 连接释放(四次挥手)

text 复制代码
Client                          Server
  | -------- FIN -------------> |
  | <------- ACK -------------- |
  | <-------- FIN ------------- |
  | -------- ACK -------------> |
  • 第一次:客户端 发送 FIN,请求关闭;
  • 第二次:服务器回应 ACK ,进入 CLOSE_WAIT 状态;
  • 第三次:服务器 准备好后发送 FIN
  • 第四次:客户端回应 ACK,进入 TIME_WAIT 状态,等待一段时间后关闭连接。

每一方单独关闭发送方向,需要 4 个分组完成关闭,双方完全关闭后,连接释放。

三、TCP 报文段结构(重点字段)

TCP报文段结构:

其中,重点字段的作用:

字段 作用
源端口/目标端口 标识应用进程
序号 Seq 标识数据的位置
确认号 Ack 指明希望下一个收到的字节编号
标志位 Flags SYNACKFINRST
窗口大小 控制对方最多发送多少字节(流量控制)
校验和 数据完整性验证
可选字段 时间戳、窗口扩展等

四、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. 发送窗口与接收窗口结构

对发送方而言,发送窗口包括以下几个部分:

lua 复制代码
+--------+-------------------+------------------------+
| 已确认  | 已发送未确认数据   | 可发送数据(窗口)       |
+--------+-------------------+------------------------+
^        ^                   ^                        ^
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(最大报文段长度);
  • 每收到一个 ACKcwnd 增加 1 MSS(即指数增长);
  • cwnd 每往返一次 RTT 就翻倍;
  • 一直增长到慢启动阈值ssthresh)为止;
  • 进入下一阶段:拥塞避免。

(2)拥塞避免(Congestion Avoidance)

  • cwnd >= ssthresh,每个 RTT cwnd 增加约 1 MSS;
  • 即线性增长;
  • 当检测到网络出现拥塞时(例如超时或三次重复 ACK)就进入下一阶段。

(3)快速重传(Fast Retransmit)

  • 如果接收到3 个重复 ACK,表示可能有一个报文段丢失;
  • 不等超时,立即重传丢失的报文段;
  • 此时不进入慢启动,而是进入"快速恢复"。

(4)快速恢复(Fast Recovery)

  • ssthresh = cwnd / 2
  • cwnd = ssthresh + 3 MSS(表示收到了 3 个重复 ACK);
  • 随后每收到一个重复 ACKcwnd += 1 MSS
  • 一旦收到新的 ACK(非重复),将 cwnd = ssthresh,重新进入"拥塞避免"。

3. 窗口控制:发送窗口 = min(rwnd, cwnd)

  • rwnd:接收窗口,由接收方控制,表示接收能力;
  • cwnd:拥塞窗口,由发送方控制,表示网络允许的发送速率;
  • 发送方实际能发的数据量是两者的较小值

4. 拥塞控制的关键变量

变量 含义
cwnd 拥塞窗口
ssthresh 慢启动阈值,决定从慢启动进入拥塞避免
rwnd 接收窗口,流量控制用
RTT/RTO 判断是否丢包

5. 拥塞窗口随时间变化(示意)

objectivec 复制代码
        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页面传输(HTTPHTTPS);
  • 文件传输(FTP);
  • 邮件协议(SMTPPOP3IMAP);
  • 远程登录(SSHTelnet);
  • 数据库通信(MySQLPostgreSQL)。
相关推荐
清风徐来QCQ1 小时前
python语法学习
学习
miaoyumeng_wn1 小时前
5月21日学习笔记
笔记·学习·oracle
岂是尔等觊觎2 小时前
PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
经验分享·笔记·嵌入式硬件·学习·pcb工艺
拾忆-eleven2 小时前
NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
学习·自然语言处理·概率论
清晨朝暮3 小时前
【Linux 学习计划】-- git 在Linux远端服务器上的部署与简单使用
学习
奕天者3 小时前
计算机网络学习(三)——HTTP
学习·计算机网络·http
打倒焦虑3 小时前
计算机网络学习20250524
计算机网络
NULL指向我4 小时前
香橙派3B学习笔记2:Vscode远程SSH登录香橙派_权限问题连接失败解决
笔记·vscode·学习
hello1114-4 小时前
Redis学习打卡-Day5-Redis 持久化
数据库·redis·学习
小程同学>o<4 小时前
嵌入式开发之STM32学习笔记day10
经验分享·笔记·stm32·单片机·嵌入式硬件·学习