[Linux][2013-1-6] tcp 連結中 各 引數 設定
阿新 • • 發佈:2019-01-04
設定tcp引數一定要小心謹慎,輕易不要更改線上環境,我貼一下我們線上環境中,sysctl.conf的內容,見文章底部
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syncookies = 1 www.2cto.com tcp_syn_retries :INTEGER 預設值是5 對於一個新建連線,核心要傳送多少個 SYN 連線請求才決定放棄。不應該大於255,預設值是5,對應於180秒左右時間。(對於大負載而物理通訊良好的網路而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連線,對進來的連線,是由tcp_retries1 決定的) tcp_synack_retries :INTEGER 預設值是5 對於遠端的連線請求SYN,核心會發送SYN + ACK資料報,以確認收到上一個 SYN連線請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這裡決定核心在放棄連線之前所送出的 SYN+ACK 數目。不應該大於255,預設值是5,對應於180秒左右時間。(可以根據上面的tcp_syn_retries來決定這個值) tcp_keepalive_time :INTEGER 預設值是7200(2小時) 當keepalive開啟的情況下,TCP傳送keepalive訊息的頻率。(由於目前網路攻擊等因素,造成了利用這個進行的攻擊很頻繁,曾經也有cu的朋友提到過,說如果2邊建立了連線,然後不傳送任何資料或者rst/fin訊息,那麼持續的時間是不是就是2小時,空連線攻擊?tcp_keepalive_time就是預防此情形的.我個人在做nat服務的時候的修改值為1800秒) tcp_keepalive_probes:INTEGER 預設值是9 TCP傳送keepalive探測以確定該連線已經斷開的次數。(注意:保持連線僅在SO_KEEPALIVE套接字選項被開啟是才傳送.次數預設不需要修改,當然根據情形也可以適當地縮短此值.設定為5比較合適) tcp_keepalive_intvl:INTEGER 預設值為75 www.2cto.com 探測訊息傳送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連線殺除的時間。預設值為75秒,也就是沒有活動的連線將在大約11分鐘以後將被丟棄。(對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類伺服器需要改小該值,15是個比較合適的值) tcp_retries1 :INTEGER 預設值是3 放棄迴應一個TCP連線請求前﹐需要進行多少次重試。RFC 規定最低的數值是3﹐這也是預設值﹐根據RTO的值大約在3秒 - 8分鐘之間。(注意:這個值同時還決定進入的syn連線) tcp_retries2 :INTEGER 預設值為15 在丟棄啟用(已建立通訊狀況)的TCP連線之前﹐需要進行多少次重試。預設值為15,根據RTO的值來決定,相當於13-30分鐘(RFC1122規定,必須大於100秒).(這個值根據目前的網路設定,可以適當地改小,我的網路內修改為了5) tcp_orphan_retries :INTEGER 預設值是7 在近端丟棄TCP連線之前﹐要進行多少次重試。預設值是7個﹐相當於 50秒 - 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web伺服器﹐那麼也許需要降低該值﹐這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans 。(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網路環境中降低該值為3) tcp_fin_timeout :INTEGER 預設值是 60 對於本端斷開的socket連線,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連線或一直不結束連線或不可預料的程序死亡。預設值為 60 秒。 過去在2.2版本的核心中是 180 秒。您可以設定該值﹐但需要注意﹐如果您的機器為負載很重的web伺服器﹐您可能要冒記憶體被大量無效資料報填滿的風險﹐FIN-WAIT-2 sockets 的危險性低於 FIN-WAIT-1 ﹐因為它們最多隻吃 1.5K 的記憶體﹐但是它們存在時間更長。另外參考 tcp_max_orphans。(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網路環境中降低該值為30) tcp_max_tw_buckets :INTEGER 預設值是180000 www.2cto.com 系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要人為的降低這個限制﹐不過﹐如果網路條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)。(事實上做NAT的時候最好可以適當地增加該值) tcp_tw_recycle :BOOLEAN 預設值是0 開啟快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議開啟它)tcp_tw_reuse:BOOLEAN 預設值是0 該檔案表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連線(這個對快速重啟動某些服務,而啟動後提示埠已經被使用的情形非常有幫助) tcp_max_orphans :INTEGER 預設值是8192 系統所能處理不屬於任何程序的TCP sockets最大數量。假如超過這個數量﹐那麼不屬於任何程序的連線會被立即reset,並同時顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制(這個值Redhat AS版本中設定為32768,但是很多防火牆修改的時候,建議該值修改為2000) tcp_abort_on_overflow :BOOLEAN 預設值是0 當守護程序太忙而不能接受新的連線,就象對方傳送reset訊息,預設值是false。這意味著當溢位的原因是因為一個偶然的猝發,那麼連線將恢復狀態。只有在你確信守護程序真的不能完成連線請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓客戶端終止連線,可以給予服務程式處理已有連線的緩衝機會,所以很多防火牆上推薦開啟它) tcp_syncookies :BOOLEAN 預設值是0 www.2cto.com 只有在核心編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢位時象對方傳送syncookies。目的是為了防止syn flood攻擊。
注意:該選項千萬不能用於那些沒有收到攻擊的高負載伺服器,如果在日誌中出現synflood訊息,但是調查發現沒有收到synflood攻擊,而是合法使用者的連線負載過高的原因,你應該調整其它引數來提高伺服器效能。參考: tcp_max_syn_backlog tcp_synack_retries tcp_abort_on_overflow syncookie嚴重的違背TCP協議,不允許使用TCP擴充套件,可能對某些服務導致嚴重的效能影響(如SMTP轉發)。(注意,該實現與BSD上面使用的tcp proxy一樣,是違反了RFC中關於tcp連線的三次握手實現的,但是對於防禦syn-flood的確很有用.) tcp_stdurg :BOOLEAN 預設值為0 使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在
tcp_max_syn_backlog :INTEGER 對於那些依然還未獲得客戶端確認的連線請求﹐需要儲存在佇列中最大數目。對於超過 128Mb 記憶體的系統﹐預設值是1024 ﹐低於 128Mb 的則為 128。如果伺服器經常出現過載﹐可以嘗試增加這個數字。警告﹗假如您將此值設為大於1024﹐最好修改 include/net/tcp.h 裡面的 TCP_SYNQ_HSIZE ﹐以保持TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐並且編進核心之內。(SYN Flood攻擊利用TCP協議散佈握手的缺陷,偽造虛假源IP地址傳送大量TCP-SYN半開啟連線到目標系統,最終導致目標系統Socket佇列資源耗 盡而無法接受新的連線。為了應付這種攻擊,現代Unix系統中普遍採用多連線佇列處理的方式來緩衝(而不是解決)這種攻擊,是用一個基本佇列處理正常的完 全連線應用(Connect()和Accept() ),是用另一個佇列單獨存放半開啟連線。這種雙佇列處理方式和其他一些系統核心措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有 效的緩解小規模的SYN Flood攻擊(事實證明<1000p/s)加大SYN佇列長度可以容納更多等待連線的網路連線數,所以對Server來說可以考慮增大該值.) www.2cto.com tcp_window_scaling :INTEGER 預設值為1 該檔案表示設定tcp/ip會話的滑動視窗大小是否可變。引數值為布林值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的視窗最大可達到 65535 位元組,對於高速網路,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,從而提高資料傳輸的能力(RFC 1323)。(對普通地百M網路而言,關閉會降低開銷,所以如果不是高速網路,可以考慮設定為0) tcp_timestamps :BOOLEAN 預設值為1 Timestamps 用在其它一些東西中﹐可以防範那些偽造的 sequence 號碼。一條1G的寬頻線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 '舊封包'。(該檔案表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的效能應該啟用這個選項。) tcp_sack :BOOLEAN 預設值為1 使用 Selective ACK﹐它可以用來查詢特定的遺失的資料報--- 因此有助於快速恢復狀態。該檔案表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高效能(這樣可以讓傳送者只發送丟失的報文段)。(對於廣域網通訊來說這個選項應該啟用,但是這會增加對 CPU 的佔用。) tcp_fack :BOOLEAN 預設值為1 開啟FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設定為0的時候,這個值即使設定為1也無效) tcp_dsack :BOOLEAN 預設值為1 允許TCP傳送"兩個完全相同"的SACK。 www.2cto.com tcp_ecn :BOOLEAN 預設值為0 開啟TCP的直接擁塞通告功能。 tcp_reordering :INTEGER 預設值是3 TCP流中重排序的資料報最大數量 。 (一般有看到推薦把這個數值略微調整大一些,比如5) tcp_retrans_collapse :BOOLEAN 預設值為1 對於某些有bug的印表機提供針對其bug的相容性。(一般不需要這個支援,可以關閉它) tcp_wmem(3個INTEGER變數): min, default, max min:為TCP socket預留用於傳送緩衝的記憶體最小值。每個tcp socket都可以在建議以後都可以使用它。預設值為4096(4K)。 default:為TCP socket預留用於傳送緩衝的記憶體數量,預設情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低於net.core.wmem_default的值。預設值為16384(16K)。 max: 用於TCP socket傳送緩衝的記憶體最大值。該值不會影響net.core.wmem_max,"靜態"選擇引數SO_SNDBUF則不受該值影響。預設值為131072(128K)。(對於伺服器而言,增加這個引數的值對於傳送資料很有幫助,在我的網路環境中,修改為了51200 131072 204800) tcp_rmem (3個INTEGER變數): min, default, max min:為TCP socket預留用於接收緩衝的記憶體數量,即使在記憶體出現緊張情況下tcp socket都至少會有這麼多數量的記憶體用於接收緩衝,預設值為8K。 default:為TCP socket預留用於接收緩衝的記憶體數量,預設情況下該值影響其它協議使用的net.core.wmem_default 值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0預設值情況下,TCP視窗大小為65535。預設值為87380 max:用於TCP socket接收緩衝的記憶體最大值。該值不會影響 net.core.wmem_max,"靜態"選擇引數 SO_SNDBUF則不受該值影響。預設值為 128K。預設值為87380*2 bytes。(可以看出,.max的設定最好是default的兩倍,對於NAT來說主要該增加它,我的網路裡為 51200 131072 204800) tcp_mem(3個INTEGER變數):low, pressure, high low:當TCP使用了低於該值的記憶體頁面數時,TCP不會考慮釋放記憶體。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 - 這第 2 個值表明,最大頁面大小乘以最大併發請求數除以頁大小 (131072 * 300 / 4096)。 ) www.2cto.com pressure:當TCP使用了超過該值的記憶體頁面數量時,TCP試圖穩定其記憶體使用,進入pressure模式,當記憶體消耗低於low值時則退出pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩衝區大小的最大值 (204800 * 300 / 4096)。 ) high:允許所有tcp sockets用於排隊緩衝資料報的頁面量。(如果超過這個值,TCP 連線將被拒絕,這就是為什麼不要令其過於保守 (512000 * 300 / 4096) 的原因了。 在這種情況下,提供的價值很大,它能處理很多連線,是所預期的 2.5 倍;或者使現有連線能夠傳輸 2.5 倍的資料。 我的網路裡為192000 300000 732000) 一般情況下這些值是在系統啟動時根據系統記憶體數量計算得到的。 tcp_app_win : INTEGER 預設值是31 保留max(window/2^tcp_app_win, mss)數量的視窗由於應用緩衝。當為0時表示不需要緩衝。 tcp_adv_win_scale : INTEGER 預設值為2 計算緩衝開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。 tcp_rfc1337 :BOOLEAN 預設值為0 這個開關可以啟動對於在RFC1337中描述的"tcp 的time-wait暗殺危機"問題的修復。啟用後,核心將丟棄那些發往time-wait狀態TCP套接字的RST 包. tcp_low_latency : BOOLEAN 預設值為0 允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項一般情形是的禁用。(但在構建Beowulf 叢集的時候,開啟它很有幫助) www.2cto.com tcp_westwood :BOOLEAN 預設值為0 啟用傳送者端的擁塞控制演算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行優化;對於 WAN 通訊來說應該啟用這個選項。 tcp_bic :BOOLEAN 預設值為0 為快速長距離網路啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的連結;對於 WAN 通訊應該啟用這個選項。