溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么對(duì)TCP的性能進(jìn)行優(yōu)化

發(fā)布時(shí)間:2020-11-27 15:20:46 來(lái)源:億速云 閱讀:267 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么對(duì)TCP的性能進(jìn)行優(yōu)化,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

三次握手階段

怎么對(duì)TCP的性能進(jìn)行優(yōu)化

客戶端SYN包的重試次數(shù)

sysctl -w net.ipv4.tcp_syn_retries=6

相關(guān)介紹

第 1 次重試發(fā)生在 1 秒鐘后,接著會(huì)以翻倍的方式在第 2、4、8、16、32 秒共做 6 次重試,最后一次重試會(huì)等待 64 秒,如果仍然沒(méi)有返回 ACK,才會(huì)終止三次握手。所以,總耗時(shí)是 1+2+4+8+16+32+64=127 秒,超過(guò) 2 分鐘。

服務(wù)端半連接池大小

sysctl -w net.ipv4.tcp_max_syn_backlog=16384

怎么對(duì)TCP的性能進(jìn)行優(yōu)化

服務(wù)端半連接池滿了以后是否開(kāi)啟syncookie機(jī)制

sysctl -w net.ipv4.tcp_syncookies=1

相關(guān)介紹

如果 SYN 半連接隊(duì)列已滿,默認(rèn)會(huì)丟棄連接并不是這樣,開(kāi)啟 syncookies 功能就可以在不使用 SYN 隊(duì)列的情況下成功建立連接。

syncookies 是這么做的:服務(wù)器根據(jù)當(dāng)前狀態(tài)計(jì)算出一個(gè)值,放在己方發(fā)出的 SYN+ACK 報(bào)文中發(fā)出,當(dāng)客戶端返回 ACK 報(bào)文時(shí),取出該值驗(yàn)證,如果合法,就認(rèn)為連接建立成功,如下圖所示。

怎么對(duì)TCP的性能進(jìn)行優(yōu)化

  • 0 表示關(guān)閉該功能;

  • 2 表示無(wú)條件開(kāi)啟功能;

  • 1 則表示僅當(dāng) SYN 半連接隊(duì)列放不下時(shí),再啟用它。

注意:由于 syncookie 僅用于應(yīng)對(duì) SYN 泛洪攻擊(攻擊者惡意構(gòu)造大量的 SYN 報(bào)文發(fā)送給服務(wù)器,造成 SYN 半連接隊(duì)列溢出,導(dǎo)致正??蛻舳说倪B接無(wú)法建立),這種方式建立的連接,許多 TCP 特性都無(wú)法使用。所以,應(yīng)當(dāng)把 tcp_syncookies 設(shè)置為 1,僅在隊(duì)列滿時(shí)再啟用。

服務(wù)端SYN+ACK包的重試次數(shù)

net.ipv4.tcp_synack_retries=5

相關(guān)介紹

tcp_synack_retries 的默認(rèn)重試次數(shù)是 5 次,與客戶端重發(fā) SYN 類(lèi)似,它的重試會(huì)經(jīng)歷 1、2、4、8、16 秒,最后一次重試后等待 32 秒,若仍然沒(méi)有收到 ACK,才會(huì)關(guān)閉連接,故共需要等待 63 秒。

服務(wù)端全連接隊(duì)列的大小

取決于min(backlog, /proc/sys/net/core/somaxconn),在linux內(nèi)核2.2版本以后,listen 函數(shù)的 backlog 參數(shù)就可以設(shè)置 accept 隊(duì)列的大小。

另外backlog 參數(shù)還受限于 Linux 系統(tǒng)級(jí)的隊(duì)列長(zhǎng)度上限,當(dāng)然這個(gè)上限閾值也可以通過(guò) somaxconn 參數(shù)修改,somaxconn是內(nèi)核的參數(shù),默認(rèn)是128。

sysctl -w net.core.somaxconn=32768

四次揮手階段

接下來(lái)我們把先關(guān)閉連接的一方叫做主動(dòng)方,后關(guān)閉連接的一方叫做被動(dòng)方。

四次揮手的流程:

其實(shí)四次揮手只涉及兩種報(bào)文:FIN 和 ACK。FIN 就是 Finish 結(jié)束連接的意思,誰(shuí)發(fā)出 FIN 報(bào)文,就表示它將不再發(fā)送任何數(shù)據(jù),關(guān)閉這一方向的傳輸通道。ACK 是 Acknowledge 確認(rèn)的意思,它用來(lái)通知對(duì)方:你方的發(fā)送通道已經(jīng)關(guān)閉。當(dāng)主動(dòng)方關(guān)閉連接時(shí),會(huì)發(fā)送 FIN 報(bào)文,此時(shí)主動(dòng)方的連接狀態(tài)由 ESTABLISHED 變?yōu)?FIN_WAIT1。當(dāng)被動(dòng)方收到 FIN 報(bào)文后,內(nèi)核自動(dòng)回復(fù) ACK 報(bào)文,連接狀態(tài)由 ESTABLISHED 變?yōu)?CLOSE_WAIT,顧名思義,它在等待進(jìn)程調(diào)用 close 函數(shù)關(guān)閉連接。當(dāng)主動(dòng)方接收到這個(gè) ACK 報(bào)文后,連接狀態(tài)由 FIN_WAIT1 變?yōu)?FIN_WAIT2,主動(dòng)方的發(fā)送通道就關(guān)閉了。再來(lái)看被動(dòng)方的發(fā)送通道是如何關(guān)閉的。當(dāng)被動(dòng)方進(jìn)入 CLOSE_WAIT 狀態(tài)時(shí),進(jìn)程的 read 函數(shù)會(huì)返回 0,這樣開(kāi)發(fā)人員就會(huì)有針對(duì)性地調(diào)用 close 函數(shù),進(jìn)而觸發(fā)內(nèi)核發(fā)送 FIN 報(bào)文,此時(shí)被動(dòng)方連接的狀態(tài)變?yōu)?LAST_ACK。當(dāng)主動(dòng)方收到這個(gè) FIN 報(bào)文時(shí),內(nèi)核會(huì)自動(dòng)回復(fù) ACK,同時(shí)連接的狀態(tài)由 FIN_WAIT2 變?yōu)?TIME_WAIT,Linux 系統(tǒng)下大約 1 分鐘后 TIME_WAIT 狀態(tài)的連接才會(huì)徹底關(guān)閉。而被動(dòng)方收到 ACK 報(bào)文后,連接就會(huì)關(guān)閉。

怎么對(duì)TCP的性能進(jìn)行優(yōu)化

主動(dòng)方的優(yōu)化

等待ACK,F(xiàn)IN包的重發(fā)次數(shù)

主動(dòng)方發(fā)送 FIN 報(bào)文后,連接就處于 FIN_WAIT1 狀態(tài)下,該狀態(tài)通常應(yīng)在數(shù)十毫秒內(nèi)轉(zhuǎn)為 FIN_WAIT2。只有遲遲收不到對(duì)方返回的 ACK 時(shí),才能用 netstat 命令觀察到 FIN_WAIT1 狀態(tài)。此時(shí),內(nèi)核會(huì)定時(shí)重發(fā) FIN 報(bào)文,其中重發(fā)次數(shù)由 tcp_orphan_retries 參數(shù)控制(注意,orphan 雖然是孤兒的意思,該參數(shù)卻不只對(duì)孤兒連接有效,事實(shí)上,它對(duì)所有 FIN_WAIT1 狀態(tài)下的連接都有效),默認(rèn)值是 0,特指 8 次:

net.ipv4.tcp_orphan_retries = 0

孤兒連接的數(shù)量

net.ipv4.tcp_max_orphans = 16384

相關(guān)介紹

tcp_max_orphans 定義了孤兒連接的最大數(shù)量。當(dāng)進(jìn)程調(diào)用 close 函數(shù)關(guān)閉連接后,該連接是在 FIN_WAIT1 狀態(tài),這個(gè)連接都與該進(jìn)程無(wú)關(guān)了,它變成了孤兒連接。Linux 系統(tǒng)為防止孤兒連接過(guò)多,導(dǎo)致系統(tǒng)資源長(zhǎng)期被占用,就提供了 tcp_max_orphans 參數(shù)。如果孤兒連接數(shù)量大于它,新增的孤兒連接將不再走四次揮手,而是直接發(fā)送 RST 復(fù)位報(bào)文強(qiáng)制關(guān)閉。

孤兒連接的定義:由進(jìn)程調(diào)用close關(guān)閉的連接稱(chēng)為孤兒連接,另外shutdown 函數(shù)也可以關(guān)閉連接,這二者都會(huì)向?qū)Ψ桨l(fā)送 FIN 報(bào)文(shutdown 參數(shù)須傳入 SHUT_WR 或者 SHUT_RDWR 才會(huì)發(fā)送 FIN),區(qū)別在于 close 調(diào)用后,哪怕對(duì)方在半關(guān)閉狀態(tài)下發(fā)送的數(shù)據(jù)到達(dá)主動(dòng)方,進(jìn)程也無(wú)法接收。如果你用 netstat -p 命令,會(huì)發(fā)現(xiàn)連接對(duì)應(yīng)的進(jìn)程名為空(與進(jìn)程無(wú)關(guān)!)。而 shutdown 函數(shù)調(diào)用后,即使連接進(jìn)入了 FIN_WAIT1 或者 FIN_WAIT2 狀態(tài),它也不是孤兒連接,進(jìn)程仍然可以繼續(xù)接收數(shù)據(jù)。

等待FIN的時(shí)間

net.ipv4.tcp_fin_timeout = 60

相關(guān)介紹

當(dāng)連接收到 ACK 進(jìn)入 FIN_WAIT2 狀態(tài)后,就表示主動(dòng)方的發(fā)送通道已經(jīng)關(guān)閉,接下來(lái)將等待對(duì)方發(fā)送 FIN 報(bào)文,關(guān)閉對(duì)方的發(fā)送通道。這時(shí),如果連接是用 shutdown 函數(shù)關(guān)閉的,連接可以一直處于 FIN_WAIT2 狀態(tài)。但對(duì)于 close 函數(shù)關(guān)閉的孤兒連接,這個(gè)狀態(tài)不可以持續(xù)太久,而 tcp_fin_timeout 控制了這個(gè)狀態(tài)下連接的持續(xù)時(shí)長(zhǎng)。

TIME_WAIT相關(guān)參數(shù)

相關(guān)介紹

TIME_WAIT 是主動(dòng)方四次揮手的最后一個(gè)狀態(tài)。當(dāng)收到被動(dòng)方發(fā)來(lái)的 FIN 報(bào)文時(shí),主動(dòng)方回復(fù) ACK,表示確認(rèn)對(duì)方的發(fā)送通道已經(jīng)關(guān)閉,連接隨之進(jìn)入 TIME_WAIT 狀態(tài),等待 60 秒后關(guān)閉。

TIME_WAIT狀態(tài)最大連接數(shù)

當(dāng) TIME_WAIT 的連接數(shù)量超過(guò)該參數(shù)時(shí),新關(guān)閉的連接就不再經(jīng)歷 TIME_WAIT 而直接關(guān)閉。

net.ipv4.tcp_max_tw_buckets = 5000

是否復(fù)用TIME_WAIT狀態(tài)的端口

復(fù)用 TIME_WAIT 狀態(tài)的端口,如果服務(wù)器會(huì)主動(dòng)向上游服務(wù)器發(fā)起連接的話,就可以把 tcp_tw_reuse 參數(shù)設(shè)置為 1,它允許作為客戶端的新連接,在安全條件下使用 TIME_WAIT 狀態(tài)下的端口。

net.ipv4.tcp_tw_reuse = 1

當(dāng)然,要想使 tcp_tw_reuse 生效,還得把 timestamps 參數(shù)設(shè)置為 1,它滿足安全復(fù)用的先決條件(對(duì)方也要打開(kāi) tcp_timestamps ):

net.ipv4.tcp_timestamps = 1

老版本的 Linux 還提供了 tcp_tw_recycle 參數(shù),它并不要求 TIME_WAIT 狀態(tài)存在 60 秒,很容易導(dǎo)致數(shù)據(jù)錯(cuò)亂,不建議設(shè)置為 1。

net.ipv4.tcp_tw_recycle = 0

所以在 Linux 4.12 版本后,直接取消了這一參數(shù)。

其他配置

允許系統(tǒng)打開(kāi)的端口范圍

sysctl -w net.ipv4.ip_local_port_range=1024 65000

系統(tǒng)全局允許分配的最大文件句柄數(shù)

sysctl -w fs.file-max=2097152

sysctl -w fs.nr_open=2097152

echo 2097152 > /proc/sys/fs/nr_open

允許當(dāng)前會(huì)話或進(jìn)程打開(kāi)文件句柄數(shù)

ulimit -n 1048576

關(guān)于怎么對(duì)TCP的性能進(jìn)行優(yōu)化就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI