
連結:https://www.cnblogs.com/pgyLang/p/16360102.html
Linux核心中的TCP引數
/proc/sys/net/ipv4/
/proc/sys/net/ipv4/
存放著TCP
引數的檔案,目錄中的內容用來新增網路設定,在其中的許多設定,可以用來阻止對系統的攻擊,或用來設定系統的路由功能。
tcp_syn_retries
客戶端發起SYN
連線,如果超時會進行重傳,重傳的次數
接著我們使用
sysctl net.ipv4.tcp_syn_retries=2
把這個引數修改為2
測試一下
接著我們來驗證一下,我們去
ssh
一臺不存在的主機,因為ssh
也是基於tcp

透過
wireshark
抓包可以看到,果然重傳了2
個數據包
net.ipv4.tcp_window_scaling
啟用或關閉視窗擴大因子選項


net.ipv4.tcp_sack
啟用或關閉選擇確認(Selective Acknowledgement, SACK)
選項
名稱 | 預設值 | 建議值 | 描述 |
---|---|---|---|
tcpsyn_retries |
5 | 1 | 對於一個新建連線,核心要傳送多少個SYN 連線請求才決定放棄。不應該大於255 ,預設值是5 ,對應於180毫秒左右時間。(對於大負載而物理通訊良好的網路來說,這個值偏高,可以修改為2 。這個值僅僅是針對對外的連線,對進來的連線,是由tcp_retries1決定) |
tcp_synack_retries |
5 | 1 | 對於遠端的連線請求SYN,核心會發送SYN+ACK 資料包,以確認收到上一個SYN連線請求包。這是所謂的三次握手機制的第二個步驟。這裡決定核心再放棄之前所傳送出的SYN+ACK數目。不應該大於255 ,預設值是5 ,對應於180秒左右時間。 |
tcp_keepalive_time |
7200 | 600 | TCP傳送keepalive 探測訊息的間隔時間(秒),用於確認TCP連線是否有效。防止兩邊建立連線但不傳送資料的攻擊。 |
tcp_keepalive_probes |
9 | 3 | TCP傳送keepalive 探測訊息的間隔時間(秒),用於確認TCP連線是否有效。 |
tcp_keepalive_intvl |
74 | 15 | 探測訊息未獲得響應時,重發該訊息的間隔時間(秒)。預設值為75 秒。(對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類伺服器需要改小該值,15 是個比較合適的值) |
tcp_retries1 |
3 | 3 | 放棄回應一個TCP連線請求前﹐需要進行多少次重試。RFC 規定最低的數值是3 |
tcp_retries2 |
15 | 5 | 在丟棄啟用(已建立通訊狀況)的TCP連線之前﹐需要進行多少次重試。預設值為15 ,根據RTO 的值來決定,相當於13-30分鐘(RFC1122規定,必須大於100秒) (這個值根據目前的網路設定,可以適當地改小,我的網路內修改為了5 ) |
tcp_orphan_retries |
7 | 3 | 在近端丟棄TCP連線之前﹐要進行多少次重試。預設值是7 個﹐相當於 50秒 – 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web伺服器﹐那麼也許需要降低該值,這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans 。 |
tcp_fin_timeout |
60 | 2 | 對於本端斷開的socket連線,TCP保持在FIN-WAIT-2 狀態的時間。對方可能會斷開連線或一直不結束連線或不可預料的程序死亡。預設值為 60 秒 |
tcp_max_tw_buckets |
180000 | 36000 | 系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話,time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐不過﹐如果網路條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)。(事實上做NAT的時候最好可以適當地增加該值) |
tcp_tw_recycle |
0 | 1 | 開啟快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議開啟它) |
tcp_tw_reuse |
0 | 1 | 表示是否允許重新應用處於TIME-WAIT 狀態的socket用於新的TCP連線(這個對快速重啟動某些服務,而啟動後提示埠已經被使用的情形非常有幫助) |
tcp_max_orphans |
8192 | 32768 | 系統所能處理不屬於任何程序的TCP sockets 最大數量。假如超過這個數量,那麼不屬於任何程序的連線會被立即reset,並同時顯示警告資訊。之所以要設定這個限制,純粹為了抵禦那些簡單的 DoS 攻擊,千萬不要依賴這個或是人為的降低這個限制。如果記憶體大更應該增加這個值。(這個值Redhat AS版本中設定為32768,但是很多防火牆修改的時候,建議該值修改為2000) |
tcp_abort_on_overflow |
0 | 0 | 當守護程序太忙而不能接受新的連線,就象對方傳送reset 訊息,預設值是false 。這意味著當溢位的原因是因為一個偶然的猝發,那麼連線將恢復狀態。只有在你確信守護程序真的不能完成連線請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail ,apache 這類服務的時候,這個可以很快讓客戶端終止連線,可以給予服務程式處理已有連線的緩衝機會,所以很多防火牆上推薦開啟它) |
tcp_synookies |
0 | 1 | 只有在核心編譯時選擇了CONFIG_SYNCOOKIES 時才會發生作用。當出現syn等候隊列出現溢位時象對方傳送syncookies 。目的是為了防止syn flood 攻擊。 |
tcp_stdurg |
0 | 0 | 使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 開啟它,或會導致不能和它們正確溝通。 |
tcp_max_syn_backlog |
1024 | 16384 | 對於那些依然還未獲得客戶端確認的連線請求,需要儲存在佇列中最大數目。對於超過 128Mb 記憶體的系統,預設值是 1024 ,低於 128Mb 的則為 128。如果伺服器經常出現過載,可以嘗試增加這個數字。假如您將此值設為大於 1024,最好修改include/net/tcp.h 裡面的TCP_SYNQ_HSIZE ,以保持TCP_SYNQ_HSIZE*16 (SYN Flood 攻擊利用TCP協議散佈握手的缺陷,偽造虛假源IP地址傳送大量TCP-SYN 半開啟連線到目標系統,最終導致目標系統Socket佇列資源耗盡而無法接受新的連線。為了應付這種攻擊,現代Unix系統中普遍採用多連線佇列處理的方式來緩衝(而不是解決)這種攻擊,是用一個基本佇列處理正常的完全連線應用(Connect()和Accept() ),是用另一個佇列單獨存放半開啟連線。這種雙佇列處理方式和其他一些系統核心措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明) |
tcp_window_scaling |
1 | 1 | 該檔案表示設定tcp/ip會話的滑動視窗大小是否可變。引數值為布林值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的視窗最大可達到65535 位元組,對於高速網路,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,從而提高資料傳輸的能力(RFC 1323)。 |
tcp_timestamps |
1 | 1 | Timestamps 用在其它一些東西中,可以防範那些偽造的sequence 號碼。一條1G的寬頻線路或許會重遇到帶 out-of-line 數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 ‘舊封包’。(該檔案表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對RTT 的計算;為了實現更好的效能應該啟用這個選項。) |
tcp_sack |
1 | 1 | 使用 Selective ACK ,它可以用來查詢特定的遺失的資料報— 因此有助於快速恢復狀態。該檔案表示是否啟用有選擇的應答(Selective Acknowledgment),這可以透過有選擇地應答亂序接收到的報文來提高效能,這樣可以讓傳送者只發送丟失的報文段。對於廣域網通訊來說這個選項應該啟用,但是這會增加對 CPU 的佔用。 |
tcp_fack |
1 | 1 | 開啟FACK 擁塞避免和快速重傳功能。注意,當tcp_sack 設定為0的時候,這個值即使設定為1也無效,這個是TCP連線靠譜的核心功能 |
tcp_dsack |
1 | 1 | 允許TCP傳送”兩個完全相同”的SACK 。 |
tcp_ecn |
0 | 0 | TCP的直接擁塞通告功能。 |
tcp_reordering |
3 | 6 | TCP流中重排序的資料報最大數量。一般有看到推薦把這個數值略微調整大一些 |
tcp_retans_collapse |
1 | 0 | 對於某些有bug的印表機提供針對其bug的相容性。一般不需要這個支援,可以關閉它 |
tcp_wmem:mindefaultmax |
4096 16384 131072 | 8192 131072 16777216 | 傳送快取設定。 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) 。對於伺服器而言,增加這個引數的值對於傳送資料很有幫助 |
tcprmem:mindefaultmax |
4096 87380 174760 | 32768 131072 16777216 | 接收快取設定。同tcp_wmem |
tcp_mem:mindefaultmax |
根據記憶體計算 | 786432 1048576 1572864 | low :當TCP使用了低於該值的記憶體頁面數時,TCP不會考慮釋放記憶體。即低於此值沒有記憶體壓力。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 – 這第 2 個值表明,最大頁面大小乘以最大併發請求數除以頁大小 (131072 300 / 4096)。) pressure :當TCP使用了超過該值的記憶體頁面數量時,TCP試圖穩定其記憶體使用,進入pressure模式,當記憶體消耗低於low值時則退出pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩衝區大小的最大值 (204800 300 / 4096)。) high :允許所有tcp sockets用於排隊緩衝資料報的頁面量。(如果超過這個值,TCP 連線將被拒絕,這就是為什麼不要令其過於保守 (512000 *300 / 4096) 的原因了。在這種情況下,提供的價值很大,它能處理很多連線,是所預期的 2.5 倍;或者使現有連線能夠傳輸 2.5 倍的資料。 |
tcp_app_win |
31 | 31 | 保留max(window/2^tcp_app_win, mss) 數量的視窗由於應用緩衝。當為0時表示不需要緩衝。 |
tcp_adv_win_scale |
2 | 2 | 計算緩衝開銷。 |
tcp_low_latency |
0 | 0 | 允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項一般情形是的停用。 |
tcp_westwood |
0 | 0 | 啟用傳送者端的擁塞控制演算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行最佳化;對於 WAN 通訊來說應該啟用這個選項。 |
tcp_bic |
0 | 0 | 為快速長距離網路啟用 Binary Increase Congestion ;這樣可以更好地利用以 GB 速度進行操作的連結;對於 WAN 通訊應該啟用這個選項。 |
ip_forward |
0 | 1 | NAT 必須開啟IP轉發支援,把該值寫1 |
ip_local_port_range:minmax |
32768 61000 | 1024 65000 | 表示用於向外連線的埠範圍,預設比較小,這個範圍同樣會間接用於NAT表規模。 |
ip_conntrack_max |
65535 | 65535 | 系統支援的最大ipv4 連線數,預設65536 (事實上這也是理論最大值),同時這個值和你的記憶體大小有關,1G 以上記憶體這個值都是預設65536 |
/proc/sys/net/core/
/proc/sys/net/core/
目錄中包括許多設定用來控制Linux核心與網路層的互動,即當網路有什麼動作時,核心做出什麼樣的相應反應。
名稱 | 預設值 | 建議值 | 描述 |
---|---|---|---|
netdev_max_backlog |
1024 | 16384 | 每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許送到佇列的資料包的最大數目,對重負載伺服器而言,該值需要調高一點。 |
somaxconn |
128 | 16384 | 用來限制監聽佇列最大資料包的數量,超過這個數量就會導致連結超時或者觸發重傳機制。web應用中listen函式的backlog預設會給我們核心引數的net.core.somaxconn 限制到128 ,而nginx定義的NGX_LISTEN_BACKLOG 預設為511 ,所以有必要調整這個值。對繁忙的伺服器,增加該值有助於網路效能 |
wmem_default |
129024 | 129024 | 預設的傳送視窗大小(位元組) |
rmem_default |
129024 | 129024 | 預設的接收視窗大小(位元組) |
rmem_max |
129024 | 873200 | 最大的TCP資料接收緩衝(位元組) |
wmem_max |
129024 | 873200 | 最大的TCP資料傳送緩衝(位元組) |
/proc/sys/net/netfilter/
是對netfilter
的引數配置,具體可以參照Linux核心文件
修改核心引數的方法
-
使用
echo value
方式直接追加到檔案中。如echo "1" > /proc/sys/net/ipv4/tcp_syn_retries
,但是這種方式裝置重啟後,會恢復成預設值。 -
把引數新增到
/etc/sysctl.conf
中,然後執行sysctl -p
使引數生效。這種方式是永久有效的。 -
使用
systcl
命令進行修改,例如修改SYN重傳次數sysctl net.ipv4.tcp_syn_retries=n
檢視Linux系統的統計資訊

下面的
eth0
換成需要檢視的網絡卡
sys/class/net/eth0/statistics/rx_packets 收到的資料包數量
sys/class/net/eth0/statistics/tx_packets 傳輸的資料包數量
sys/class/net/eth0/statistics/rx_bytes 接收的位元組數
sys/class/net/eth0/statistics/tx_bytes 傳輸的位元組數
sys/class/net/eth0/statistics/rx_dropped 收包時丟棄的資料包
sys/class/net/eth0/statistics/tx_dropped 發包時丟棄的資料包
複製程式碼
Linux網絡卡的引數可以在
/sys/class/net/
進入對應網絡卡目錄去檢視,比如網絡卡的MAC地址
,速率(speed)
,MTU
等等

官方站點:www.linuxprobe.com
Linux命令大全:www.linuxcool.com

劉遄老師QQ:5604215
Linux技術交流群:2636170
(新群,火熱加群中……)
想要學習Linux系統的讀者可以點選"閱讀原文"按鈕來了解書籍《Linux就該這麼學》,同時也非常適合專業的運維人員閱讀,成為輔助您工作的高價值工具書!