小结:关于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...
  • liyun123gx
  • liyun123gx
  • 2014年07月22日 15:48
  • 1586

TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系

一个例子明白发送缓冲区、接受缓冲区、滑动窗口协议之间的关系。 在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例子,由于...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月18日 08:22
  • 14011

关于socket读写缓冲区小结

关于socket的发送缓冲区网上有诸多的讨论,这里个人小结一下,希望对以后有些帮助。首先,看下面一段代码, //设定socket参数 #define dfUdpRcvCacheSize  256*...
  • jiangyiaxiu
  • jiangyiaxiu
  • 2011年11月08日 13:15
  • 3123

socket的发送和接收缓冲区

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

tcp socket的发送与接收缓冲区

tcp socket的发送缓冲区实际上是一个结构体struct sk_buff的队列,我们可以把它称为发送缓冲队列,由结构体struct sock的成员sk_write_queue(struct sk...
  • u010359641
  • u010359641
  • 2014年10月15日 14:00
  • 603

tcp socket发送缓冲区、接受缓冲区、滑动窗口协议之间的关系

原文:http://webseo8.net/newsinfo.aspx?type=0&id=220&page=0    点击打开链接 对于每一个TCP的SOCKET来说,都有一个发送缓冲区和接受...
  • qq2007xia
  • qq2007xia
  • 2014年09月03日 18:03
  • 978

设置Socket缓冲区的大小

在进行socket通信的时候我们通过调用recv()函数或者send() 去接收或者发送一个数据块例如: char sndBuf[1024]; int sndLen = send(sock, sndB...
  • songchao_2011
  • songchao_2011
  • 2014年01月03日 20:34
  • 2603

高性能大容量SOCKET并发(三):接收、发送、缓存

接收 完成端口是结合重叠端口一起使用的,在接收数据之前,我们需要投递一个接收请求,使用function WSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBu...
  • yongwuxin
  • yongwuxin
  • 2012年09月10日 10:07
  • 1599

linux下查看系统socket读写缓冲区

一:linux下查看系统socket读写缓冲区大小配置: http://blog.csdn.net/herecles/article/details/8146017 1. tcp 收发缓冲...
  • u013817194
  • u013817194
  • 2017年09月15日 14:10
  • 720

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

我们在使用TCP/IP编程的时候除了socket有收发数据缓冲区之外,通常我们还要自己定一个数据的收发缓冲区: 1,为什么系统已经有收发缓冲区了,我们还要自定义收发缓冲区呢?      a...
  • farmwang
  • farmwang
  • 2017年03月21日 17:42
  • 1267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小结:关于socket读写缓冲区
举报原因:
原因补充:

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