小结:关于socket读写缓冲区

原创 2007年09月19日 17:32:00

关于socket的发送缓冲区网上有诸多的讨论,这里个人小结一下,希望对以后有些帮助。首先,看下面一段代码,

//设定socket参数

#define dfUdpRcvCacheSize  256*1024 //256//接收缓冲区大小(字节)
 int optval,optlen = sizeof(int);
 optval=dfUdpRcvCacheSize; //设置读缓冲区 
 err=setsockopt(iSock,SOL_SOCKET,SO_RCVBUF,(char*)&optval,optlen);
 optval=dfUdpSndCacheSize; //设置读缓冲区
 err=setsockopt(iSock,SOL_SOCKET,SO_SNDBUF,(char*)&optval,optlen);

上面的代码无需解释,很多人应该都知道是在win32下面用来设置SOCKET接收发送缓冲区的,先不讨论上面的代码有没问题。既然提供了这样的API可以对缓冲区进行设置,那么究竟对缓冲区的设置是否有一个最大值的限制呢?先来看下网上各大技术论坛对该问题的讨论:

”只要是IP包就是65535字节,   也就是64K  
   
  这是由IP数据报的结构决定的  
   
  IP首部有个表示IP数据报总长度的16位字节,   其最大值表示为FFFF  
   
  因此最大值为65535  
   
  此数值不是纯粹的数据净负荷,而是包含了IP首部信息  
   
  而IP首部是20字节,   UDP首部是8字节  
   
  因此UDP数据部分是65535-20-8=65507   ”

显然,该段评论的论据本身是没错的,本人也专门翻了TCP/IP详解第一卷第3章的IP协议,看到了IP首部表示数据包总长度的字段是16个字节,最长表示65535,当然还要去掉首部。论据本身是对的,但该论据并不能证明我最开始提出的论点,因为我们的论点是socket发送以及读取缓冲区设置的最大长度,显然,这并不等于1个IP数据包的最大长度,甚至可以说其实两者毫无关系。原因在此,何谓发送缓冲区,其实无非是大并发量时期,socket本身都会在本身维护一个缓冲池,然后分段(注意:此次的分段,很明显,大家都知道这才是不能超过1个IP包的最大长度)往目的地址发送数据。  说到这里,应该明白不少了吧:) ,遗憾的是,本人最终还是没有查到win32对于socket接收缓冲区大小的最大限制,而在实际大并发量通讯的项目中,目前我是设置了256k,暂时没发现任何问题。

既然说到了IP包的最大长度,那么随带提一下,一切理论都要结合实践。在公网网络通信中,无论你如何七十二变,你最终都要经过中国复杂而又混乱的互联网络,那么在实际的UDP通讯中,是否每次都可以组成一个最大的IP包往外仍呢,答案自然是否定的,抛开MTU最大传输单元本身不说,通常为1.5K左右,也就是说传输层要发送的数据超过了1.5K那么IP层会自动进行数据分片,至于怎样分片以及组包,对于传输层UDP/TCP都是透明的),问题是目前实际公网的路由器,对于大于1k左右的UDP包,都会自动做丢弃处理(经过测试是这样的),所以,通常我们自己必须做的切割包大小为1k,就是超过这个大小的包都必须先在源地址进行切割,再分传送出去)OK,今天先总结到此,里面应该还有很多错误或者遗漏的地方,等有时间再过来修改。

 

 

相关文章推荐

驱动开发之 设备读写方式:缓冲区方式

1. 设备对象一共有三种读写方式:缓冲区方式读写(Buffered方式);直接方式读写(Direct方式);Neither方式。这三种方式的Flags分别对应DO_BUFFERED_IO,DO_DIR...

对C语言输入输出流和缓冲区的深入理解

导读:对C语言输入输出流和缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分...
  • SHRDLU
  • SHRDLU
  • 2015年10月06日 10:08
  • 8916

socket的发送与接收缓冲区

应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应用数据,而tcp/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用数据(t...

设置SOCKET的发送与接收缓冲区

设置SOCKET的发送与接收缓冲区

socket中用户自定义缓冲区的原因及方式

我们在使用TCP/IP编程的时候除了socket有收发数据缓冲区之外,通常我们还要自己定一个数据的收发缓冲区: 1,为什么系统已经有收发缓冲区了,我们还要自定义收发缓冲区呢?      a...

socket的发送和接收缓冲区

对于每一个TCP的SOCKET来说,都有一个发送缓冲区和接受缓冲区与之对应,下面举个例子说说发送缓冲区、接受缓冲区、滑动窗口协议之间的关系。 一、recv端     在监听套接字上准备...
  • H002399
  • H002399
  • 2015年06月23日 14:52
  • 2527

修改socket收发缓冲区大小限制

方法一: 编辑 /etc/sysctl.conf, 在最后添加内容 net.core.rmem_max=2097152 net.core.wmem_max=2097152 然后执行 /sbin/s...
  • seebit
  • seebit
  • 2013年08月15日 11:22
  • 1485

socket的发送与接收缓冲区

应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应用数据,而tcp/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用数据(t...
  • woshinia
  • woshinia
  • 2012年07月17日 12:27
  • 12764

TCP通信socket缓存读取阻塞

tcp通信——socket缓存读取阻塞 TCP通信过程,主要是数据的收发,最近一直在学习这方面的知识,其中有很多的细节部分确实是没有接触到,即便是一个小小的知识点,也会导致编程半天没有进展,需要...

互斥 临界区 自旋锁 排队自旋锁 MCSLOCK 性能简单测试

VS2013 #include #include #include using namespace std; DWORD dwTest; const DWORD dwMax = 200000...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小结:关于socket读写缓冲区
举报原因:
原因补充:

(最多只允许输入30个字)