用户工具

站点工具


about_tcp

TCP相关参数说明

作者:陈科

联系方式:chenke@dumpcache.com

转载请说明出处:http://www.dumpcache.com/wiki/doku.php?id=about_tcp

java socket相关的参数

TCP_NODELAY

如果开启开选项,说白了就是把多个小包组合成一个大包发送,在某些场景下可以减少tcp包头发送量,减少网络流量。

SO_REUSEADDR

可以使多个Socket对象绑定在同一个端口上。

SO_LINGER

这个Socket选项可以影响close方法的行为。在默认情况下,当调用close方法后,将立即返回;如果这时仍然有未被送出的数据包,那么这些数

据包将被丢弃。如果将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。在这n秒内,系统将尽

量将未送出的数据包发送出去;如果超过了n秒,如果还有未发送的数据包,这些数据包将全部被丢弃;而close方法会立即返回。如果将linger设

为0,和关闭SO_LINGER选项的作用是一样的。

如果底层的Socket实现不支持SO_LINGER都会抛出SocketException例外。当给linger参数传递负数值时,setSoLinger还会抛出一个

IllegalArgumentException例外。可以通过getSoLinger方法得到延迟关闭的时间,如果返回-1,则表明SO_LINGER是关闭的。例如,下面的代

码将延迟关闭的时间设为1分钟:

if(socket.getSoLinger() == -1) socket.setSoLinger(true, 60);

SO_TIMEOUT

连接的读写超时时间

SO_KEEPALIVE

如果将这个Socket选项打开,客户端Socket每隔段的时间(大约两个小时)就会利用空闲的连接向服务器发送一个数据包。这个数据包并没有其它

的作用,只是为了检测一下服务器是否仍处于活动状态。如果服务器未响应这个数据包,在大约11分钟后,客户端Socket再发送一个数据包,如果

在12分钟内,服务器还没响应,那么客户端Socket将关闭。如果将Socket选项关闭,客户端Socket在服务器无效的情况下可能会长时间不会关

闭。

SO_OOBINLINE

如果这个Socket选项打开,可以通过Socket类的sendUrgentData方法向服务器发送一个单字节的数据。这个单字节数据并不经过输出缓冲区,而

是立即发出。虽然在客户端并不是使用OutputStream向服务器发送数据,但在服务端程序中这个单字节的数据是和其它的普通数据混在一起的。因

此,在服务端程序中并不知道由客户端发过来的数据是由OutputStream还是由sendUrgentData发过来的。

SO_RCVBUF

在默认情况下,输入流的接收缓冲区是8096个字节(8K)。这个值是Java所建议的输入缓冲区的大小。如果这个默认值不能满足要求,可以用

setReceiveBufferSize方法来重新设置缓冲区的大小。但最好不要将输入缓冲区设得太小,否则会导致传输数据过于频繁,从而降低网络传输的

效率。

如果底层的Socket实现不支持SO_RCVBUF选项,这两个方法将会抛出SocketException例外。必须将size设为正整数,否则

setReceiveBufferSize方法将抛出IllegalArgumentException例外。

SO_SNDBUF

在默认情况下,输出流的发送缓冲区是8096个字节(8K)。这个值是Java所建议的输出缓冲区的大小。如果这个默认值不能满足要求,可以用

setSendBufferSize方法来重新设置缓冲区的大小。但最好不要将输出缓冲区设得太小,否则会导致传输数据过于频繁,从而降低网络传输的效

率。

如果底层的Socket实现不支持SO_SENDBUF选项,这两个方法将会抛出SocketException例外。必须将size设为正整数,否则

setSendBufferedSize方法将抛出IllegalArgumentException例外。

tcp连接的sync超时时间设置

socket.connect(new InetSocketAddress(host, port), timeout);

这里的timeout如果不设置默认为0,将会永久等待下去。

linux tcp相关队列

这里的参数都可以通过/etc/sysctl.conf文件或者sysctl -a命令来查看:

监听队列长度:

sysctl -w net.core.somaxconn=4096

可以通过:

ss -lt

来查看指定端口的监听队列长度。

sysctl -w net.core.netdev_max_backlog=16384 ##backlog队列的长度
sysctl -w net.ipv4.tcp_max_syn_backlog=8192 ##sync队列的长度
sysctl -w net.ipv4.tcp_syncookies=1 ##当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
sysctl -w net.ipv4.ip_local_port_range="1024 65535" ##表示向外连接的端口范围
sysctl -w net.ipv4.tcp_tw_recycle=1 ##快速回收,复用time_wait状态的连接
sysctl -w net.ipv4.tcp_congestion_control=cubic ##TCP拥塞控制算法

tcp buffer size:

 sysctl -w net.core.rmem_max=16777216
 sysctl -w net.core.wmem_max=16777216
 sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
 sysctl -w net.ipv4.tcp_wmem="4096 16384 16777216"

linux tcp相关超时时间

sysctl -w net.ipv4.tcp_keepalive_time=7200 ##keepalive心跳包,默认2小时发送一次
sysctl -w net.ipv4.tcp_fin_timeout=60 ##在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。参数值为整数,单位为秒,缺省为180秒。

linux 连接的状态

下面为man netstat对各状态的解释:

       ESTABLISHED
              The socket has an established connection.
 
       SYN_SENT
              The socket is actively attempting to establish a connection.
 
       SYN_RECV
              A connection request has been received from the network.
 
       FIN_WAIT1
              The socket is closed, and the connection is shutting down.
 
       FIN_WAIT2
              Connection is closed, and the socket is waiting for a shutdown from the remote end.
 
       TIME_WAIT
              The socket is waiting after close to handle packets still in the network.
 
       CLOSED The socket is not being used.
 
       CLOSE_WAIT
              The remote end has shut down, waiting for the socket to close.
 
       LAST_ACK
              The remote end has shut down, and the socket is closed. Waiting for acknowledgement.
 
       LISTEN The socket is listening for incoming connections.  Such sockets are not included in the output
              unless you specify the --listening (-l) or --all (-a) option.
 
       CLOSING
              Both sockets are shut down but we still don’t have all our data sent.
about_tcp.txt · 最后更改: 2018/10/14 15:31 (外部编辑)