第21章 TCP:紧急方式

所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现

本章描述TCP紧急方式的实现,包括紧急指针、紧急数据的发送和接收、带外数据等。


21.1 引言

什么是紧急方式

紧急方式(Urgent Mode):

  • TCP的一种机制
  • 发送方可以通知接收方有紧急数据
  • 接收方可以优先处理
  • 也叫带外数据(Out-of-Band, OOB)

紧急方式用于高优先级数据。


紧急方式的用途

紧急方式的用途:

  • 中断正在进行的传输
  • 发送控制信息
  • 通知重要事件
  • Telnet、Rlogin等使用

例子:

  • 用户按Ctrl+C中断
  • 发送紧急数据通知对端
  • 对端立即处理

紧急方式用于发送高优先级的通知。


本章讨论的内容

本章讨论的内容:

  • 紧急指针
  • 紧急数据的发送
  • 紧急数据的接收
  • 带外数据
  • 紧急方式的问题

本章讨论TCP紧急方式的实现。


21.2 紧急指针

紧急指针的位置

紧急指针(Urgent Pointer):

  • TCP首部的一个字段
  • 16位
  • URG标志为1时有效
  • 指向紧急数据的最后一个字节

紧急指针标识紧急数据的位置。


紧急指针的含义

紧急指针的含义:

  • 紧急指针 + 序号 = 紧急数据最后一个字节的序号 + 1
  • 指向紧急数据后面的第一个字节
  • 紧急数据从哪里开始?没有明确规定

两种解释:

  1. 紧急数据只有1字节

    • 紧急指针指向的前一个字节
    • 大多数实现是这样
  2. 紧急数据有多个字节

    • 从某个位置到紧急指针
    • 实现不一致

紧急数据的长度没有明确规定,实现不一致。


URG标志

URG标志:

  • TCP首部的标志位
  • 1表示紧急指针有效
  • 0表示没有紧急数据
  • 收到URG标志,接收方要通知应用

URG标志表示有紧急数据。


21.3 紧急数据的发送

发送紧急数据

发送紧急数据的方式:

  • 应用调用send,带MSG_OOB标志
  • TCP把这字节数据当作紧急数据
  • 设置URG标志和紧急指针
  • 立即发送,即使窗口为0也可以发

为什么窗口为0也能发:

  • 紧急数据很重要
  • 需要立即通知对端
  • 即使窗口为0也要发
  • 只有1字节,影响小

紧急数据可以在窗口外发送。


紧急指针的设置

紧急指针的设置:

  • 紧急指针指向紧急数据后面的字节
  • 序号 + 紧急指针 = 紧急数据后第一个字节
  • 例如:
    • 当前序号是1000
    • 发送1字节紧急数据
    • 紧急指针 = 1
    • 紧急数据是第1000字节
    • 紧急指针指向1001

紧急指针是相对于当前序号的偏移。


紧急数据的发送时机

紧急数据的发送时机:

  • 立即发送
  • 不等窗口
  • 不等Nagle算法
  • 优先级高

为什么:

  • 紧急数据很重要
  • 需要立即通知对端
  • 不能等

紧急数据立即发送。


21.4 紧急数据的接收

收到紧急数据

收到紧急数据的处理:

  1. 检查URG标志
  2. 如果URG=1,有紧急数据
  3. 计算紧急指针的位置
  4. 通知应用有紧急数据
  5. 正常数据还是按顺序处理

通知应用的方式:

  • SIGURG信号
  • select的异常事件
  • 应用可以读取

收到紧急数据要通知应用。


紧急数据的读取

应用读取紧急数据:

  • 调用recv,带MSG_OOB标志
  • 读取1字节的紧急数据
  • 或者从正常数据流中读

两种方式:

  1. 带外读取

    • MSG_OOB标志
    • 单独读取
    • 不影响正常数据流
  2. 内联读取

    • 从正常数据流中读
    • 需要知道位置
    • 比较麻烦

通常用带外方式读取。


紧急数据的位置

紧急数据在数据流中的位置:

  • 紧急数据还是在正常数据流中
  • 不是真正的带外
  • 只是提前通知
  • 数据还是按顺序到达

为什么叫带外:

  • 通知是带外的
  • 数据还是带内的
  • 名字有点误导

紧急数据还是在正常数据流中,只是提前通知。


21.5 带外数据

什么是带外数据

带外数据(Out-of-Band, OOB):

  • 也叫紧急数据
  • 优先级高
  • 可以提前通知
  • TCP的紧急方式实现

带外数据就是紧急数据。


带外数据的问题

带外数据的问题:

  1. 只有1字节

    • 大多数实现只有1字节
    • 多的话实现不一致
  2. 实现不一致

    • 不同系统实现不同
    • 紧急指针的含义不同
    • 可能有兼容性问题
  3. 不是真正的带外

    • 数据还是在正常数据流中
    • 只是通知提前
    • 不是独立的通道
  4. 可能丢失

    • 如果有多个紧急数据
    • 后面的可能覆盖前面的
    • 只保留最新的

带外数据有很多问题,要小心使用。


多字节紧急数据

多字节紧急数据:

  • RFC没有明确说紧急数据多长
  • 有的实现支持多字节
  • 有的只有1字节
  • 兼容性差

建议:

  • 只用1字节
  • 兼容性好
  • 大多数实现都支持

建议只用1字节紧急数据。


21.6 紧急方式的用途

Telnet和Rlogin

Telnet和Rlogin中的使用:

  • 用户按中断键(Ctrl+C)
  • 发送紧急数据
  • 对端收到后中断正在运行的程序
  • 清空输入缓冲区

为什么用紧急方式:

  • 需要立即中断
  • 不能等缓冲区的数据都处理完
  • 紧急方式可以立即通知

Telnet和Rlogin是紧急方式的典型应用。


其他用途

其他用途:

  • 发送控制命令
  • 中断传输
  • 状态通知
  • 等等

注意:

  • 不要滥用紧急方式
  • 只有真正紧急的才用
  • 正常数据用正常方式

紧急方式应该少用,只用于真正紧急的情况。


21.7 小结

紧急指针

  1. 位置

    • TCP首部的字段
    • 16位
    • URG标志有效时才有效
  2. 含义

    • 指向紧急数据的最后一个字节
    • 相对于当前序号的偏移
  3. URG标志

    • 表示有紧急数据
    • 接收方要通知应用

紧急数据的发送

  1. 发送方式

    • MSG_OOB标志
    • 立即发送
    • 窗口为0也能发
  2. 紧急指针设置

    • 指向紧急数据后第一个字节
  3. 发送时机

    • 立即发送
    • 不等窗口
    • 不等Nagle

紧急数据的接收

  1. 接收处理

    • 检查URG标志
    • 通知应用
    • 数据还是按顺序
  2. 读取方式

    • MSG_OOB带外读取
    • 内联读取
  3. 位置

    • 还是在正常数据流中
    • 只是通知提前

带外数据

  1. 问题

    • 只有1字节
    • 实现不一致
    • 不是真正带外
    • 可能丢失
  2. 建议

    • 只用1字节
    • 小心使用

用途

  1. Telnet/Rlogin

    • 中断命令
    • 典型应用
  2. 其他

    • 控制命令
    • 状态通知
    • 少用

关键概念

  1. 紧急方式

    • 高优先级通知
    • 紧急指针
    • URG标志
  2. 带外数据

    • 就是紧急数据
    • 只有1字节
    • 实现不一致
  3. 发送接收

    • 立即发送
    • 通知应用
    • 数据还是按顺序
  4. 用途

    • Telnet/Rlogin
    • 中断命令
    • 少用

紧急方式