聊一聊TCP协议中的push标志位

时间:2024-03-23 17:32:17

TCP协议字段中有6个标志位,像ACK,FIN,SYN都是喜闻乐见的标志位。但是PUSH这个标志位表示的是什么含义呢?在什么时候用呢?

PUSH标志位所表达的是发送方通知接收方传输层应该尽快的将这个报文段交给应用层。传输层及以下的数据往往是由系统所带的协议栈进行处理的,客户端在收到一个个报文之后,经由协议栈解封装之后会立马把数据交给应用层去处理吗?如果说在收到报文之后立马就交给上层,这时候应用层由于数据不全,可能也不会进行处理。而且每来一个报文就交一次,效率很低。因此传输层一般会是隔几个报文,统一上交数据。什么时候上交数据呢,就是在发送方将PUSH标志位置1的时候。那么什么时候标志位会置1呢,通常是发送端觉得传输的数据应用层可以进行处理了的时候。

举个例子来说,TLS 协议中的的证书交换部分,通常证书链的大小在3K-4K左右,一般分三个报文来进行传输。只有当这3K-4K的报文传输完毕之后,那么数据形成完整的证书链,这个时候对于接收方才是有意义的(可以进行证书链的验证),单纯的一个报文无异于乱码。因此在TLS连接中,通常会发现证书的第三个报文同上设置了push位,是发送方来告知接收方,可以把数据送往tcp的上层了,因为这些报文已经组成了有意义的内容了。同样接收方在解析了TCP的PUSH字段后,也会清空自己的缓冲区,向上层交数据。图1是使用百度搜索”CSDN 村中少年”关键词同时抓取报文中的一条数据流,表示的就是上述所述的场景:

聊一聊TCP协议中的push标志位

图1

下面再以一个HTTP报文为例说明PUSH的作用。
聊一聊TCP协议中的push标志位

图2

图2表示的是发送端在一个图片传输结束,可以看到PUSH字段被置为1,因为该报文是该图片流的最后一个报文,接下来就是四次挥手结束该流了。因此这个时候就需要将该报文交给应用层,让应用层进行显示等处理。

聊一聊TCP协议中的push标志位

图3

看一下图片流传输过程中哪些报文PUSH字段被设置为1了。对于http来说,多媒体文件,像图片等一般来说比较大,不可能像证书链完全传输完成之后,仅仅在最后一个报文在再通知接收方向上层扔数据。因此我们看到传输过程中每隔一些报文,PUSH字段就设置上了。由于通常网络较好的时候,数据会以满包状态进行传输,当然这里面是1494个字节,通常当一段数据传输完毕就会出现包长度下降,这时候PUSH就置1,提示传输层尽快刷新数据交由应用层处理。

上述就是对于PUSH标志位的理解,有可能在看TCP/IP协议的时候并不是对此很清晰,但是结合实际的传输过程,理解起来应该很容易。

本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里