- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十二章带外数据-Read.doc
第八章 带外数据
8.1 概述
许多传输层有带外数据(out-of-band data)的概念,有时也称为加速数据(expedited data)。这个想法是指连接双方中的一方发生重要事情,想要迅速通知对方。这里的“迅速”是指这种通知应该在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。也就是带外数据设计为比普通数据有更高的优先级。但是,带外数据是映射到现有的连接中的,而不是在顾客机和服务器之间再用一个连接。
目前,几乎所有的传输层实现都有一个不同的带外数据的实现,因此不同的传输层系统在带外数据的识别和处理上有很大不同,因此,用户进行程序设计时需要注意这一点。
8.2 TCP带外数据
8.2.1 TCP带外数据的发送和接收
TCP没有真正的带外数据,而是提供了一个紧急模式(urgent mode)。假设一个进程已向一个TCP套接口写入了N字节数据,并且这些数据被TCP放入套接口发送 缓冲区等待发送给对方。图8-1中说明了这种状态,并且标记了从1到N的数据字节。
进程现在使用send函数和NSG_OOB标志发送一个包含ASCII字符“a”的带外数据字节:
send(fd, “a”, 1, MSG_OOB);
TCP将数据放置在套接口发送缓冲区的下一个可用位置,并设置这个连接的TCP紧急指针(urgent pointer)为下一个可用位置。图8-2说明了这种状态,并且标记带外数据字节为“OOB”。
TCP紧急指针有一个比用MSG_OOB标志写入的数据多一字节的序列号。这种情况是历史遗留下来的,现在被所有的实现模仿。只要接收和发送TCP在TCP指针的解释上达成一致,就没有问题。尽管新的TCP_STDURG套接口选项可以改变紧急指针指向哪个字节的解释,但这个选项可以永远不必设置。
对于图8-2所示的TCP套接口发送缓冲区状态,由TCP发送的下一个分节将会在TCP头部中设置URG标志,并且头部中的紧急偏移(urgent offset)字段也将指向带外字节后的字节。但是这个分节可以含有也可以不含有标记为OOB的字节。是否发送OOB字节取决于在套接口发送缓冲区中它前面的字节数、TCP发送给对方的分节长度以及对方通告的当前窗口。
对于紧急指针和紧急偏移,在TCP层次,它们是不同的。在TCP头部中的16位值被称为紧急指针,它必须加上头部中的序列号字段以获得32位的紧急偏移。只有URG标志置位时,TCP才会检查紧急偏移。从程序设计角度来看,用户不需要担心这个细节,称呼TCP紧急指针就可以。
这是TCP紧急模式的一个重要特点:TCP头部指出发送者进入了紧急模式(也就是与紧急偏移一同设置的URG标志),但是由紧急指针所指的实际数据的字节却不一定被送出。其实,如果发送TCP因流量控制停止了(接收者的套接口缓冲区满了,所以它向发送者TCP通告一个为0的窗口大小),紧急通知不带任何数据地被送出。这是应用程序使用TCP的紧急模式(即带外数据)的一个原因:即使数据流因TCP的流量控制停止了,紧急通知也总会被发送到对方的TCP。
如果用户发送多个字节的带外数据,例如:
send(fd, “abc”, 3, MSG_OOB);
这时,TCP的紧急指针指向最后那个字节后面,也就是说最后那个字节(字母“c”)被认为是带外字节。
上面介绍了带外数据的发送,下面介绍了带外数据的接收。
当TCP收到了一个设置URG标志的分节时,紧急指针被检查,看它是否指向新的带外数据。也就是说,这是否首次在从发送者到接收者的数据流中TCP的紧急模式指向这个特殊字节。发送者TCP发送多个包含URG标志,但紧急指针却指向相同数据字节的分节(通常是在一个较小的时间内),这种情况相当普遍。这些分节中只有第一个导致接收进程被通知有新的带外数据到达。
当新紧急指针到达时,接收进程被通知。首先,SIGURG信号发送给套接口的属主,这里假设已调用了fcntl或者ioctl给套接口建立了属主,还假设属主进程已经为这个信号建立了信号处理程序。其次,如果进程阻塞在select调用中,等待这个套接口描述字有一个异常条件,那么select返回。
当一个新紧急指针到达时,这两个对接收进程可能的通知就会发生,而不管是否由紧急指针指向的实际数据字节已经到达接收者TCP。
当由紧急指针指向的实际数据字节到达接收者TCP时,这个数据字节可以被拉出带外或继续在线存放。SO_OOBINLINE套接口选项缺省时是不设置的,所以这个数据字节并不放入套接口接收缓冲区。相反,这个数据字节被放到这个连接的单独的1字节带外缓冲区。进程从这个特别的1字节缓冲区中读出的仅有方法是调用recv、recvfrom或者recvmsg并且指定MSG_OOB标志。
然而如果进程设置了SO_OOBINL
文档评论(0)