一、概述

我们在最开始介绍TCP头结构的时候,里面有个URG的标志位,还有一个Urgent Pointer的16bits字段。当URG标志位有效的时候,Urgent Poinert用来指示紧急数据的相对于TCP头中系列号Seq的位置,系列号和紧急指针值的和我们称呼为退出点(exit point)。应用程序写入数据的时候可以通过MSG_OOB的socket选项来指定紧急数据。实际上因为紧急数据只有一个指针来指示并没类似长度的字段,因此紧急数据也只能有1bytes。RFC6093已经建议不要在继续使用紧急数据了。当TCP接收端接收到URG标志位有效的报文的时候,接收端进入紧急模式(urgent mode)。在RFC6093之前,紧急指针有指向紧急数据对应的byte的,也有指向紧急数据的下一个byte的。RFC6093则规定Urgent Poniter用来指示紧急数据的下一个byte。Linux下则可以通过/proc/sys/net/ipv4/tcp_stdurg参数控制TCP接收到紧急指针时候的解析行为,该参数默认值为0,此时TCP按照RFC6093来解析紧急数据。当该参数设置为非0的时候,TCP则认为紧急指针指向了紧急数据对应的byte。

在Socket编程中,紧急数据被称呼为out-of-band(OOB)数据,实际上TCP并没有实现真实的OOB能力。如果接收者要读取这样OOB数据,必须通过MSG_OOB选项来读取1byte的紧急数据,或者指定MSG_OOBINCLINE来让紧急数据随普通数据一起读取出来。

二、wireshark示例

1、紧急指针与window probe的交互

client端连续写入4000bytes、3000bytes、4000bytes、4000bytes、1byte紧急数据、1000bytes、休眠1500ms、最后在写入1byte的紧急数据

server端设置固定收窗口为7000,先休眠1000ms后读取出缓存中的全部数据,接着在休眠1000ms。然后读取处缓存中全部数据

最终client和server的交互如下图所示,window probe和延迟ACK等相关内容前面示例已经解释很多次了,此处不再解释

在下面图示中可以看到在有紧急指针数据的时候,persist定时器每次超时的时候会连续发送两个window probe报文,如No8和No9、No11和No12,linux实现上每次persist timer定时器超时,如果当前有紧急数据则会先以snd_una为系列号发送一个Len=0的probe报文,然后在以(snd_una-1)为系列号发送一个Len=0的报文。之前我们已经说过以(snd_una-1)为系列号的报文会被linux认定为无效系列号而直接丢弃,因此会在发送这个报文之前以snd_una为系列号发送一个报文指示紧急数据。但是实际上两个probe报文都指示了有效的紧急数据位置。例如No8报文指示的紧急数据的下一个byte系列号为7001+8001,No9报文指示的位置为7000+8002,可见两者指示的紧急数据的位置是相同的。但是同时注意到这两个报文中虽然指示了紧急指针的位置但是,对应位置的紧急数据并没有在这两个报文中传输。

另外注意No18的时候Urg=1001,然后client端写入1byte的紧急数据后,到No21的时候,Urg=2002,可见新写入的紧急数据会覆盖旧的紧急数据。

TCP系列35—窗口管理&流控—9、紧急机制的更多相关文章

  1. TCP系列27—窗口管理&流控—1、概述

    在前面的内容中我们依次介绍了TCP的连接建立和终止过程和TCP的各种重传方式.接着我们在这部分首先关注交互式应用TCP连接相关内容如延迟ACK.Nagle算法.Cork算法等,接着我们引入流控机制(f ...

  2. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...

  3. TCP系列36—窗口管理&流控—10、linux下的异常报文系列接收

    在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在 ...

  4. TCP系列33—窗口管理&流控—7、Silly Window Syndrome(SWS)

    一.SWS介绍 前面我们已经通过示例看到如果接收端的应用层一直没有读取数据,那么window size就会慢慢变小最终可能变为0,此时我们假设一种场景,如果应用层读取少量数据(比如十几bytes),接 ...

  5. TCP系列32—窗口管理&流控—6、TCP zero windows和persist timer

    一.简介 我们之前介绍过,TCP报文中的window size表示发出这个报文的一端准备多少bytes的数据,当TCP的一端一直接收数据,但是应用层没有及时读取的话,数据一直在TCP模块中缓存,最终受 ...

  6. TCP系列34—窗口管理&流控—8、缓存自动调整

    一.概述 我们之前介绍过一种具有大的带宽时延乘积(band-delay product.BDP)的网络,这种网络称为长肥网络(LongFatNetwork,即LFN).我们想象一种简单的场景,假设发送 ...

  7. TCP系列30—窗口管理&流控—4、Cork算法

    一.Cork算法概述 Cork算法与Nagle算法类似,也有人把Cork算法称呼为super-Nagle.Nagle算法提出的背景是网络因为大量小包小包而导致利用率低下产生网络拥塞,网络发生拥塞的时候 ...

  8. TCP系列29—窗口管理&流控—3、Nagle算法

    一.Nagle算法概述 之前我们介绍过,有一些交互式应用会传递大量的小包(称呼为tinygrams),这些小包的负载可能只有几个bytes,但是TCP和IP的基本头就有40bytes,如果大量传递这种 ...

  9. TCP系列28—窗口管理&流控—2、延迟ACK(Delayed Acknowledgments)

    一.简介 之前的内容中我们多次提到延迟ACK(Delayed Ack),延迟ACK是在RFC1122协议中定义的,协议指出,一个TCP实现应该实现延迟ACK,但是ACK不能被过度延迟,协议给出延迟AC ...

随机推荐

  1. Java三种代理模式

    本文转自:https://mp.weixin.qq.com/s/nBmbNP2mR7ei-lDsuOxjWg 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象 ...

  2. MySQL数据库 : 函数和存储过程

    CONCAT 可以把多个字符串连在一起,如把 doc_id 和 title这两个字段的查询结果组合成一个字符串:SELECT CONCAT(doc_id,title) FROM simhash; CO ...

  3. Delphi Math单元函数

    本文转至http://blog.sina.com.cn/s/blog_976ba8a501010vvf.html 这个单元包含高性能的算术.三角.对数.统计和金融方面的计算及FPU程序函数用于补充De ...

  4. ArrayList的源码分析(基于jdk1.8)

    1.初始化 transient Object[] elementData; //实际存储元素的数组 private static final Object[] DEFAULTCAPACITY_EMPT ...

  5. 『Python基础-8』列表

    『Python基础-8』列表 1. 列表的基本概念 列表让你能够在一个地方存储成组的信息,其中可以只包含几个 元素,也可以包含数百万个元素. 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  6. python学习——面对对象进阶

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass a = Foo() print(isins ...

  7. 【转载】深入研究Windows内部原理绝对经典的资料

    原文:深入研究Windows内部原理绝对经典的资料 另一篇资料:深入研究Windows内部原理系列 (为了方便大家下,我打包了放在一下地址: 1-6:http://download.csdn.net/ ...

  8. LeetCode:36. Valid Sudoku(Medium)

    1. 原题链接 https://leetcode.com/problems/valid-sudoku/description/ 2. 题目要求 给定一个 9✖️9 的数独,判断该数独是否合法 数独用字 ...

  9. 相机-imu外参校准总结

    1. 研究背景及相关工作 1)研究背景 单目视觉惯性slam是一种旨在跟踪移动平台的增量运动并使用来自单个车载摄像头和imu传感器的测量结果同时构建周围环境地图的技术.视觉相机和惯性测量单元(imu) ...

  10. springboot shiro没有注解解决方案

    颓废的悠然   springboot shiro开启注释 shiroconfiguration中增加 1 2 3 4 5 6 7 @Bean     public AuthorizationAttri ...