第17章 TCP:传输控制协议
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍TCP协议,包括TCP的服务、首部格式、序号和确认号、流量控制等。
17.1 引言
TCP的作用
TCP(Transmission Control Protocol):
- 传输控制协议
- 传输层协议
- 面向连接、可靠
- 提供字节流服务
TCP是可靠的传输层协议。
TCP的特点
TCP的特点:
-
面向连接
- 通信前先建立连接
- 通信后释放连接
- 点对点
-
可靠交付
- 保证数据送达
- 丢了重传
- 保证顺序
- 不重复
-
字节流服务
- 没有边界
- 一串连续的字节
- 应用自己处理边界
-
流量控制
- 控制发送速度
- 不让接收方溢出
-
拥塞控制
- 控制发送速度
- 不让网络拥塞
-
全双工
- 双方可以同时收发
- 双向独立
TCP功能很完善。
TCP vs UDP
TCP vs UDP:
| 对比项 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 顺序 | 保证 | 不保证 |
| 流量控制 | 有 | 无 |
| 拥塞控制 | 有 | 无 |
| 开销 | 大 | 小 |
| 速度 | 慢 | 快 |
| 数据边界 | 无(字节流) | 有(数据报) |
| 适用场景 | 文件传输、网页等 | 实时应用、DNS等 |
TCP可靠复杂,UDP简单快。
本章讨论的内容
本章讨论的内容:
- TCP提供的服务
- TCP首部格式
- 序号和确认号
- 流量控制
- 全双工
- 连接管理
本章介绍TCP协议的基本概念。
17.2 TCP提供的服务
可靠交付
可靠交付:
- 数据一定能送到
- 丢了会重传
- 出错了会重传
- 保证不丢
怎么实现:
- 确认机制
- 超时重传
- 校验和
TCP保证可靠交付。
按序交付
按序交付:
- 发送的顺序和接收的顺序一样
- 不会乱序
- 应用层收到的是有序的
怎么实现:
- 序号
- 重新排序
- 缓冲区
TCP保证顺序。
字节流服务
字节流服务:
- TCP把数据看成一串字节
- 没有消息边界
- 发多少次,收多少次不一定
- 应用自己处理边界
例子:
- 发100字节 + 发200字节
- 收的时候可能一次收300字节
- 也可能分多次收
- 总数是对的就行
TCP是字节流,没有边界。
流量控制
流量控制(Flow Control):
- 控制发送方的速度
- 不让接收方处理不过来
- 接收方告诉发送方自己还有多少空间
- 发送方按这个来发
怎么实现:
- 窗口大小字段
- 接收方通告自己的窗口
- 发送方不能超过这个窗口
流量控制防止接收方溢出。
拥塞控制
拥塞控制(Congestion Control):
- 控制发送方的速度
- 不让网络拥塞
- 网络拥塞了就放慢点
怎么实现:
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
拥塞控制防止网络拥塞。
全双工
全双工(Full Duplex):
- 双方可以同时发送和接收
- 两个方向独立
- 每个方向都有自己的序号和窗口
特点:
- 同时收发
- 互不影响
- 效率高
TCP是全双工的。
17.3 TCP首部
TCP首部格式
TCP首部格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口 | 目的端口 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 | 保留 |U|A|P|R|S|F| 窗口大小 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 检验和 | 紧急指针 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(如果有) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据(如果有) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP首部至少20字节。
TCP首部字段
TCP首部各字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| 源端口 | 16位 | 发送方端口号 |
| 目的端口 | 16位 | 接收方端口号 |
| 序号 | 32位 | 本报文段数据的第一个字节的序号 |
| 确认号 | 32位 | 期望收到的下一个字节的序号 |
| 数据偏移 | 4位 | 首部长度,单位4字节 |
| 保留 | 6位 | 保留,必须为0 |
| URG | 1位 | 紧急指针有效 |
| ACK | 1位 | 确认号有效 |
| PSH | 1位 | 推送,立即交给应用 |
| RST | 1位 | 复位连接 |
| SYN | 1位 | 同步,建立连接用 |
| FIN | 1位 | 结束,关闭连接用 |
| 窗口大小 | 16位 | 接收窗口大小,流量控制 |
| 检验和 | 16位 | 校验和 |
| 紧急指针 | 16位 | 紧急数据的位置 |
| 选项 | 可变 | 可选,最多40字节 |
| 数据 | 可变 | 用户数据 |
TCP首部有很多字段。
数据偏移
数据偏移(Data Offset):
- 4位
- 首部的长度
- 单位是4字节
- 最小5(20字节)
- 最大15(60字节)
- 因为选项最多40字节
为什么叫数据偏移:
- 数据从哪里开始
- 就是首部的长度
数据偏移就是首部长度。
标志位
六个标志位:
| 标志 | 名称 | 说明 |
|---|---|---|
| URG | 紧急 | 紧急指针有效 |
| ACK | 确认 | 确认号有效,建立连接后通常都是1 |
| PSH | 推送 | 立即把数据交给应用,不要缓存 |
| RST | 复位 | 复位连接,出错或拒绝时用 |
| SYN | 同步 | 建立连接时用 |
| FIN | 结束 | 关闭连接时用 |
六个标志位,各有用途。
17.4 序号和确认号
序号
序号(Sequence Number):
- 32位
- 本报文段数据的第一个字节的序号
- 每个字节都有一个序号
例子:
- 序号是100
- 数据长度是20字节
- 那么数据的序号是100-119
- 下一个应该从120开始
每个字节都有序号。
初始序号
初始序号(ISN, Initial Sequence Number):
- 连接建立时的起始序号
- 不是从0开始
- 随机选择
- 防止序号回绕混淆
为什么随机:
- 安全
- 防止伪造
- 防止旧的分组干扰新连接
初始序号是随机的。
确认号
确认号(Acknowledgment Number):
- 32位
- 期望收到的下一个字节的序号
- 表示这个序号之前的都收到了
- 累计确认
例子:
- 收到了1-100字节
- 确认号就是101
- 表示100及以前的都收到了
- 下一个要101
确认号是累计确认。
累计确认
累计确认(Cumulative Acknowledgment):
- 确认号之前的都收到了
- 一次确认可以确认多个段
- 不用每个段都确认
例子:
- 发了段1(1-100)
- 发了段2(101-200)
- 收到确认号201
- 这一个确认就确认了两个段
累计确认,一次可以确认多个。
17.5 流量控制
什么是流量控制
流量控制(Flow Control):
- 控制发送方的速度
- 不让接收方的缓冲区溢出
- 接收方告诉发送方自己还有多少空间
- 发送方按这个来发
流量控制防止接收方溢出。
窗口大小
窗口大小(Window Size):
- 16位字段
- 接收方通告自己的接收窗口
- 表示自己还能接收多少字节
- 发送方发送的数据不能超过这个窗口
单位:
- 字节
- 最大65535字节(64KB)
窗口大小字段控制流量。
滑动窗口
滑动窗口(Sliding Window):
- 窗口随着数据的发送和确认滑动
- 左边是已确认的
- 中间是可以发的
- 右边是不能发的
窗口的移动:
- 收到新的确认,窗口右移
- 发送数据,窗口内可用空间减少
- 确认了,可用空间增加
滑动窗口机制。
窗口大小为0
窗口大小为0:
- 接收方缓冲区满了
- 告诉发送方不要再发了
- 发送方停止发送
- 等接收方有空间了再发
窗口探查:
- 发送方会定期发窗口探查
- 问接收方窗口有没有变大
- 防止窗口更新丢失
窗口为0就停止发送。
17.6 全双工
什么是全双工
全双工(Full Duplex):
- 双方可以同时发送和接收
- 两个方向独立
- 每个方向都有自己的:
- 序号
- 确认号
- 窗口
- 状态
TCP是全双工的。
独立的数据流
独立的数据流:
- A→B是一个数据流
- B→A是另一个数据流
- 互不影响
- 可以同时进行
例子:
- A在发数据给B
- 同时B也在发数据给A
- 两个方向独立
两个方向独立。
同时确认
同时确认:
- 数据可以捎带确认
- 发数据的时候,顺便带上确认
- 不用单独发确认包
- 节省带宽
例子:
- B收到A的数据
- B正好也要发数据给A
- B发数据的时候,ACK字段带上确认
- 一举两得
数据可以捎带确认。
17.7 小结
TCP概述
-
什么是TCP
- 传输控制协议
- 传输层
- 面向连接、可靠
-
特点
- 面向连接
- 可靠交付
- 字节流
- 流量控制
- 拥塞控制
- 全双工
-
vs UDP
- TCP可靠复杂
- UDP简单快
TCP提供的服务
-
可靠交付
- 保证送到
- 不丢不重复
-
按序交付
- 保证顺序
-
字节流
- 没有边界
- 应用自己处理
-
流量控制
- 防止接收方溢出
-
拥塞控制
- 防止网络拥塞
-
全双工
- 双向同时收发
TCP首部
-
首部长度
- 最小20字节
- 最大60字节(含选项)
-
关键字段
- 源端口、目的端口
- 序号、确认号
- 数据偏移、标志位
- 窗口大小
- 检验和、紧急指针
-
六个标志位
- URG、ACK、PSH、RST、SYN、FIN
序号和确认号
-
序号
- 每个字节都有序号
- 本报文段第一个字节的序号
-
初始序号
- 随机选择
- 不是从0开始
-
确认号
- 期望收到的下一个
- 累计确认
-
累计确认
- 一次确认多个
- 不用每个都确认
流量控制
-
什么是流量控制
- 控制发送速度
- 防止接收方溢出
-
窗口大小
- 16位字段
- 接收方通告
- 最大64KB
-
滑动窗口
- 窗口滑动
- 已确认/可发/不可发
-
窗口为0
- 停止发送
- 窗口探查
全双工
-
什么是全双工
- 双向同时收发
- 独立
-
独立的数据流
- 两个方向各有各的序号、窗口
-
捎带确认
- 数据带确认
- 节省带宽
关键概念
-
TCP
- 传输控制协议
- 可靠、面向连接
-
字节流
- 没有边界
- 应用处理
-
序号和确认号
- 每个字节有序号
- 累计确认
-
流量控制
- 窗口大小
- 滑动窗口
-
全双工
- 双向独立
- 捎带确认