TCP标志中的URG和PSH位

URG(紧急位): 急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)

PSH(急迫位): 在一个交互程序中,当客户发送一个命令给服务器时,它设置P U S H标志并停下来等待服务器的响应。通过允许客户应用程序通知其T C P设置P U S H标志,客户进程通知T C P在向服务器发送一个报文段时不要因等待额外数据而使已提交数据在缓存中滞留。类似地,当服务器的T C P接收到一个设置了P U S H标志的报文段时,它需要立即将这些数据(包括以前存中滞留的数据)递交给服务器进程而不能等待判断是否还会有额外的数据到达。 PSH=1,只对接收方的接收缓冲区起作用,发送方通过使用PUSH位来通知接收方将所有收到的数据立即提交给服务器进程,而不需要等待额外数据(将缓存填满)而让数据在缓存中停留!这里所说的数据包括与此PUSH包一起传输的数据以及之前就为该进程传输过来的数据(滞留在缓存中的数据)。

 

1 请问TCP是根据什么来决定发出的报文是否加PSH选项?
我用工具抓包看到的是有的有PSH有的没有。但是没看出什么规律来。请高人给讲一下。
2.这个选项能否在用户写SOCKET的时候控制?
例如我想把写入SOCKET的一个字符立刻发走,就需要这个PSH选项了是吧。那如何加这个选项呢?
多谢!!

=======================================================================================

PSH字段没有相应的编程接口,应该是由tcp协议自动选择加上去的,按书上说的,一般的tcp包都会有这个字段。
如果发紧急数据,可以用 MSG_OOB ,在发送时使用。这个选项是设置URG标记的,有相应的编程接口。

=======================================================================================

非常感谢。现在基本知道他何时加PSH了。
大致是这样的:
当TCP的缓存空的时候,如果收到数据,那么他肯定是要立刻发送出去了。
当缓存快满的时候,如果他受到了数据,他就会在这个数据上大PSH标志来推送缓存的数据。

MSG_OOB我在send()的MAN中看到了。这个send()函数应该是库函数是吧。他最终也得调用write()对么?那用write()的时候想加MSG_OOB是不是需要ioctrl()?

=======================================================================================

正确。你看一下man 7 tcp,里面有介绍。

posted on 2008-12-18 16:21  starspace  阅读(2429)  评论(0编辑  收藏  举报

导航