TCP PUSH

来源:互联网 发布:淘宝开店认证在哪里 编辑:程序博客网 时间:2024/05/22 01:39

由于发送该数据会清空发送缓冲,所以要加上PUSH标志。(告诉接收者:所有数据已发送,马上送到应用层去。)这里所说的数据包括与此PUSH包一起传输的数据以及之前就为该进程传输过来的数据

设置PUSH标志:如果待发送的数据会清空发送缓存,那么栈就会自动为此包设置PUSH标志

正在看《tcp/ip详解》
8
wrtie,每个写1024的数据,每个都会加上push标志,原因是这么说的
each write empties the sender buffer
不知道这个sender buffer是指哪个buffer?
只知道两端的advertised window size都是 4096 bytes.
具体在的图20.1---20.7
谢谢。

 

刚刚看到一点Linux 2.6.16内核相关部分,试着回答你,错误之处,楼下同志帮忙纠正.
    
所谓的send buffer,意即发送缓冲区,你看的是bsd的源代码,我这边就以Linux的源代码回答你了,反正原理是相通的。
    
在代表网络层socket的结构体struct sock中有几个关于发送缓冲区的成员数据,其中sk_wmem_queue即为发送缓冲队列,是一个由结构体struct sk_buff组成的队列,一个结构体struct sk_buff承载一个tcp数据报,对于应用程序发送的大应用数据,比如一个write8K字节的数据,由于TCP协议有MSS(最大报文段长度)的限制,假设MSS1024字节,则这8K会被拆分成81024随载数据的TCP数据报,排列在缓冲队列中,然后一次全部发出,最后一个数据报带上PSH标志,告诉对端,把收到的数据赶紧传给应用层,因为这已经是一个完整的应用数据了
    
同样,你8write,每个写1024数据,协议栈就理解为这是8个完整的应用数据,所以每个都需要带上PSH,告诉对端,这都是完整的应用数据,需要尽快传给应用层。
    
而这跟滑动窗口大小无关。

 

send buffer即发送缓冲区的意思,进程通过Write系统调用,将数据报写入发送缓冲区中,而缓冲区中数据报的发送工作交给TCP内核协议栈执行。内核发送缓冲区数据报的时候,所发送数据报的大小受MSS、通告窗口大小影响,这里MSS=1024,而且通告窗口大小为4096,也大于1024所以执行一次write即为一次写操作将1024大小数据报写入发送缓冲区,然后调用内核中的发送函数直接将这1024大小数据报发送出去,
由于该发送操作会使发送缓冲区变空,即发送发送缓冲区里所有数据,即empties the sender buffer,所以要给该数据报加上PUSH标志

0 0
原创粉丝点击