TCP协议
1. TCP 概述
TCP(Transmission Control Protocol,传输控制协议)是传输层的面向连接协议,提供可靠的数据传输服务。
TCP 基本特征
- 面向连接:需要预先建立连接
- 可靠传输:保证数据完整、有序、无重复传输
- 流量控制:防止发送方过快导致接收方缓冲区溢出
- 拥塞控制:适应网络状况,避免网络拥塞
TCP 适用场景
- 文件传输:FTP、HTTP
- Web 浏览:HTTPS
- 邮件传输:SMTP、POP3、IMAP
- 远程登录:SSH、Telnet
2. TCP 段结构
TCP 首部格式
TCP 首部格式
源端口号16 bit
目的端口号16 bit
序号32 bit
确认号32 bit
数据偏移4 bit
保留6 bit
标志位6 bit
窗口大小16 bit
校验和16 bit
紧急指针16 bit
选项可变
数据可变
TCP 首部至少 20 字节,提供序号、确认、窗口等可靠性机制
字段说明
端口号字段:
- 源端口号(16 位):发送方进程的端口号
- 目的端口号(16 位):接收方进程的端口号
序号字段:
- 序号(32 位):本报文段第一个字节的序号
- 确认号(32 位):期望收到的下一个字节的序号
控制字段:
- 数据偏移(4 位):TCP 首部长度,以 4 字节为单位
- 保留(6 位):保留字段,设为 0
- 标志位(6 位):
- URG:紧急指针有效
- ACK:确认号有效
- PSH:推送标志
- RST:重置连接
- SYN:同步序号
- FIN:结束连接
窗口和校验字段:
- 窗口大小(16 位):接收窗口大小
- 校验和(16 位):首部和数据的校验和
- 紧急指针(16 位):紧急数据的最后一个字节
3. TCP 连接管理
三次握手(连接建立)
过程:
- SYN=1, seq=x:客户端发送连接请求
- SYN=1, ACK=1, seq=y, ack=x+1:服务器确认连接
- ACK=1, seq=x+1, ack=y+1:客户端确认连接
状态变化:
- 客户端:CLOSED → SYN_SENT → ESTABLISHED
- 服务器:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
四次挥手(连接释放)
过程:
- FIN=1, seq=u:客户端发送结束请求
- ACK=1, ack=u+1:服务器确认结束请求
- FIN=1, seq=v:服务器发送结束请求
- ACK=1, ack=v+1:客户端确认结束请求
状态变化:
- 客户端:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
- 服务器:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
4. TCP 可靠传输
序号机制
- 字节序号:每个字节都有唯一序号
- 初始序号:连接建立时随机选择
- 序号回绕:序号达到最大值后重新开始
确认机制
- 累积确认:确认号表示期望收到的下一个字节
- 选择性确认:确认特定的数据段
- 延迟确认:延迟发送确认,减少网络开销
超时重传
- 超时时间:动态调整,基于 RTT
- 重传策略:指数退避算法
- 快速重传:收到 3 个重复 ACK 立即重传
滑动窗口
- 发送窗口:允许发送但未确认的数据范围
- 接收窗口:允许接收的数据范围
- 窗口滑动:收到确认后窗口向前滑动
5. TCP 流量控制
流量控制目的
- 防止过载:防止发送方过快导致接收方缓冲区溢出
- 匹配速率:发送速率与接收速率匹配
- 提高效率:充分利用接收方处理能力
滑动窗口机制
- 窗口大小:接收方通告的窗口大小
- 动态调整:根据接收方处理能力调整
- 零窗口:接收方缓冲区满时通告零窗口
流量控制算法
- 慢启动:连接建立后从 1 个 MSS 开始
- 拥塞避免:窗口达到阈值后线性增长
- 快重传:收到 3 个重复 ACK 立即重传
- 快恢复:重传后进入拥塞避免状态
6. TCP 拥塞控制
拥塞控制目的
- 避免拥塞:防止网络拥塞
- 公平性:多个连接公平共享带宽
- 效率:充分利用网络资源
拥塞控制算法
慢启动:
- 初始 cwnd=1 个 MSS
- 每收到一个 ACK,cwnd 翻倍
- 直到达到 ssthresh
拥塞避免:
- cwnd 达到 ssthresh 后线性增长
- 每 RTT 增加 1 个 MSS
- 直到发生拥塞
快重传和快恢复:
- 收到 3 个重复 ACK 立即重传
- 重传后进入拥塞避免状态
- 不进入慢启动状态
拥塞控制参数
- cwnd:拥塞窗口大小
- ssthresh:慢启动阈值
- RTT:往返时间
- MSS:最大段大小
7. TCP 应用
Web 应用
- HTTP:超文本传输协议
- HTTPS:安全超文本传输协议
- 特点:可靠传输,适合文件传输
文件传输
- FTP:文件传输协议
- SFTP:安全文件传输协议
- 特点:大文件传输,可靠性要求高
邮件传输
- SMTP:简单邮件传输协议
- POP3:邮局协议
- IMAP:互联网消息访问协议
远程登录
- SSH:安全外壳协议
- Telnet:远程登录协议
- 特点:交互式通信,可靠性要求高
练习 1
TCP 如何实现可靠传输?
解题思路:
按这些机制作用于报文段的先后顺序来列:编号、确认、重传、窗口,最后是两个防止管道被撑爆的控制回路。
详细步骤:
TCP 通过以下机制实现可靠传输:
-
序号机制:
- 每个字节都有唯一序号
- 用于标识数据段顺序
- 支持乱序重组
-
确认机制:
- 累积确认:确认号表示期望收到的下一个字节
- 延迟确认:减少网络开销
- 选择性确认:确认特定数据段
-
超时重传:
- 动态调整超时时间
- 指数退避算法
- 快速重传机制
-
滑动窗口:
- 发送窗口控制发送速率
- 接收窗口控制接收能力
- 动态调整窗口大小
-
流量控制:
- 防止发送方过快
- 匹配发送和接收速率
- 避免接收方缓冲区溢出
-
拥塞控制:
- 慢启动算法
- 拥塞避免算法
- 快重传和快恢复
最终答案:
TCP 靠序号、确认重传和滑动窗口保证可靠有序,并叠加流量控制与拥塞控制两个回路调节发送速率。
练习 2
TCP 的流量控制和拥塞控制有何不同?
解题思路:
把两者当成受控对象不同的两个控制回路来看:流量控制保护接收方,拥塞控制保护网络。
详细步骤:
主要区别:
-
控制目标:
- 流量控制:防止接收方缓冲区溢出
- 拥塞控制:防止网络拥塞
-
控制对象:
- 流量控制:端到端控制
- 拥塞控制:网络整体控制
-
控制机制:
- 流量控制:基于接收窗口大小
- 拥塞控制:基于网络拥塞状况
-
控制参数:
- 流量控制:接收方通告的窗口大小
- 拥塞控制:拥塞窗口大小
-
控制算法:
- 流量控制:滑动窗口机制
- 拥塞控制:慢启动、拥塞避免等算法
-
影响范围:
- 流量控制:影响单个连接
- 拥塞控制:影响整个网络
-
触发条件:
- 流量控制:接收方缓冲区满
- 拥塞控制:网络拥塞、丢包等
最终答案:
流量控制用滑动窗口限制发送速率以保护接收方,拥塞控制用慢启动等算法限制发送速率以保护整个网络。
| 中文术语 | 英文术语 | 缩写 | 说明 |
|---|---|---|---|
| 传输控制协议 | Transmission Control Protocol | TCP | 面向连接的可靠传输协议 |
| 段 | Segment | - | TCP的协议数据单元 |
| 三次握手 | Three-way Handshake | - | TCP连接建立过程 |
| 四次挥手 | Four-way Handshake | - | TCP连接释放过程 |
| 序列号 | Sequence Number | - | 数据字节的编号 |
| 确认号 | Acknowledgment Number | - | 期望收到的下一字节序号 |
| 滑动窗口 | Sliding Window | - | 流量控制机制 |
| 拥塞窗口 | Congestion Window | cwnd | 拥塞控制的发送窗口 |
| 慢启动 | Slow Start | - | 拥塞控制算法之一 |
| 拥塞避免 | Congestion Avoidance | - | 拥塞控制算法之一 |
| 快速重传 | Fast Retransmit | - | 收到3个重复ACK时重传 |
| 快速恢复 | Fast Recovery | - | 快速重传后的恢复算法 |
| 往返时间 | Round-Trip Time | RTT | 发送到收到确认的时间 |
| 重传超时 | Retransmission Timeout | RTO | 超时重传的时间阈值 |
| 流量控制 | Flow Control | - | 防止接收方溢出 |
| 拥塞控制 | Congestion Control | - | 防止网络过载 |
| 可靠传输 | Reliable Transmission | - | 保证数据正确有序到达 |
| SYN | Synchronize | SYN | 同步序列号标志位 |
| ACK | Acknowledgment | ACK | 确认标志位 |
| FIN | Finish | FIN | 结束连接标志位 |
