23-TCP 协议(紧急标志)
1. 紧急标志
当你再次看到图 1 时,相信你已经无比的亲切,再观察下面彩色的 6 个标志位,有 5 个你已经熟知了,还剩下最后一个 URG,对,就是图 1 中那个鲜红的,醒目的那个位置。
图1 TCP 首部
除此之外,还有一个字段—— 16 位紧急指针,它正是配合 URG 标志位一起使用的,言外之意就是这个字段只有在 URG 被置位时才有意义。因为只有一个紧急指针,这也意味着它只能标识一个字节的数据。这个指针指向了紧急数据最后一个字节的下一个字节。
图2 紧急数据与紧急指针
我们知道 TCP 在传输数据时是有顺序的,它有字节号,URG 配合紧急指针,就可以找到紧急数据的字节号。紧急数据的字节号公式如下:
紧急数据字节号(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.c
和 unp/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 协议(紧急标志)相关推荐
- TCP协议(标志位URG、PSH,定时器,连接的建立和断开)
目录 ●TCP段格式 ●TCP定时器 ●TCP三次握手和四次挥手 ●TCP段格式 6位标志位有紧急标志URG.推送标志PSH.确认标志ACK.复位标志RST.链接同步标志SYN以及结束标志FIN. ○ ...
- 判断端口是否能用_扫描器篇(八)之python+scapy构造TCP协议包扫描主机端口
TCP协议端口扫描 要使用TCP协议去完成端口扫描,肯定是需要了解TCP协议通信过程和原理才能完成的 TCP协议的特点 1 面向连接的:使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写, ...
- 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)
TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...
- TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束
首先回顾一下TCP标志位的具体含义. TCP Flag标志位(控制位) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header ...
- TCP协议的RST标志
下文中的内容多数来自[参考]中的文章,这边进行一个整理和总结,后续会慢慢增加出现各个 RST 包的测试代码,便于理解. TCP的 "断开连接" 标志 RST 标志 Reset,复位 ...
- TCP 协议标志位PSH的作用
1. PSH 标志位 PSH 标志位TCP6个标志位中重要的一个标志.它的英文单词是 PUSH,表示"推"的意思. 了解它的作用需要首先了解缓冲区. 1.1 接收缓冲区和发送缓冲区 ...
- TCP协议中的PSH和URG标志位
TCP段格式 源端口 数据发送方的端口号,2个字节 目的端口 数据接受方的端口,2个字节 序号 报文段序号,数据报文中第一个字节的序号.4个字节,共2的32次方个序列号. 确认序号 也是4个字节,是期 ...
- TCP协议疑难杂症全景解析|硬核
大家好,我是Alex,今天分享一篇好文章,来自好友dog250,本文深入浅出地分析了TCP协议为什么要这样设计的背后原因,解答了几乎所有TCP疑难杂症问题,可以帮助大家查缺补漏,加深对TCP协议的理解 ...
- 简述tcp协议三报文握手过程_华为原理 | 传输层协议amp;交换转发原理
Interface GigabitEthernet0/0/0 ip address 12.1.1.2 255.255.255.0 arp-proxy enable \\华为接口下默认没有开启代理ARP ...
最新文章
- MDSF:在线查看【模型驱动软件工厂】文章汇总
- powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
- Android Studio 代码混淆(你真的会混淆吗)
- 转-eclipse管理多个workspace
- 径向基(Radial basis function)神经网络、核函数的一些理解
- 区块链第三方支付已登陆菲律宾
- C++基础知识(五)C++的一些特性
- C# TextBox 自动换行问题解决
- scoop bucket add 后仍然报错 Couldn‘t find manifest for
- 个人信息安全现状及保护方法
- 冒泡排序 - 数据结构和算法88
- 在线暴躁:script /问题
- 从契约演进看区块链的变革性
- Selenium 入门篇
- java微信支付 需要证书吗_java引用微信支付的p12证书文件
- 一个屌丝程序员的青春(六四)
- 程序猿麒麟臂打造之路(健身二)
- 又又又一边缘计算初创企业融资
- PHP时间差七个小时怎么回事,php 怎么解决8小时时间差的问题
- SVN上文件出现左侧黄色箭头右侧绿色箭头的双向箭头
热门文章
- 网安面试题汇总--持续记录
- 生活不止有眼前的苟且,还有远方的苟且
- http://wwv.xiaonei.com/xn2.do?iid=0ae63bab-10a4-4d
- 银行的atm是一台通用计算机,ATM自动取款机是不是所有银行通用的,要不...
- buuctf:Dest0g3 520迎新赛 web EasySSTI
- pip更新python版本_Python pip版本升级
- 水-生命之源,喝水的讲究
- 网上购车平台购车与保养知识
- 80老翁谈人生(173):老翁力挺转基因,问责“反转派”
- SpringBoot集成alipay-easysdk