码迷,mamicode.com
首页 > 系统相关 > 详细

linux套接字通信之recv中的缓存机制的研究

时间:2014-07-13 18:43:39      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:缓存机制   通信   socket   tcpip   

    以前一直有这么一个小小的疑惑,当一个进程注册一个套接字后,如果这个套接字没有被调用recv函数接受数据包,那么这个套接字能接受到数据包吗? 或者这样说,如果我的程序注册了一个套接字去接受数据包,但是每收到一个数据包都需要很长一段时间处理,并且在处理数据包的途中recv函数使没有被调用的,那么如果程序再处理数据包的途中有数据包到来,那我的程序会不会漏过这些数据包(那个包到达的时候程序在处理别的包,而没有调用recv函数)?
    答案是不会的。事实上linux中会为每个套接字建立缓存,当属于套接字的包到达的时候,只要这个套接字已经被注册,不管你当时有没有调用recv函数,数据包都会被存在套接字的缓存中(实际上是一个skb结构链表),只要缓存没被填满,你可以随时调用recv函数从缓存中取出数据包处理。本人经过实验发现,数据包在缓存中停放的时间是很长的,个人推测应该是直到这个套接字被关闭。
    说到这里的缓存,研究过tcpip的人一定能想到tcp中的滑动窗口流量控制。没错,那里的窗口大小值其实就是你的套接字当前的剩余缓存大小值。默认下套接字的初始缓存大小为8192字节,当然,这个也是可以用套接字选项去调整的。所以,只要一个套接字被注册,那么当数据包到来后该数据包会首先被内核的协议栈处理,此时即使你的程序没有处理这个数据包,这个数据包也会保存在内核的缓存中。

linux套接字通信之recv中的缓存机制的研究,布布扣,bubuko.com

linux套接字通信之recv中的缓存机制的研究

标签:缓存机制   通信   socket   tcpip   

原文地址:http://blog.csdn.net/l1902090/article/details/37741083

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!