1.?TCP保活機制
參考?《Nginx(三) 配置文件詳解 - 基礎模塊》3.18章節
- net.ipv4.tcp_keepalive_intvl:設置兩次相鄰探活檢測的間隔時間。默認是75秒,單位是秒。
- net.ipv4.tcp_keepalive_probes:設置探活最多檢測次數。默認是9次,單位是次。
- net.ipv4.tcp_keepalive_time:設置TCP連接保活時長。默認是7200秒,單位是秒。
2. TCP Fast Open Cookie?
net.ipv4.tcp_fastopen:可選值是0、1、2、3,默認是1。設置為0時表示關閉Fast Open Cookie功能,設置為1時表示僅作為客戶端時使用Fast Open Cookie功能,設置為2時表示僅作為服務端時使用Fast Open Cookie功能,設置為3時表示無論作為客戶端還是服務端時都使用Fast Open Cookie功能。請注意,Fast?Open Cookie需要客戶端和服務端同時開啟才有效,開啟后可以用TCP報文首部的Fast?Open Cookie選項字段來聲明是否使用FOC。FOC生效后,使用HTTP協議通信時,可以減少因三次握手而帶來的1個RTT時間消耗(因為三次握手建立連接后,HTTP 請求必須在一個RTT后才能發送)。如果服務器僅作為服務端時,建議設置為2,如果是代理服務器,建議設置為3。
net.ipv4.tcp_fastopen_blackhole_timeout_sec = 3600
net.ipv4.tcp_fastopen_key = 00000000-00000000-00000000-00000000
3. 設置重傳次數最大值
- net.ipv4.tcp_orphan_retries:FIN報文重傳次數最大值,默認值是0,特指8次。如果FIN報文重傳次數達到該值且規定等待時間已結束,連接將直接關閉。如果是孤兒連接,重傳次數雖未超過8次,但該連接自首次發出FIN報文開始,存活時間已超tcp_fin_timeout設定的時間,那么此時該連接也將會直接關閉。
- net.ipv4.tcp_retries1:報文超時重傳次數達到該值且規定等待時間已結束,指示IP層進行MTU探測、刷新路由等。默認是3次。
- net.ipv4.tcp_retries2:報文超時重傳次數達到該值且規定等待時間已結束,連接將會直接關閉。默認是15次。
- net.ipv4.tcp_syn_retries:SYN報文重傳次數最大值,默認是6次。如果SYN報文重傳次數達到該值且規定等待時間已結束,連接將直接關閉。
- net.ipv4.tcp_synack_retries:SYN+ACK報文重傳次數最大值,默認是2次。如果SYN+ACK報文重傳次數達到該值且規定等待時間已結束,連接將直接關閉。
4. 孤兒連接
? ? ? ? 當進程調用 close() 函數關閉連接后,相關句柄已經釋放,無論該連接是處于?FIN_WAIT1 狀態,還是確實關閉了,此連接已經與進程無關,由內核和另一端完成四次揮手交互,此時這個連接叫做孤兒連接。
? ? ? ? 使用 close() 函數關閉連接是完全斷開連接,同時關閉讀和寫,無法繼續傳輸數據,是不優雅的,而 shutdown() 函數是優雅關閉連接,可以控制是關閉讀還是寫。
- net.ipv4.tcp_max_orphans:指定系統內核最多能接管多少個孤兒連接。默認是16384個。如果孤兒連接數量超過該值,新增的孤兒連接將不再通過四次揮手來關閉連接,而是直接發送 RST 報文進行強制關閉,并發出警告信息。
- net.ipv4.tcp_fin_timeout:指定孤兒連接在內核中的最大生存時間,單位是秒,默認是60秒,對應兩個MSL,該參數也是設置服務器主動關閉TCP連接時在TIME_WAIT狀態的2MSL等待時間。如果在60秒內還未關閉,連接將直接關閉。
- net.ipv4.tcp_orphan_retries:請參考第3章節。
5. 防御SYN Flood攻擊
參考?TCP三次握手、四次揮手及狀態轉換詳解
- net.core.somaxconn:增大TCP全連接隊列/accept隊列大小,也是增大TCP半連接隊列的關鍵參數。默認值是128。
- net.core.tcp_max_syn_backlog :增大TCP半連接隊列/SYN隊列大小。默認值是1024。
- net.ipv4.tcp_syncookies:設置是否開啟syncookies。開啟syncookies后,不使用半連接隊列就可建立TCP連接。默認值是1,表示僅當 SYN 半連接隊列溢出時,才啟用它。設置為0時表示關閉,設置為2時表示無條件開啟。
- net.core.netdev_max_backlog:設置每個網卡接收隊列的最大長度,防止網卡接收過載。默認值是1000個。內核從網卡收到數據包后,在交由協議棧(如IP、TCP)處理前會先將數據包放入一個緩沖隊列中,當接數據包的速率大于內核協議棧處理的速率時,這個緩沖隊列會不斷增長,但不能超過netdev_max_backlog 參數設置的值,否則數據包將被丟棄。默認情況下,netdev_max_backlog 參數的值是與系統的內存大小和 CPU 數量相關的動態值。它會根據系統的硬件配置進行自適應調整,通常情況下不需要手動設置。除非這臺服務器需要處理大量的網絡請求,我們才將該值調大。
- net.ipv4.tcp_synack_retries:降低SYN+ACK報文重傳次數。默認是2次。請參考第3章節。
6. accept隊列已滿策略
- net.ipv4.tcp_abort_on_overflow:該參數用于設置當accept隊列已滿時,是否要將后續請求建立的TCP連接置為RST,即返回RST報文。可選值是0或1,默認值是0,表示關閉。當accept隊列已滿時,如果該參數設置為0,服務端會丟棄掉客戶端返回的ack報文。如果設置為1,服務端將發送RST報文給客戶端,要求重置連接并重新建立連接。謹慎開啟該配置!?
7. 窗口放大
- net.ipv4.tcp_window_scaling:設置是否開啟窗口放大功能。可選值是0或1,默認是1,表示開啟窗口放大功能。
8. 優化TIME-WAIT
- net.ipv4.tcp_tw_reuse:設置是否復用處于 TIME_WAIT 狀態的TCP連接,可選值是0或1,默認是0,表示禁止復用連接。請注意,該配置僅適用于主動發起建立TCP連接的一方,也就是僅適用于客戶端。開啟該選項后,主動發起建立連接的一方在調用 connect() 函數時,如果選擇到的端口,已經被相同四元組的連接占用,那么就判斷該連接是否處于TIME_WAIT狀態,如果該連接處于 TIME_WAIT 狀態并且 TIME_WAIT 狀態持續時間已超過1秒,那么就重用這個連接,然后就可以正常使用該端口了。所以該選項只適用于主動發起建立連接的一方。如果服務器僅作為服務端,就完全沒必要開啟該功能。如果服務器是一臺代理服務器,建議開啟該功能。
- net.ipv4.tcp_timestamps:設置是否開啟TCP時間戳功能,可選值是0或1,默認是1,表示開啟時間戳功能。開啟后,TCP 頭部就會使用時間戳選項,便于精確計算RTT,而且還能避免出現因序列號回繞(PAWS)而引起的延遲報文生效的問題。該參數是開啟tcp_tw_reuse功能的前提,在開啟tcp_tw_reuse功能前,必須將tcp_timestamps設置為1。
- net.ipv4.tcp_max_tw_buckets:設置處于TIME_WAIT狀態的TCP連接的最大值,默認值是5000。當系統中處于 TIME_WAIT 狀態的TCP連接數超過該值時,新關閉的連接就不再經歷 TIME_WAIT狀態,而是直接關閉,這個方法比較暴力。
- net.ipv4.tcp_fin_timeout:該參數用于設置2MSL時間,請參考第4章節。
9. 快速重傳
參考?《TCP 核心工作機制》
- net.ipv4.tcp_sack:設置是否開啟選擇性確認SACK,可選值是0或1,默認是1,表示開啟SACK。
- net.ipv4.tcp_dsack:設置是否開啟D-SACK(選擇性確認時標識重復收到的數據),可選值是0或1,默認是1,表示開啟D-SACK。
- net.ipv4.tcp_comp_sack_delay_ns:設置在壓縮SACK報文期間,SACK報文的延遲發送時間。單位是ns(納秒),默認值是1000000ns,也就是1ms。
- net.ipv4.tcp_comp_sack_nr:設置壓縮SACK報文的最大數量。默認值是44。
10. 擁塞控制
- ?net.ipv4.tcp_congestion_control = cubic
- net.ipv4.tcp_allowed_congestion_control = reno cubic
- net.ipv4.tcp_available_congestion_control = reno cubic
11. 設置緩沖區
- tcp_wmem:設置發送緩沖區大小/范圍,默認值是“4096?? ?16384?? ?4194304”,3個參數單位都是字節Byte。
- tcp_rmem:設置接收緩沖區大小/范圍,默認值是“4096?? ?87380?? ?6291456”,3個參數單位都是字節Byte。
- tcp_mem:設置TCP緩沖區大小/范圍,默認值是“42147?? ?56197?? ?84294”,3個參數值單位都是頁面,一個頁面是4kb,
- tcp_moderate_rcvbuf:設置是否開啟接收緩沖區動態調整功能,可選值是0或1,默認是1,表示開啟。
- net.ipv4.tcp_adv_win_scale = 1