影响Socket数据接收发送的选项设置

标签: socket 数据 接收 | 发表时间:2014-01-07 17:31 | 作者:xiaonanforever
出处:http://www.iteye.com
为了叙述比较方便,我们先从JavaSocket模型说起
JavaSocket模型
        javaSocket模型如下图所示:

   Java Socket运行在JVM或者底层OS提供的native socket之上,所有对Java Socket的操作都反映到native socket。所以从Socket发展渊源看,影响Socket性能的选项也必然是native socke暴露给Javat的一些设置。
Socket Options
这些选项主要影响native socket如何发送和接收数据,从而影响Socket的性能。这些选项以及支持的JDK版本入下表所示:
#
选项
Java版本
Default
说明
1
TCP_NODELAY
1.1+
false
设置是否尽快发送packer,而不管其大小
2
SO_TIMEOUT
1.1+
0
数据读取超时,0表示永不超时
3
SO_LINGER
1.1+
false
设置socket关闭后,没有发送的数据包逗留时间
4
SO_RCVBUF
1.2+
 
接收Buffer
5
SO_SNDBUF
1.2+
 
发送Buffer
6
SO_KEEPALIVE
1.3+
false
连接存活探测
7
OOBINLINE
1.4+
false
紧急数据处理设置
8
SO_REUSEADDR
1.4+
false
地址重用设置
1)TCP_NODELAY
因为有Buffer的使用,TCP协议一般情况(Nagle算法),小数据包都是和其他大数据包一块打包发送,然后后续发送数据包之前需要收到已发送包的确认,否则一直等待。因为数据包的捆绑传输,远程不能及时确认发送的数据包,如果应用大部分传输小数据包的话,会明显感觉信息处理速度会降下来。最明显受此影响的是游戏应用,因为鼠标的移动传输都是小数据包。在这样的环境,setTcpNoDelay(true)可以禁用Buffer,让数据尽快发出去。
2)SO_TIMEOUT
一般情况下,当从socket读取数据时,read方法会阻塞必要长时间获取足够(而不是必须一定指定长度)的数据,或者永远block下去。通过设置SO_TIMEOUT,可以控制最长Block多长时间,在时间超市后,将抛出InterruptedIOException 。
3)SO_LINGER
SO_LIGER选项处理在socket关闭后还没有发出去的数据如何处理。缺省条件下,在socket close方法立即返回后,系统仍将继续发送未发送出去的数据。如果逗留(linger)时间设置为0,那么没有发送的包将被丢弃;如果设置一个时间值t秒,close方法会block等待数据传输和响应接收,当时间结束之后,socket关闭,没有发送出去的数据包和响应将丢弃不予处理。逗留时间不能设置为负数,否则将抛出IllegalArgumentException,但是getSoLinger可以返回-1,表示此选项还没有启用。逗留时间最大允许设置65535秒(超过18小时,对于一般的应用已足够了)。总体上说,平台的默认值非常恰当,我们不需要特别设置。
4)SO_RCVBUF
大部分TCP协议栈使用Buffer提高网络性能。大容量Buffer倾向于提高高带宽的网络性能,而低速网络使用小容量Buffer更合适。一般说来,传输连续大块数据的协议,如FTP、HTTP,使用大容量Buffer更合适,而小数据量、非连续数据包,如Telnet和很多关注交互性的服务协议建议采用小容量Buffer。这里的内容也上面提到的TCP_NODELAY发生了呼应。具体设置对象合适,没有定论,只能按照上面提到的准则进行微调,另外需要注意setReceiveBufferSize只是给底层实现提了一个建议值,底层可以忽略,所以为了验证设置是否成功,需要set之后get确认一下。
5)SO_SNDBUF

设置发送Bufffer,对socket传输数据影响和SO_RCVBUF类似

6)SO_KEEPALIVE
如果SO_KEEPALIVE设置为true,socket会间歇(这个间歇时间一般是2小时)地在空闲连接上发送一个包给服务器,以确认服务器没有crash。如果请求没有被响应,客户端继续尝试,直到在12分内没收到响应,客户端断开socket。如果没有设置或者设置为false,那么不活动的客户端将可能永远也感知不到服务段已经crash。如果客户端是活跃的,那么这个值没有设置的必要。如果想把默认值从2小时给成其他时间,需要修改操作系统内核参数(Linux)。探测时间间隔设置合适可以作为应用心态使用,但不能完全替代,因为应用心跳需要判断一些业务状态,而不仅仅是链路断开与否。另外,还需要注意keepalive时间值修改是全局有效的,不仅仅客户端自己,所有平台上的Socket应用都会收到影响。
在Linux上设置位置在

/proc/sys/net/ipv4/tcp_keepalive_time        每次确认包发送的间隔时间 
/proc/sys/net/ipv4/tcp_keepalive_intvl        每次确认最多重发次数 
/proc/sys/net/ipv4/tcp_keepalive_probes    重试间隔

7)OOBINLINE
紧急数据被立即发送,接收端收到通知后也先于其他数据处理。在发送紧急数据时,如果必要(?)任何当前Buffer内的数据都会被先flush。接收端如何处理这个数据存在一些模糊。有的平台和API把它和平常数据分开处理,然后大多数解决方案是把它放到普通数据队列,让应用自己去从队列中获取处理。
缺省条件下,java倾向于忽略。如果想伴随平常数据接收,需要setOOBInline(true),这样任何紧急数据达到使,将像普通数据一样被放置到inputstream。Java不区分是否紧急数据,仅是高知底层实现。
8)SO_REUSEADDR
当socket被关闭时,它不会立即释放本地地址,因为此时非常有可能网络连接还在打开状态,而是等上那么一小会,确保收下仍在网络中传输的数据包。而底层系统对数据包不做任何处理,仅仅保证没有其他socket邦定到这个地址,以免发生数据错乱。
如果服务端口是个随机的端口,这不是一个问题,然而对于像23这样著名端口,因为他阻止了其他socket使用这个端口。(有什么问题吗?)如果设置开启这个选项,在数据对于前面socket已经无效的条件下重用端口。
需要注意此选项必须在邦定具体端口端口之前设置,否则无效。

服务设置

针对一些不同的Internet服务设置不同的服务级别是一种有效的Internet资源利用和服务体现。例如视频/音频服务需要高带宽、低延时,但允许少量丢包,而email等对贷款和延时不太关注,主要在合理的时间传输到就无伤大雅。这和分布式CAP理论一样,满足所有美好特性的服务很难达成,一是资源部允许,而是没有必要。

TCP定义了四种服务类型,但这些不一定在所有路由器等网络设备和本地TCP栈支持,这些设置仅是给底层实现一个提示

1)低成本,0x02

2)高可靠性,0x04

3)最大吞吐量,0x08

4)最小延时,0x10

这四种服务可以组合设置,通过位或运算设置:

public void setTrafficClass(int trafficClass) throws SocketException

比如我们设置视频服务的设置s.setTrafficClass(0x08 | 0x10);

在Java5之后增加了一个不同方法设置这些服务偏好:

public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

这个方法用数值表达在连接时间、延时、贷款一个偏好。如setPerformancePreferences(1,101,2),表示最看重latency,其次bandwidth,最不关注的是connectionTime。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [socket 数据 接收] 推荐:

影响Socket数据接收发送的选项设置

- - Java - 编程语言 - ITeye博客
为了叙述比较方便,我们先从JavaSocket模型说起.         javaSocket模型如下图所示:.    Java Socket运行在JVM或者底层OS提供的native socket之上,所有对Java Socket的操作都反映到native socket. 所以从Socket发展渊源看,影响Socket性能的选项也必然是native socke暴露给Javat的一些设置.

有关socket read

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 实际开发中,网络程序最可能遇到的就是数据没收到、收到错误数据这样诡异的问题.. 很多时候,都是由于对socket read的细节理解的不一致,导致了程序前后的矛盾. 下面详细阐述整个read的过程. read函数是负责从fd中读取内容.. 当读成功时, read返回实际所读的字节数.

Socket的速率控制

- - CSDN博客互联网推荐文章
做一个以精确速率向外输出数据的数据源,要完成这个目标,最基础的是:. 1、找到一种精确的计时器,在精确的时间范围内控制数据源以指定的速度向外发送数据. 2、通过对套接字选项和线程优先级的设置减少网络因素对发送速度造成的影响,从而提高发送精度,保证数据的实际发送量尽可能的达到指定的理论发送量.      针对第一个要求,通过寻找到一种时间精度达到微秒级的精确计数器来保证,在硬件支持的情况下可以通过WindowsAPI获取时钟频率以及震荡次数,通过在事件两端分别调用函数得到震荡次数的差值并结合时钟频率可以计算出精确的时间间隔,通过指定的传输速度和精确的延时可以计算出需要发送的数据量.

ZeroMQ(java)中监控Socket

- - CSDN博客架构设计推荐文章
基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情. 而且由于ZeroMQ中将连接的建立和重连接都进行了隔离,用户不需要做什么事情来维护连接,当然这样做的好处是使程序员的编码工作变少了,但是当然也有不好的地方,那就是用户失去了对ZeroMQ整个运行阶段的控制.

java socket参数详解:BackLog

- - 开源软件 - ITeye博客
 java socket参数详解:BackLog. 输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数. 如果队列满时收到连接指示,则拒绝该连接. backlog参数必须是大于 0 的正值. 如果传递的值等于或小于 0,则假定为默认值. 经过测试这个队列是按照 FIFO(先进先出)的原则.

HTML5 Web socket和socket.io - wishyouhappy

- - 博客园_首页
   HTML5的新特性,用于双向推送消息(例如网页聊天,手机推送消息等). client利用regular http请求webpage. 请求的webpage 执行javascript脚本,open a connection to server.. 有新的信息时服务器和客户端可以相互发送信息(Real-time traffic from the server to the client .

tcp/ip ,http,socket的关系

- - 行业应用 - ITeye博客
  物理层、数据链路层、网络层、传输层、会话层、表示层和应用层.   通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,.   三者从本质上来说没有可比性,.   socket则是对TCP/IP协议的封装和应用(程序员层面上).   也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,.

关于socket的一些初步研究

- iDesperadO - keakon的涂鸦馆
这些天在研究Tornado的源码,说实话它的代码过于艰深了,需要绕很多弯才能弄清. 我想其中的问题主要是我不太懂socket,于是就花了些时间学习socket,算是有了些收获,顺便记录在此. 实际上UNIX的设计者很喜欢用类似的方式来处理一类任务,其中数据传输就都被抽象成文件,包括磁盘文件、管道、FIFO和终端等.

socket连接和http连接的区别

- - 互联网 - ITeye博客
相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. HTTP协议:简单对象访问协议,对应于应用层  ,HTTP协议是基于TCP连接的. tcp协议:    对应于传输层. ip协议:     对应于网络层 . TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据.