1. 紧急标志

当你再次看到图 1 时,相信你已经无比的亲切,再观察下面彩色的 6 个标志位,有 5 个你已经熟知了,还剩下最后一个 URG,对,就是图 1 中那个鲜红的,醒目的那个位置。


图1 TCP 首部

除此之外,还有一个字段—— 16 位紧急指针,它正是配合 URG 标志位一起使用的,言外之意就是这个字段只有在 URG 被置位时才有意义。因为只有一个紧急指针,这也意味着它只能标识一个字节的数据。这个指针指向了紧急数据最后一个字节的下一个字节。


图2 紧急数据与紧急指针

我们知道 TCP 在传输数据时是有顺序的,它有字节号,URG 配合紧急指针,就可以找到紧急数据的字节号。紧急数据的字节号公式如下:

紧急数据字节号(urgSeq)=TCP报文序号(seq)+紧急指针(urgpoint)−1

紧急数据字节号(urgSeq) = TCP 报文序号(seq) + 紧急指针(urgpoint) - 1

比如图 2 中的例子,如果 seq = 10, urgpoint = 5, 那么字节序号 urgSeq = 10 + 5 -1 = 14.

知道了字节号后,就可以计算紧急数据字位于所有传输数据中的第几个字节了,如果从第 0 个字节开始算起,那么紧急数据就是第 urgSeq - ISN - 1 个字节(还记得 ISN 吗,它表示初始序列号),减 1 表示不包括第一个 SYN 段,因为一个 SYN 段会消耗一个字节号。

2. 紧急标志的作用

紧急标志可以用来通知对端:我放了一个紧急数据在数据流中,你看着办吧!这个特性往往可以来达到通知的目的。

一旦 TCP 知道了你要发送紧急数据,那么在接下来的数据发送中,TCP 会将所有的 TCP 报文段中的 URG 标志置位,哪怕该报文段中不包含紧急数据,这个行为会持续到紧急数据被发送出去为止。

3. 一个示例

该数据是运行 unp/protocol/tools/tcpserver/urg_server.cunp/protocol/tools/winclient/urg_client.cpp 时抓取的。

urg_client 程序每次发送 1024 字节的数据,一共发送 8 次。在第 4 次的时候,发送了 1 字节的紧急数据(字符 'X')和 1024 字节普通数据。类似下面这段代码:

for (i = 1; i <= 8; ++i) {if (i == 4) write(sockfd, 'X', 1, URG);write(sockfd, buf, 1024);
}

服务器 urg_server 接收到客户端的连接请求后,先等待 3 秒,再接收数据,每次接收 1024 字节,类似下面这样:

while(1) {sleep(3);read(sockfd, buf, 1024);//...
}

最后,抓取到的数据如图 3.


图3 抓取的包含 URG 的 TCP 报文

可以看到,当客户端在第一次发送了 1024 字节后(数据包 4),5 号数据包就发送了一个 URG。实际上,write 函数首先将数据写入自己的缓冲区,如果客户端发送缓冲区足够大,几乎一瞬间就会把 8193 个字节写入到缓冲区。

第一次 write 1024 字节到缓冲区后,TCP 直接将这 1024 字节发出去了。在收到对方的 ACK 前,TCP 都不会再发送数据(Nagle 算法),客户端又连续 write 了 7 次,写入发送缓冲区。因为在第 4 次的时候,客户端发送了一个字节紧急数据,因此,接下来 TCP 在每次发送报文时都会打开 URG 标志。直到紧急数据被发送出去。

我们看看最后一个红框框,也就是 22 号数据包:


图4 紧急数据 'X'

紧急指针 urgent pointer 的值为 1, 也就是当前 TCP 段中第一个字节。这一个字节的紧急数据,随普通数据一起发送了出去。

4. 一些坑

如果发送方多次发送紧急数据,最后一个数据的紧急指针会将前面的覆盖。比方说你发送了一个字节的紧急数据 'X',在 'X' 尚未被 TCP 发送前,你又发送了一个紧急数据 'Y',那么在后面的 TCP 报文中,紧急指针都是指向了 'Y' 的。

很多系统的实现,包括 Linux 将紧急数据称之为带外数据(out-of-band data, OOB),意为在连接之外传送的数据,实际上这是不对的(《TCP/IP 详解》一书称此不正确的)。即使是紧急数据,仍然会随着普通数据流一起发送,并不会单独为紧急数据开辟一条新的连接通道单独发送。这从图 3 中我们也可以看到,紧急数据并没有被优先发送出去。

5. 总结

  • 知道紧急标志位的作用
  • 紧急指针的含义
  • 紧急数据与带外数据

23-TCP 协议(紧急标志)相关推荐

  1. TCP协议(标志位URG、PSH,定时器,连接的建立和断开)

    目录 ●TCP段格式 ●TCP定时器 ●TCP三次握手和四次挥手 ●TCP段格式 6位标志位有紧急标志URG.推送标志PSH.确认标志ACK.复位标志RST.链接同步标志SYN以及结束标志FIN. ○ ...

  2. 判断端口是否能用_扫描器篇(八)之python+scapy构造TCP协议包扫描主机端口

    TCP协议端口扫描 要使用TCP协议去完成端口扫描,肯定是需要了解TCP协议通信过程和原理才能完成的 TCP协议的特点 1 面向连接的:使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写, ...

  3. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  4. TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束

    首先回顾一下TCP标志位的具体含义. TCP Flag标志位(控制位) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header ...

  5. TCP协议的RST标志

    下文中的内容多数来自[参考]中的文章,这边进行一个整理和总结,后续会慢慢增加出现各个 RST 包的测试代码,便于理解. TCP的 "断开连接" 标志 RST 标志 Reset,复位 ...

  6. TCP 协议标志位PSH的作用

    1. PSH 标志位 PSH 标志位TCP6个标志位中重要的一个标志.它的英文单词是 PUSH,表示"推"的意思. 了解它的作用需要首先了解缓冲区. 1.1 接收缓冲区和发送缓冲区 ...

  7. TCP协议中的PSH和URG标志位

    TCP段格式 源端口 数据发送方的端口号,2个字节 目的端口 数据接受方的端口,2个字节 序号 报文段序号,数据报文中第一个字节的序号.4个字节,共2的32次方个序列号. 确认序号 也是4个字节,是期 ...

  8. TCP协议疑难杂症全景解析|硬核

    大家好,我是Alex,今天分享一篇好文章,来自好友dog250,本文深入浅出地分析了TCP协议为什么要这样设计的背后原因,解答了几乎所有TCP疑难杂症问题,可以帮助大家查缺补漏,加深对TCP协议的理解 ...

  9. 简述tcp协议三报文握手过程_华为原理 | 传输层协议amp;交换转发原理

    Interface GigabitEthernet0/0/0 ip address 12.1.1.2 255.255.255.0 arp-proxy enable \\华为接口下默认没有开启代理ARP ...

最新文章

  1. MDSF:在线查看【模型驱动软件工厂】文章汇总
  2. powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
  3. Android Studio 代码混淆(你真的会混淆吗)
  4. 转-eclipse管理多个workspace
  5. 径向基(Radial basis function)神经网络、核函数的一些理解
  6. 区块链第三方支付已登陆菲律宾
  7. C++基础知识(五)C++的一些特性
  8. C# TextBox 自动换行问题解决
  9. scoop bucket add 后仍然报错 Couldn‘t find manifest for
  10. 个人信息安全现状及保护方法
  11. 冒泡排序 - 数据结构和算法88
  12. 在线暴躁:script /问题
  13. 从契约演进看区块链的变革性
  14. Selenium 入门篇
  15. java微信支付 需要证书吗_java引用微信支付的p12证书文件
  16. 一个屌丝程序员的青春(六四)
  17. 程序猿麒麟臂打造之路(健身二)
  18. 又又又一边缘计算初创企业融资
  19. PHP时间差七个小时怎么回事,php 怎么解决8小时时间差的问题
  20. SVN上文件出现左侧黄色箭头右侧绿色箭头的双向箭头

热门文章

  1. 网安面试题汇总--持续记录
  2. 生活不止有眼前的苟且,还有远方的苟且
  3. http://wwv.xiaonei.com/xn2.do?iid=0ae63bab-10a4-4d
  4. 银行的atm是一台通用计算机,ATM自动取款机是不是所有银行通用的,要不...
  5. buuctf:Dest0g3 520迎新赛 web EasySSTI
  6. pip更新python版本_Python pip版本升级
  7. 水-生命之源,喝水的讲究
  8. 网上购车平台购车与保养知识
  9. 80老翁谈人生(173):老翁力挺转基因,问责“反转派”
  10. SpringBoot集成alipay-easysdk