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 查看網絡的統計信息