网络应用程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TCP数据段大小不够,当前数据段中无法包 含带外数据
发送的数据段中URG标志置位,但不包含带外
数据

对方接收缓冲区已满
发送的URG标志置位的空数据段(数据长度为
0)
TCP带外数据发送
TCP带外数据发送中的特殊情况

数据段大小不够
… N N A …
1
2
1 2

发送缓冲区(不含带外数据) … 发送缓冲区(包含带外数据A)
网络应用程序设计
-unit09 带外数据
1
主要内容
概述
TCP带外数据发送
TCP带外数据接收 带外数据标志
带外数据编程
TCP带外数据小结
2
概述
带外数据(OOB-out of band)


传输层使用带外数据发送重要(紧急)数据 通常情况下使用单独通道发送带外数据 Linux系统的socket机制支持底层协议发送 和接收带外数据 TCP协议没有真正的带外数据,而是在首部 设置URG标志位表示带外数据
a b Байду номын сангаас d e
read(fd,buf,5)
OOB MARK = 7
x y z
read(fd,buf,5)
OOB MARK = 2
z
OOB MARK = 0
19
带外数据标志
带外数据标志对正常数据的影响

带外数据标志有效时,正常数据的读取 将在带外数据标志前停止

设置该选项后带外数据保存在正常数据流中

未设置选项时TCP协议将这一字节带外数据从 正常数据流中复制到带外数据缓冲区中
12
TCP带外数据接收
未设置SO_OOBINLINE选项时

只能调用设置了MSG_OOB标志的recv、 recvfrom或者recvmsg来获得带外数据
int sockfd; char oobdata; … recv(sockfd, &oobdata, 1, MSG_OOB)
序列号 首部 确认号 1
目的端口
URG
紧急指针(=6) … 数据区
数据
… 第5个字节是带外数据
TCP带外数据发送
TCP带外数据发送过程



TCP协议将单字节带外数据拷贝到发送缓冲 区 TCP协议将发送的下一个数据段设置URG 位,紧急指针指向带外数据的下一个位置 一旦用户写带外数据,TCP协议总是立刻发 送一个URG标志置位的数据段
首 部
数据
源端口 目的端口 序列号 确认号 1 紧急指针 … 有效数据
URG
设置紧急指针的TCP数据段 (无带外数据)
9
TCP带外数据发送
TCP带外数据发送中的特殊情况

对方接收缓冲区已满
… N N A …
1
2
1 2

发送缓冲区(不含带外数据) … 发送缓冲区(包含带外数据A)
首 部
源端口 目的端口 序列号 确认号 1 紧急指针 …
17
带外数据标志
定义:带外数据在正常字节流中的位置 带外数据标志的存储和修正


socket中有一个字段记录从接收缓冲区开始 到带外数据位置的偏移量 收到带外数据通知后该偏移量有效 正常数据读取后将修改该偏移量
带外数据标志
外数据标志的存储和修正示例
a b c d e
send(fd,“xyz”,3,MSG_OOB)
3
概述
TCP协议只支持1字节带外数据
TCP使用URG标志位和紧急指针指明带外
数据

URG为带外数据标志位 紧急指针=带外数据位置+1 紧急指针的值在不同的实现中会有所不同(参 考RFC 793 和RFC 1122)
TCP带外数据没有单独数据通道,带外数据
包含在正常数据中发送
4
源端口
11
TCP带外数据接收
由于接受缓冲区大小以及TCP数据段大小的限制,
在带外数据真正到达接收方以前可能发送多个包 含紧急指针的TCP数据段 接收到URG标志的数据段时,首先比较数据段中 的紧急指针和最后一次接收的紧急指针,以确定 是否指向相同带外数据 Socket选项SO_OOBINLINE
6
TCP带外数据发送
TCP带外数据正常发送
1 2 … … N N A … 1 2
发送缓冲区(不含带外数据) … 发送缓冲区(包含带外数据A)
首 部
数 据
源端口 目的端口 序列号 确认号 1 紧急指针 … 数据 A …
URG
包含带外数据的TCP数据段
7
TCP带外数据发送
TCP带外数据发送中的特殊情况
13
TCP带外数据接收
设置了SO_OOBINLINE选项时
普通的读函数read可以读出,并且不能 设置MSG_OOB标志,否则返回错误 读取带外数据之前应该先确定下一字节 是否带外数据

int sockfd; char oobdata; … if(下一字节是带外数据) read(sockfd, &oobdata, 1)
URG
设置紧急指针的TCP数据段 (无带外数据)
10
TCP带外数据发送
发送TCP带外数据的函数

使用函数send和标志MSG_OOB发送带外 数据
发送单个字节,这个字节被认为是带外数据
send(sockfd,”A”,1,MSG_OOB);
发送多个字节,只有最后一个字节被认为是带
外数据 send(sockfd,”ABC”,3,MSG_OOB);

进程试图多次读同一个带外数据时,将返回 错误,errno=EINVAL
16
TCP带外数据接收
带外数据在正常数据流中的位置标记



TCP协议记录在正常数据流中的带外数 据的位置-带外数据标志(oob mark) 当应用程序程序发出读取正常数据的请 求时仅仅返回带外数据范围之内的数据 利用这个标记可以同步正常数据和带外 数据
15
TCP带外数据接收
接收带外数据过程中可能出现的错误 以设置了MSG_OOB标志的recv函数读取带外 数据时,如果对方没有发送带外数据,将返 回错误,errno=EINVAL 如果进程收到带外数据通知,但带外数据没 有真正到达,recv函数将返回错误, errno=EWOULDBLOCK。
14
TCP带外数据接收
TCP协议收到新的紧急指针时(无论带外
数据是否真正到达) ,通过两种方法通 知应用程序


如果设置了socket所有者(fcntl),则发送 信号SIGURG给该所有者 如果进程调用select等到socket描述符的异 常情况,select函数返回,且对应的socket 被标志为异常就绪
相关文档
最新文档