`

j2se----socket的缓冲区讨论

    博客分类:
  • J2SE
阅读更多
关于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,今天先总结到此,里面应该还有很多错误或者遗漏的地方,等有时间再过来修改。
分享到:
评论

相关推荐

    Java网络编程(第三版)中文版.part11.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)高清中文版.part01.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part06.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part07.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part09.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part01.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part03.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part02.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part04.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part10.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part13.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part05.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part12.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    Java网络编程(第三版)中文版.part08.rar

    缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为...

    (超赞)JAVA精华之--深入JAVA API

    1.3.6 缓冲区流 1.3.7 原始型数据流 1.3.8 对象流 1.3.9 字符流 InputStreamReader/OutputStreamWriter 1.3.10 随机存取文件 RandomAccessFile 1.3.11 小结 1.4 java中的一些常用词汇 1.5 J2SE学习中的30个基本概念 ...

    JAVA SE学习精华集锦

    1.3.6 缓冲区流 53 1.3.7 原始型数据流 53 1.3.8 对象流 54 1.3.9 字符流 InputStreamReader/OutputStreamWriter 55 1.3.10 随机存取文件 RandomAccessFile 56 1.3.11 小结 56 1.4 java中的一些常用词汇 56 1.5 J2SE...

Global site tag (gtag.js) - Google Analytics