探秘TCP数据包中的PSH标志

今天在用wireshark分析TCP数据包的时候,发现一个特别的标志,PSH,和ACK一块使用的,不太了解,所以查了一下,发现大部分的解释都是不外乎表示这个包是带数据的,发送端告诉接收端,这个数据包以及以前接收到的数据包需要交给应用层立即进行处理。但是是什么样一种契机促使发送端添加了PSH标志呢?添加这个标志时发送端是怎样一种心情呢?(^_^)
查了一些材料,最终在《TCP/IP详解卷1:协议》这本书中找到了答案(第20章,第5节,中文版P215页,可以去看下大师的解释,如果感觉我理解的有问题,欢迎拍砖~)。
PSH在接收端的处理方式和网上查到的是一样的,就是交给应用层立即处理,但是在发送方,这个标志是在TCP层清空发送缓存,并将报文段交给IP层的时候设置的(相当于表示一次TCP层的发送操作)。(还有一点需要注意:大多数的API没有向应用层提供通知TCP层设置PUSH标志的方法,据说是因为很多实现程序认为PUSH标志已经过时,而一个好的TCP实现能够自行决定何时设置这个标志。另外,由于源于伯克利的实现一般从不将接收到的数据推迟交付给应用程序,因此它们忽略所接收的PUSH标志。至于为什么会推迟交付给应用程序,应该跟接收端的缓存队列是有关系的。)
举个栗子吧,拿书上的栗子来看~
P212 图20-3

发送方发送 4个背靠背(back-to-back)的数据报文段去填充接收方的窗口,然后停下来
等待一个ACK。接收方发送 ACK(报文段 8) ,但通告其窗口大小为0,这说明接收方已收到
所有数据,但这些数据都在接收方的TCP缓冲区,因为应用程序还没有机会读取这些数据。
另一个ACK(称为窗口更新)在17.4 ms后发送,表明接收方现在可以接收另外的4096个字节
的数据。

在此图中前4个报文段(4~7)的PSH标志被设置,因为这4个是背靠背报文段,每一个报文段被TCP产生之后直接交给了IP层,也就是说每次产生报文段之后就立刻提交给IP层,然后清空TCP层的发送缓存,并给该报文段添加PSH标志。当第9个数据包到来的时候,发送端窗口张开成4096,发送端有4个可以立即发送的报文段,这4个报文段应该是同时给了TCP层,TCP层把这4个报文段同时提交给了IP层,且清空缓存,这里只清空了一次缓存,所以只有最后一个报文段带了PSH标志。

当然,上述仅是个人理解,不一定完全正确,欢迎回复讨论,无讨论不进步~

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值