TCP PUSH

由于发送该数据会清空发送缓冲,所以要加上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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值