第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字节
- 紧急指针指向的前一个字节
- 大多数实现是这样
-
紧急数据有多个字节
- 从某个位置到紧急指针
- 实现不一致
紧急数据的长度没有明确规定,实现不一致。
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 紧急数据的接收
收到紧急数据
收到紧急数据的处理:
- 检查URG标志
- 如果URG=1,有紧急数据
- 计算紧急指针的位置
- 通知应用有紧急数据
- 正常数据还是按顺序处理
通知应用的方式:
- SIGURG信号
- select的异常事件
- 应用可以读取
收到紧急数据要通知应用。
紧急数据的读取
应用读取紧急数据:
- 调用recv,带MSG_OOB标志
- 读取1字节的紧急数据
- 或者从正常数据流中读
两种方式:
-
带外读取
- MSG_OOB标志
- 单独读取
- 不影响正常数据流
-
内联读取
- 从正常数据流中读
- 需要知道位置
- 比较麻烦
通常用带外方式读取。
紧急数据的位置
紧急数据在数据流中的位置:
- 紧急数据还是在正常数据流中
- 不是真正的带外
- 只是提前通知
- 数据还是按顺序到达
为什么叫带外:
- 通知是带外的
- 数据还是带内的
- 名字有点误导
紧急数据还是在正常数据流中,只是提前通知。
21.5 带外数据
什么是带外数据
带外数据(Out-of-Band, OOB):
- 也叫紧急数据
- 优先级高
- 可以提前通知
- TCP的紧急方式实现
带外数据就是紧急数据。
带外数据的问题
带外数据的问题:
-
只有1字节
- 大多数实现只有1字节
- 多的话实现不一致
-
实现不一致
- 不同系统实现不同
- 紧急指针的含义不同
- 可能有兼容性问题
-
不是真正的带外
- 数据还是在正常数据流中
- 只是通知提前
- 不是独立的通道
-
可能丢失
- 如果有多个紧急数据
- 后面的可能覆盖前面的
- 只保留最新的
带外数据有很多问题,要小心使用。
多字节紧急数据
多字节紧急数据:
- RFC没有明确说紧急数据多长
- 有的实现支持多字节
- 有的只有1字节
- 兼容性差
建议:
- 只用1字节
- 兼容性好
- 大多数实现都支持
建议只用1字节紧急数据。
21.6 紧急方式的用途
Telnet和Rlogin
Telnet和Rlogin中的使用:
- 用户按中断键(Ctrl+C)
- 发送紧急数据
- 对端收到后中断正在运行的程序
- 清空输入缓冲区
为什么用紧急方式:
- 需要立即中断
- 不能等缓冲区的数据都处理完
- 紧急方式可以立即通知
Telnet和Rlogin是紧急方式的典型应用。
其他用途
其他用途:
- 发送控制命令
- 中断传输
- 状态通知
- 等等
注意:
- 不要滥用紧急方式
- 只有真正紧急的才用
- 正常数据用正常方式
紧急方式应该少用,只用于真正紧急的情况。
21.7 小结
紧急指针
-
位置
- TCP首部的字段
- 16位
- URG标志有效时才有效
-
含义
- 指向紧急数据的最后一个字节
- 相对于当前序号的偏移
-
URG标志
- 表示有紧急数据
- 接收方要通知应用
紧急数据的发送
-
发送方式
- MSG_OOB标志
- 立即发送
- 窗口为0也能发
-
紧急指针设置
- 指向紧急数据后第一个字节
-
发送时机
- 立即发送
- 不等窗口
- 不等Nagle
紧急数据的接收
-
接收处理
- 检查URG标志
- 通知应用
- 数据还是按顺序
-
读取方式
- MSG_OOB带外读取
- 内联读取
-
位置
- 还是在正常数据流中
- 只是通知提前
带外数据
-
问题
- 只有1字节
- 实现不一致
- 不是真正带外
- 可能丢失
-
建议
- 只用1字节
- 小心使用
用途
-
Telnet/Rlogin
- 中断命令
- 典型应用
-
其他
- 控制命令
- 状态通知
- 少用
关键概念
-
紧急方式
- 高优先级通知
- 紧急指针
- URG标志
-
带外数据
- 就是紧急数据
- 只有1字节
- 实现不一致
-
发送接收
- 立即发送
- 通知应用
- 数据还是按顺序
-
用途
- Telnet/Rlogin
- 中断命令
- 少用