linux下如何配置TCP參數設定詳解

來源:互聯網
上載者:User


設定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預設值是9TCP發送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_backlogtcp_synack_retriestcp_abort_on_overflowsyncookie嚴重的違背TCP協議,不允許使用TCP擴充,可能對某些服務導致嚴重的效能影響(如SMTP轉寄)。(注意,該實現與BSD上面使用的tcp proxy一樣,是違反了RFC中關於tcp串連的三向交握實現的,但是對於防禦syn-flood的確很有用.) tcp_stdurg :BOOLEAN預設值為0使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 開啟它﹐或會導致不能和它們正確溝通。
 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預設值為1Timestamps 用在其它一些東西中﹐可以防範那些偽造的 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預設值是3TCP流中重排序的資料報最大數量 。 (一般有看到推薦把這個數值略微調整大一些,比如5) tcp_retrans_collapse :BOOLEAN預設值為1對於某些有bug的印表機提供針對其bug的相容性。(一般不需要這個支援,可以關閉它) tcp_wmem(3個INTEGER變數): min, default, maxmin:為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, maxmin:為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, highlow:當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 通訊應該啟用這個選項。   作者 neou

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.