带外数据(OOB)最初的想法就是:一个连接某端发生了重要的事情,而且该端希望迅速通告其对端,就需要这种东西了。。。
tcp本身并没有真正的带外数据,不过提供了紧急模式,先上tcp头各个字段~~
当tcp以MSG_OOB标志来发送带外数据时,数据被放入发送缓冲,tcp紧急指针指向oob字节的后一个字节,(注:这个oob只有一个字节)如下图:
发送时,tcp头将设置URG标志,并将紧急偏移设置如上图,tcp进入紧急模式。
tcp的紧急模式有如下的特点,在实际场景中应了然于胸:
1)进入紧急模式后,由紧急指针所指的实际字节不一定随同发出。如果对方通过advertised window通知窗口为0,则只发送一个空的tcp段,不包含任何数据,通知对面有紧急数据发送,由对方采取相应措施~~
2)如果发送多字节带外数据,则tcp紧急指针指向最后那个字节后的一个字节,即,只有最后那个字节被认为是带外数据。
3)新的OOB字节会覆盖掉就得OOB字节
4)接收端每次收到带有URG flag 的tcp段,都会检测紧急指针,以判断其是否执行新的oob,当有新的紧急指针到达时,接受进程被SIGURG信号通知(前提是,这个socket被fcntl或者ioctl设置了属主)
5)接收端读取时,读操作总是停留在带外标记上
6)如果接收端未开启SO_OOBINLINE选项,则为实际字节单独分配一个带外缓冲区,读取时,设置MSG_OOB来读取该字节;如果开启该选项,则需要调用sockamark函数来确定当前要读取数据是否位于带外带外标记。如下图所示,如果一次读取的数据超过了m字节,则只会返回m个字节,并且紧接着调用sockatmark函数判断时返回1,读取后可以进行后续读取工作
再说一点自己最近的读书体会吧,看完unpv1感觉整体框架大概有了,接下来就应该实践去了,不知道从何搞起,有可能看看源码撸起吧,纸上得来终觉浅,绝知此事要躬行哈~~~~~~~~~
阅读(2553) | 评论(0) | 转发(0) |