`

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

相关推荐

    J2SE-孙鑫授课总结的ppt

    《J2SE-孙鑫授课总结的PPT》是一份深度总结Java标准版(Java 2 Platform, Standard Edition,简称J2SE)核心知识的教学资料,由知名IT教育专家孙鑫精心编撰。这份PPT涵盖了Java SE的各个方面,旨在帮助学习者系统地...

    j2se-doc-cn java的API文档,有助于你写JAVA程序

    而`java.nio`包提供了一种更高效、更面向缓冲区的I/O模型。 在编程过程中,经常会遇到异常处理。`java.lang.Throwable`类及其子类如`Exception`和`Error`,定义了Java中的错误和异常体系,使得程序能以优雅的方式...

    java-j2se.rar_j2se

    13. **IO与NIO**:传统的IO流与New IO(NIO)的区别,NIO的非阻塞特性、通道(Channel)和缓冲区(Buffer)。 14. **网络编程**:Socket编程,TCP与UDP的区别,以及ServerSocket和Socket类的使用。 15. **Swing...

    J2SE学习入门教程

    理解流的概念、分类(如字节流和字符流、输入流和输出流)以及缓冲区的概念,能帮助你处理各种数据传输问题。 6. **多线程**:Java支持多线程编程,这使得程序能够同时执行多个任务。你需要学习如何创建和管理线程...

    j2SE中文API帮助文档

    5. **I/O与NIO**:`java.io`提供了传统的阻塞I/O,而`java.nio`引入了非阻塞I/O,提高了大规模并发I/O操作的效率,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)等概念。 6. **网络编程**:`java.net`包中...

    j2se doc 中文版.rar

    6. **网络编程**:介绍 Socket 和 ServerSocket 类,用于创建客户端和服务器端的网络通信,以及 URL、URLConnection 用于访问网络资源。 7. **反射机制**:讲解如何在运行时获取类的信息,创建对象,调用方法,以及...

    J2SE程序Demo

    13. **NIO(New IO)**: 研究非阻塞I/O,通道(Channel)和缓冲区(Buffer)的概念,以及选择器(Selector)的使用。 **多线程** 14. **Thread类与Runnable接口**: 创建和管理线程,了解同步和互斥。 15. **...

    j2se 编程 教程

    4. **IO流**:掌握输入/输出流的概念,包括字节流、字符流,以及缓冲区流的使用。 5. **多线程**:理解线程的创建、同步、通信,以及死锁等问题。 6. **网络编程**:学习Socket编程,实现客户端和服务端的通信。 ...

    J2SE.rar_j2se

    NIO(New Input/Output)是Java提供的一种更高效、非阻塞的I/O模型,它引入了通道(Channels)和缓冲区(Buffers)的概念。 4. **集合框架**:Java.util包中的ArrayList、LinkedList、HashSet、HashMap等是Java集合...

    j2se.rar_j2se

    8. **多线程**:讨论并发编程的基础,如Thread类的使用、同步机制(synchronized关键字、wait()、notify()和notifyAll()),以及ExecutorService和Callable接口。 9. **反射机制**:介绍如何在运行时动态获取类的...

    J2SE进阶(技术提高)

    NIO(New IO)引入了通道(Channels)和缓冲区(Buffers),提供了一种更高效的数据传输方式。 5. **反射**:反射机制允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用它们。虽然反射使用不当...

    JAVA参考大全.J2SE.pdf.zip

    5. **IO流**:理解输入输出流的概念,学习如何进行文件读写,以及使用缓冲区提高效率。了解字节流和字符流的区别,以及如何进行对象序列化。 6. **多线程**:掌握线程的创建和管理,包括继承Thread类和实现Runnable...

    java 入门教程课件——j2se

    - **缓冲区**:提高读写效率,通过BufferedReader和BufferedWriter等类实现。 7. **JAVA网络的基本知识**(第十一讲): - **网络编程**:使用Socket和ServerSocket类创建客户端和服务器端通信。 - **URL和...

    JAVA培训叫j2se课件

    6. **输入输出流**:掌握File类,理解I/O流的基本概念,包括字节流和字符流,学会读写文件,以及使用缓冲区提升效率。 7. **多线程编程**:理解线程的概念,创建Thread类实例或实现Runnable接口,掌握同步机制,如...

    java异步socket调用[文].pdf

    Java 异步Socket调用是J2SE 1.4版本引入的重要特性,这一特性极大地改进了Java在网络编程中的性能和效率。在之前的版本中,Socket通信通常采用同步方式进行,这意味着输入输出操作必须等待完成才能进行下一步,这在...

    java笔记(j2se部分)

    9. **IO流**:掌握输入输出流的使用,包括文件读写、对象序列化和反序列化,以及缓冲区流和转换流。 10. **多线程**:理解线程的概念,学习Thread类和Runnable接口,以及线程同步机制,如synchronized关键字、wait...

    东方标准java基础和J2SE课件(内部资料)

    5. **输入输出流**:掌握I/O流的概念,使用File类进行文件操作,理解字节流和字符流的区别,学习使用缓冲区提高效率。 6. **集合框架**:学习ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用,理解接口...

    J2SE 下不部分 PPT资料

    8. **JVM内部工作原理**:了解Java虚拟机的内存模型(堆、栈、方法区、本地方法栈和程序计数器),垃圾收集机制(分代收集、可达性分析算法等),以及如何优化JVM参数以提升应用性能。 9. **泛型**:泛型引入了类型...

    J2SE]应用编程150例

    14. **NIO(非阻塞I/O)**:了解选择器、通道和缓冲区的概念,提升I/O性能。 15. **日期和时间API**:学习Java 8中的日期时间API,如LocalDate、LocalTime、LocalDateTime等,替换传统的Date和Calendar。 16. **...

Global site tag (gtag.js) - Google Analytics