TCP网络参数优化

TCP连接的状态

TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体状态如下所示:

  • CLOSED:初始状态,表示没有任何连接。
  • LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求。
  • SYN_SENT:发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包。
  • SYN_RECEIVED:收到一个连接请求后回送确认信息和对等的连接请求,然后等待确认信息。通常是建立TCP连接的三次握手过程中的一个中间状态,表示Server端的Socket接收到来自Client的SYN包,并作出回应。
  • ESTABLISHED:表示连接已经建立,可以进行数据传输。
  • FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包。若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态,等待对方返回ACK包,此后还能读取数据,但不能发送数据。在正常情况下,无论对方处于何种状态,都应该马上返回ACK包,所以FIN_WAIT_1状态一般很难见到。
  • FIN_WAIT_2:主动关闭连接的一方收到对方返回的ACK包后,等待对方发送FIN包。处于FIN_WAIT_1状态下的Socket收到了对方返回的ACK包后,便进入FIN_WAIT_2状态。由于FIN_WAIT_2状态下的Socket需要等待对方发送的FIN包,所有常常可以看到。若在FIN_WAIT_1状态下收到对方发送的同时带有FIN和ACK的包时,则直接进入TIME_WAIT状态,无须经过FIN_WAIT_2状态。
  • TIME_WAIT:主动关闭连接的一方收到对方发送的FIN包后返回ACK包(表示对方也不再有数据需要发送,此后不能再读取或发送数据),然后等待足够长的时间(2MSL)以确保对方接收到ACK包(考虑到丢失ACK包的可能和迷路重复数据包的影响),最后回到CLOSED状态,释放网络资源。
  • CLOSE_WAIT:表示被动关闭连接的一方在等待关闭连接。当收到对方发送的FIN包后(表示对方不再有数据需要发送),相应的返回ACK包,然后进入CLOSE_WAIT状态。在该状态下,若己方还有数据未发送,则可以继续向对方进行发送,但不能再读取数据,直到数据发送完毕。
  • LAST_ACK:被动关闭连接的一方在CLOSE_WAIT状态下完成数据的发送后便可向对方发送FIN包(表示己方不再有数据需要发送),然后等待对方返回ACK包。收到ACK包后便回到CLOSED状态,释放网络资源。
  • CLOSING:比较罕见的例外状态。正常情况下,发送FIN包后应该先收到(或同时收到)对方的ACK包,再收到对方的FIN包,而CLOSING状态表示发送FIN包后并没有收到对方的ACK包,却已收到了对方的FIN包。有两种情况可能导致这种状态:其一,如果双方几乎在同时关闭连接,那么就可能出现双方同时发送FIN包的情况;其二,如果ACK包丢失而对方的FIN包很快发出,也会出现FIN先于ACK到达。

TCP参数调优

以下参数设置结合ab命令来压测机器优化网络,譬如ab -c 30 -n 100000 ***.***.***.***:8080/

用netstat -n查看tcp状态,看端口是否够用等。

netstat -n
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state) 
tcp4 0 0 10.100.0.80.57137 42.156.140.172.443 CLOSE_WAIT 
tcp4 0 0 10.100.0.80.57136 123.58.182.251.80 ESTABLISHED
tcp4 0 0 10.100.0.80.57130 42.156.235.98.443 ESTABLISHED

 

  • echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range 设置向外连接可用端口范围 表示可以使用的端口为65535-1024个(0~1024为受保护的)
  • echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 设置time_wait连接重用 默认0
  • echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle 设置快速回收time_wait连接 默认0
  • echo 180000 > /proc/sys/net/ipv4/tcp_max_tw_buckets 设置最大time_wait连接长度 默认262144
  • echo 1 > /proc/sys/net/ipv4/tcp_timestamps 设置是否启用比超时重发更精确的方法来启用对RTT的计算 默认0
  • echo 1 > /proc/sys/net/ipv4/tcp_window_scaling 设置TCP/IP会话的滑动窗口大小是否可变 默认1
  • echo 20000 > /proc/sys/net/ipv4/tcp_max_syn_backlog 设置最大处于等待客户端没有应答的连接数 默认2048
  • echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout 设置FIN-WAIT状态等待回收时间 默认60
  • echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem 设置最大TCP数据发送缓冲大小,分别为最小、默认和最大值 默认4096 87380 4194304
  • echo "4096 65536 16777216" > /proc/sys/net/ipv4/tcp_wmem 设置最大TCP数据 接受缓冲大小,分别为最小、默认和最大值  默认4096 87380 4194304  
  • echo 10000 > /proc/sys/net/core/somaxconn 设置每一个处于监听状态的端口的监听队列的长度 默认128
  • echo 10000 > /proc/sys/net/core/netdev_max_backlog 设置最大等待cpu处理的包的数目 默认1000
  • echo 16777216 > /proc/sys/net/core/rmem_max 设置最大的系统套接字数据接受缓冲大小 默认124928
  • echo 262144 > /proc/sys/net/core/rmem_default 设置默认的系统套接字数据接受缓冲大小 默认124928
  • echo 16777216 > /proc/sys/net/core/wmem_max 设置最大的系统套接字数据发送缓冲大小 默认124928
  • echo 262144 > /proc/sys/net/core/wmem_default 设置默认的系统套接字数据发送缓冲大小 默认124928
  • echo 2000000 > /proc/sys/fs/file-max 设置最大打开文件数 默认385583

以上设置都是临时性的,系统重启后都会失效。
查看当前TCP统计信息的工具命令:
cat /proc/net/stat 查看tcp的统计信息
cat /proc/net/snmp 查看当前系统的连接情况
netstat -s 查看网络的统计信息

 

posted @ 2016-09-29 13:44  wade&luffy  阅读(733)  评论(0编辑  收藏  举报