TCP/IP協議中backlog參數

  TCP創建鏈接是要進行三次握手,可是否完成三次握手後,服務器就處理(accept)呢?php

  backlog實際上是一個鏈接隊列,在Linux內核2.2以前,backlog大小包括半鏈接狀態和全鏈接狀態兩種隊列大小。html

  半鏈接狀態爲:服務器處於Listen狀態時收到客戶端SYN報文時放入半鏈接隊列中,即SYN queue(服務器端口狀態爲:SYN_RCVD)。服務器

  全鏈接狀態爲:TCP的鏈接狀態從服務器(SYN+ACK)響應客戶端後,到客戶端的ACK報文到達服務器以前,則一直保留在半鏈接狀態中;當服務器接收到客戶端的ACK報文後,該條目將從半鏈接隊列搬到全鏈接隊列尾部,即 accept queue (服務器端口狀態爲:ESTABLISHED)。ssh

  在Linux內核2.2以後,分離爲兩個backlog來分別限制半鏈接(SYN_RCVD狀態)隊列大小和全鏈接(ESTABLISHED狀態)隊列大小。socket

  SYN queue 隊列長度由 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,默認爲2048。tcp

  Accept queue 隊列長度由 /proc/sys/net/core/somaxconn 和使用listen函數時傳入的參數,兩者取最小值。默認爲128。在Linux內核2.4.25以前,是寫死在代碼常量 SOMAXCONN ,在Linux內核2.4.25以後,在配置文件 /proc/sys/net/core/somaxconn 中直接修改,或者在 /etc/sysctl.conf 中配置 net.core.somaxconn = 128 。函數

 

 

  能夠經過ss命令來顯示spa

[root@localhost ~]# ss -l
State       Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port     
LISTEN      0      128                                                    *:http                                                    *:*       
LISTEN      0      128                                                   :::ssh                                                    :::*       
LISTEN      0      128                                                    *:ssh                                                     *:*       
LISTEN      0      100                                                  ::1:smtp                                                   :::*       
LISTEN      0      100                                            127.0.0.1:smtp                                                    *:*       

 

  在LISTEN狀態,其中 Send-Q 即爲Accept queue的最大值,Recv-Q 則表示Accept queue中等待被服務器accept()。.net

  另外客戶端connect()返回不表明TCP鏈接創建成功,有可能此時accept queue 已滿,系統會直接丟棄後續ACK請求;客戶端誤覺得鏈接已創建,開始調用等待至超時;服務器則等待ACK超時,會重傳SYN+ACK 給客戶端,重傳次數受限 net.ipv4.tcp_synack_retries ,默認爲5,表示重發5次,每次等待30~40秒,即半鏈接默認時間大約爲180秒,該參數能夠在tcp被洪水攻擊是臨時啓用這個參數。code

  查看SYN queue 溢出

[root@localhost ~]# netstat -s | grep LISTEN
102324 SYNs to LISTEN sockets dropped

  查看Accept queue 溢出

[root@localhost ~]# netstat -s | grep TCPBacklogDrop
TCPBacklogDrop: 2334

 

參考資料:

TCP SOCKET中backlog參數的用途是什麼?

TCP/IP協議中backlog分析與設置以及TCP狀態變化

TCP3次握手和backlog溢出 

TCP queue 的一些問題

TCP洪水攻擊(SYN Flood)的診斷和處理

相關文章
相關標籤/搜索