第17章 TCP:传输控制协议

所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议

本章介绍TCP协议,包括TCP的服务、首部格式、序号和确认号、流量控制等。


17.1 引言

TCP的作用

TCP(Transmission Control Protocol):

  • 传输控制协议
  • 传输层协议
  • 面向连接、可靠
  • 提供字节流服务

TCP是可靠的传输层协议。


TCP的特点

TCP的特点:

  1. 面向连接

    • 通信前先建立连接
    • 通信后释放连接
    • 点对点
  2. 可靠交付

    • 保证数据送达
    • 丢了重传
    • 保证顺序
    • 不重复
  3. 字节流服务

    • 没有边界
    • 一串连续的字节
    • 应用自己处理边界
  4. 流量控制

    • 控制发送速度
    • 不让接收方溢出
  5. 拥塞控制

    • 控制发送速度
    • 不让网络拥塞
  6. 全双工

    • 双方可以同时收发
    • 双向独立

TCP功能很完善。


TCP vs UDP

TCP vs UDP:

对比项TCPUDP
连接面向连接无连接
可靠性可靠不可靠
顺序保证不保证
流量控制有无
拥塞控制有无
开销大小
速度慢快
数据边界无(字节流)有(数据报)
适用场景文件传输、网页等实时应用、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
URG1位紧急指针有效
ACK1位确认号有效
PSH1位推送,立即交给应用
RST1位复位连接
SYN1位同步,建立连接用
FIN1位结束,关闭连接用
窗口大小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概述

  1. 什么是TCP

    • 传输控制协议
    • 传输层
    • 面向连接、可靠
  2. 特点

    • 面向连接
    • 可靠交付
    • 字节流
    • 流量控制
    • 拥塞控制
    • 全双工
  3. vs UDP

    • TCP可靠复杂
    • UDP简单快

TCP提供的服务

  1. 可靠交付

    • 保证送到
    • 不丢不重复
  2. 按序交付

    • 保证顺序
  3. 字节流

    • 没有边界
    • 应用自己处理
  4. 流量控制

    • 防止接收方溢出
  5. 拥塞控制

    • 防止网络拥塞
  6. 全双工

    • 双向同时收发

TCP首部

  1. 首部长度

    • 最小20字节
    • 最大60字节(含选项)
  2. 关键字段

    • 源端口、目的端口
    • 序号、确认号
    • 数据偏移、标志位
    • 窗口大小
    • 检验和、紧急指针
  3. 六个标志位

    • URG、ACK、PSH、RST、SYN、FIN

序号和确认号

  1. 序号

    • 每个字节都有序号
    • 本报文段第一个字节的序号
  2. 初始序号

    • 随机选择
    • 不是从0开始
  3. 确认号

    • 期望收到的下一个
    • 累计确认
  4. 累计确认

    • 一次确认多个
    • 不用每个都确认

流量控制

  1. 什么是流量控制

    • 控制发送速度
    • 防止接收方溢出
  2. 窗口大小

    • 16位字段
    • 接收方通告
    • 最大64KB
  3. 滑动窗口

    • 窗口滑动
    • 已确认/可发/不可发
  4. 窗口为0

    • 停止发送
    • 窗口探查

全双工

  1. 什么是全双工

    • 双向同时收发
    • 独立
  2. 独立的数据流

    • 两个方向各有各的序号、窗口
  3. 捎带确认

    • 数据带确认
    • 节省带宽

关键概念

  1. TCP

    • 传输控制协议
    • 可靠、面向连接
  2. 字节流

    • 没有边界
    • 应用处理
  3. 序号和确认号

    • 每个字节有序号
    • 累计确认
  4. 流量控制

    • 窗口大小
    • 滑动窗口
  5. 全双工

    • 双向独立
    • 捎带确认

TCP传输控制协议