关于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》是一份深度总结Java标准版(Java 2 Platform, Standard Edition,简称J2SE)核心知识的教学资料,由知名IT教育专家孙鑫精心编撰。这份PPT涵盖了Java SE的各个方面,旨在帮助学习者系统地...
而`java.nio`包提供了一种更高效、更面向缓冲区的I/O模型。 在编程过程中,经常会遇到异常处理。`java.lang.Throwable`类及其子类如`Exception`和`Error`,定义了Java中的错误和异常体系,使得程序能以优雅的方式...
13. **IO与NIO**:传统的IO流与New IO(NIO)的区别,NIO的非阻塞特性、通道(Channel)和缓冲区(Buffer)。 14. **网络编程**:Socket编程,TCP与UDP的区别,以及ServerSocket和Socket类的使用。 15. **Swing...
理解流的概念、分类(如字节流和字符流、输入流和输出流)以及缓冲区的概念,能帮助你处理各种数据传输问题。 6. **多线程**:Java支持多线程编程,这使得程序能够同时执行多个任务。你需要学习如何创建和管理线程...
5. **I/O与NIO**:`java.io`提供了传统的阻塞I/O,而`java.nio`引入了非阻塞I/O,提高了大规模并发I/O操作的效率,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)等概念。 6. **网络编程**:`java.net`包中...
6. **网络编程**:介绍 Socket 和 ServerSocket 类,用于创建客户端和服务器端的网络通信,以及 URL、URLConnection 用于访问网络资源。 7. **反射机制**:讲解如何在运行时获取类的信息,创建对象,调用方法,以及...
13. **NIO(New IO)**: 研究非阻塞I/O,通道(Channel)和缓冲区(Buffer)的概念,以及选择器(Selector)的使用。 **多线程** 14. **Thread类与Runnable接口**: 创建和管理线程,了解同步和互斥。 15. **...
4. **IO流**:掌握输入/输出流的概念,包括字节流、字符流,以及缓冲区流的使用。 5. **多线程**:理解线程的创建、同步、通信,以及死锁等问题。 6. **网络编程**:学习Socket编程,实现客户端和服务端的通信。 ...
NIO(New Input/Output)是Java提供的一种更高效、非阻塞的I/O模型,它引入了通道(Channels)和缓冲区(Buffers)的概念。 4. **集合框架**:Java.util包中的ArrayList、LinkedList、HashSet、HashMap等是Java集合...
8. **多线程**:讨论并发编程的基础,如Thread类的使用、同步机制(synchronized关键字、wait()、notify()和notifyAll()),以及ExecutorService和Callable接口。 9. **反射机制**:介绍如何在运行时动态获取类的...
NIO(New IO)引入了通道(Channels)和缓冲区(Buffers),提供了一种更高效的数据传输方式。 5. **反射**:反射机制允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用它们。虽然反射使用不当...
5. **IO流**:理解输入输出流的概念,学习如何进行文件读写,以及使用缓冲区提高效率。了解字节流和字符流的区别,以及如何进行对象序列化。 6. **多线程**:掌握线程的创建和管理,包括继承Thread类和实现Runnable...
- **缓冲区**:提高读写效率,通过BufferedReader和BufferedWriter等类实现。 7. **JAVA网络的基本知识**(第十一讲): - **网络编程**:使用Socket和ServerSocket类创建客户端和服务器端通信。 - **URL和...
6. **输入输出流**:掌握File类,理解I/O流的基本概念,包括字节流和字符流,学会读写文件,以及使用缓冲区提升效率。 7. **多线程编程**:理解线程的概念,创建Thread类实例或实现Runnable接口,掌握同步机制,如...
Java 异步Socket调用是J2SE 1.4版本引入的重要特性,这一特性极大地改进了Java在网络编程中的性能和效率。在之前的版本中,Socket通信通常采用同步方式进行,这意味着输入输出操作必须等待完成才能进行下一步,这在...
9. **IO流**:掌握输入输出流的使用,包括文件读写、对象序列化和反序列化,以及缓冲区流和转换流。 10. **多线程**:理解线程的概念,学习Thread类和Runnable接口,以及线程同步机制,如synchronized关键字、wait...
5. **输入输出流**:掌握I/O流的概念,使用File类进行文件操作,理解字节流和字符流的区别,学习使用缓冲区提高效率。 6. **集合框架**:学习ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用,理解接口...
8. **JVM内部工作原理**:了解Java虚拟机的内存模型(堆、栈、方法区、本地方法栈和程序计数器),垃圾收集机制(分代收集、可达性分析算法等),以及如何优化JVM参数以提升应用性能。 9. **泛型**:泛型引入了类型...
14. **NIO(非阻塞I/O)**:了解选择器、通道和缓冲区的概念,提升I/O性能。 15. **日期和时间API**:学习Java 8中的日期时间API,如LocalDate、LocalTime、LocalDateTime等,替换传统的Date和Calendar。 16. **...