linux协议栈劫持,Linux系统优化之TCP协议栈优化-基本篇1
因?yàn)樵谧雠老x分布式系統(tǒng)的過程中,涉及到了一些linux系統(tǒng)優(yōu)化方面的知識(shí),所以來總結(jié)一下,我們會(huì)對(duì)linux的不同模塊做相關(guān)的基本優(yōu)化,這篇文章主要講述的是關(guān)于tcp協(xié)議棧的參數(shù)優(yōu)化。
1.機(jī)器環(huán)境
Linux EOS01 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
CentOS release 6.4 (Final)
2.具體實(shí)施
2.1 由于每臺(tái)機(jī)器的文件描述符都是處于默認(rèn)的1024的標(biāo)準(zhǔn)值,對(duì)于高并發(fā)的系統(tǒng)來說,很容易達(dá)到瓶頸,因此我們需要重定文件描述符數(shù)量,可以采用ansible對(duì)各個(gè)服務(wù)器批量設(shè)置。
vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
2.2 關(guān)于我們對(duì)于系統(tǒng)tcp協(xié)議棧的參數(shù)設(shè)置
vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_syncookies=1
#開啟重用。允許將TIME-WAIT sockets 重新用于新的TCP 連接
net.ipv4.tcp_tw_reuse=1
#啟用timewait 快速回收
net.ipv4.tcp_tw_recycle=1
net.ipv4.ip_local_port_range=1024 65000
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_timestamps = 0
#每300秒 探測(cè)一次tcp連接是否空閑,一共探測(cè)2次,每次間隔15秒
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 300
然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效
具體的參數(shù)含義可以參考如下:
1. fs.file-max
最大可以打開的文件描述符數(shù)量,注意是整個(gè)系統(tǒng)。
在服務(wù)器中,我們知道每創(chuàng)建一個(gè)連接,系統(tǒng)就會(huì)打開一個(gè)文件描述符,所以,文件描述符打開的最大數(shù)量也決定了我們的最大連接數(shù)
select在高并發(fā)情況下被取代的原因也是文件描述符打開的最大值,雖然它可以修改但一般不建議這么做,詳情可見unp select部分。
2.net.ipv4.tcp_max_syn_backlog
Tcp syn隊(duì)列的最大長度,在進(jìn)行系統(tǒng)調(diào)用connect時(shí)會(huì)發(fā)生Tcp的三次握手,server內(nèi)核會(huì)為Tcp維護(hù)兩個(gè)隊(duì)列,Syn隊(duì)列和Accept隊(duì)列,Syn隊(duì)列是指存放完成第一次握手的連接,Accept隊(duì)列是存放完成整個(gè)Tcp三次握手的連接,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的網(wǎng)絡(luò)連接。
注意此參數(shù)過大可能遭遇到Syn flood攻擊,即對(duì)方發(fā)送多個(gè)Syn報(bào)文端填充滿Syn隊(duì)列,使server無法繼續(xù)接受其他連接
我們看下 man 手冊(cè)上是如何說的:
The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for com‐ pletely established sockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog. When syncookies are enabled there is no logical maximum length and this setting is ignored. See tcp(7) for more information. If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently truncated to that value; the default value in this file is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128.
自 Linux 內(nèi)核 2.2 版本以后,backlog 為已完成連接隊(duì)列的最大值,未完成連接隊(duì)列大小以 /proc/sys/net/ipv4/tcp_max_syn_backlog 確定,但是已連接隊(duì)列大小受 SOMAXCONN 限制,為 min(backlog, SOMAXCONN)
3.net.ipv4.tcp_syncookies
修改此參數(shù)可以有效的防范上面所說的syn flood攻擊
原理:在Tcp服務(wù)器收到Tcp Syn包并返回Tcp Syn+ack包時(shí),不專門分配一個(gè)數(shù)據(jù)區(qū),而是根據(jù)這個(gè)Syn包計(jì)算出一個(gè)cookie值。在收到Tcp ack包時(shí),Tcp服務(wù)器在根據(jù)那個(gè)cookie值檢查這個(gè)Tcp ack包的合法性。如果合法,再分配專門的數(shù)據(jù)區(qū)進(jìn)行處理未來的TCP連接。
默認(rèn)為0,1表示開啟
4.net.ipv4.tcp_keepalive_time
Tcp keepalive心跳包機(jī)制,用于檢測(cè)連接是否已斷開,我們可以修改默認(rèn)時(shí)間來間斷心跳包發(fā)送的頻率。
keepalive一般是服務(wù)器對(duì)客戶端進(jìn)行發(fā)送查看客戶端是否在線,因?yàn)榉?wù)器為客戶端分配一定的資源,但是Tcp 的keepalive機(jī)制很有爭(zhēng)議,因?yàn)樗鼈兛珊馁M(fèi)一定的帶寬。
Tcp keepalive詳情見Tcp/ip詳解卷1 第23章
5.net.ipv4.tcp_tw_reuse
我的上一篇文章中寫到了time_wait狀態(tài),大量處于time_wait狀態(tài)是很浪費(fèi)資源的,它們占用server的描述符等。
修改此參數(shù),允許重用處于time_wait的socket。
默認(rèn)為0,1表示開啟
6.net.ipv4.tcp_tw_recycle
也是針對(duì)time_wait狀態(tài)的,該參數(shù)表示快速回收處于time_wait的socket。
默認(rèn)為0,1表示開啟
7.net.ipv4.tcp_fin_timeout
修改time_wait狀的存在時(shí)間,默認(rèn)的2MSL
注意:time_wait存在且生存時(shí)間為2MSL是有原因的,見我上一篇博客為什么會(huì)有time_wait狀態(tài)的存在,所以修改它有一定的風(fēng)險(xiǎn),還是根據(jù)具體的情況來分析。
8.net.ipv4.tcp_max_tw_buckets
所允許存在time_wait狀態(tài)的最大數(shù)值,超過則立刻被清楚并且警告。
9.net.ipv4.ip_local_port_range
表示對(duì)外連接的端口范圍。
10.somaxconn
前面說了Syn隊(duì)列的最大長度限制,somaxconn參數(shù)決定Accept隊(duì)列長度,在listen函數(shù)調(diào)用時(shí)backlog參數(shù)即決定Accept隊(duì)列的長度,該參數(shù)太小也會(huì)限制最大并發(fā)連接數(shù),因?yàn)橥粫r(shí)間完成3次握手的連接數(shù)量太小,server處理連接速度也就越慢。服務(wù)器端調(diào)用accept函數(shù)實(shí)際上就是從已連接Accept隊(duì)列中取走完成三次握手的連接。
Accept隊(duì)列和Syn隊(duì)列是listen函數(shù)完成創(chuàng)建維護(hù)的。
/proc/sys/net/core/somaxconn修改
3. 參考資料
總結(jié)
以上是生活随笔為你收集整理的linux协议栈劫持,Linux系统优化之TCP协议栈优化-基本篇1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12层的bert参数量_只需一个损失函数
- 下一篇: 大并发下程序出错_Python并发编程理