TCP 标志位: PASH 和 URG (译)

Posted by 黄润豪 on Monday, January 28, 2019

TOC

TCP 头部中的标志位, 是一些 1 bit 的布尔值字段, 用于影响 TCP 连接的数据流. 忽略 RFC 3168 为拥塞通知添加的 CWR 和 ECE 两个标志位, 总共有 6 个 TCP 标志位, 分别为: URG, ACK, PSH, RST, SYN, FIN. 其中 ACK, RST, SYN, FIN 是大家所熟知的, 它们的作用是控制 TCP 连接的建立, 保持, 和关闭.

  • SYN - 建立连接.
  • ACK - 对接收到的数据作出响应.
  • FIN - 关闭连接.
  • RST - 关闭异常的连接.

大家对另外两个标志位, PSH (push) 和 URG(urgent) 不是那么熟悉. 它们将会是这篇文章重点介绍的对象.

PSH 标志

要了解 PSH 标志的功能, 我们首先需要了解 TCP 是如何缓冲数据的. TCP 处于 OSI 七层模型的第四层, 它向上层提供了一个可以读写的简单 socket, 同时掩盖了基于包通信的复杂性. 为了让应用程序可以随时地对这个 socket 进行读取和写入, 在两个方向 TCP 连接都会有一个缓冲区.

下图显示了发送方在发送前如何缓冲数据, 以及接收方在接收时如何缓冲数据:

TCP_buffers.png

缓冲区可以使多个最大包(MSS)的发送更加的有效(例如: 传输大文件). 但是, 在处理要求尽可能快地传输数据的实时应用, 在缓冲区的弊大于利. 考虑下面的情况: 在一个 telnet 会话中, 如果 TCP 等到有足够的数据去填充包时, 才把包发送出去; 那么你将需要键入一千个字符, 才能让包发送给另外一端.

在这种情况下就需要 PSH 标志了. 应用在往 TCP 提供的 socket 写入数据时, 可以选择立即写入, 而不用等待其他数据进入缓冲区. 要想得到这个效果, 只需将发出去的包的 PSH 标志设为 1 (打开). 另外一端在接收到 PSH 标志为 1 的包时, 会立刻把包转发给应用. 总而言之, TCP 的 push 功能完成了两件事:

  • 发送端应用通知 TCP, 说: “应该立刻把数据发送出去”.
  • 接收端 TCP 在接收到带 PSH 标志的消息后, 应用立即把数据推给接收端应用.

UGR 标志

URG 标志用于给接收端表明, 在 Segment 中的数据非常紧急, 应该优先考虑. 如果设置了 URG 标志, 那么接收端会求出紧急指针(Urgent Pointer, 一个位于 TCP 头部的 16 个字节的字段)的值. 这个指针指出 Segment 中, 从第一个字节开始, 有多少数据是紧急的.

原文: TCP Flags: PSH and URG

「真诚赞赏,手留余香」

AbeWang's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付


comments powered by Disqus