企業(yè)logo圖片上海seo外包
TCP 三次握手的性能提升
三次握手的過程在一個(gè) HTTP 請求的平均時(shí)間占比 10% 以上,所以要正確使用三次握手的中參數(shù),需要先用netstat命令查看是哪個(gè)握手階段出了問題,主動發(fā)起連接的客戶端優(yōu)化相對簡單些,而服務(wù)端需要監(jiān)聽端口,屬于被動連接方,其間保持許多的中間狀態(tài),優(yōu)化方法相對復(fù)雜一些。
客戶端優(yōu)化
調(diào)整SYN報(bào)文重傳次數(shù)
三次握手建立連接的首要目的是「同步序列號」。只有同步序列號才有可靠傳輸,SYN 的全稱就叫?Synchronize Sequence Numbers(同步序列號)。
客戶端作為主動發(fā)起連接方,首先發(fā)送SYN包,于是客戶端連接會處于SYN_SENT狀態(tài),客戶端沒有收到服務(wù)端傳過來的ACK+SYN就會重傳SYN,重發(fā)的次數(shù)由 tcp_syn_retries 參數(shù)控制,默認(rèn)是 5 次;每次超時(shí)時(shí)間是上一次的2倍。可以根據(jù)網(wǎng)絡(luò)的穩(wěn)定性和目標(biāo)服務(wù)器的繁忙程度修改 SYN 的重傳次數(shù),調(diào)整客戶端的三次握手時(shí)間上限。
服務(wù)端優(yōu)化
調(diào)整SYN 半連接隊(duì)列長度
要想增大半連接隊(duì)列,不能只單純增大 tcp_max_syn_backlog 的值,還需一同增大 somaxconn 和 backlog,也就是增大 accept 隊(duì)列。否則,只單純增大 tcp_max_syn_backlog 是無效的。
如果 SYN 半連接隊(duì)列已滿,只能丟棄連接嗎?
開啟 syncookies 功能就可以在不使用 SYN 半連接隊(duì)列的情況下成功建立連接。
調(diào)整 SYN+ACK 報(bào)文重傳次數(shù)
客戶端收到服務(wù)端的ACK+SYN后恢復(fù)ACK給服務(wù)器,同時(shí)客戶端連接狀態(tài)由SYN-SENT變?yōu)镋STABLELISHED,表示連接建立成功,服務(wù)端需要接收到客戶端的ACK才會變成ESTABLELISHED,如果沒收到客戶端的ACK就會重傳ACK+SYN同時(shí)一直處于 SYN_RCV 狀態(tài)。
當(dāng)網(wǎng)絡(luò)繁忙、不穩(wěn)定時(shí),報(bào)文丟失就會變嚴(yán)重,此時(shí)應(yīng)該調(diào)大重發(fā)次數(shù)。反之則可以調(diào)小重發(fā)次數(shù)。修改重發(fā)次數(shù)的方法是,調(diào)整 tcp_synack_retries 參數(shù)。
調(diào)整accept隊(duì)列長度
服務(wù)器收到ACK后建立連接成功,此時(shí)內(nèi)核會把連接從半連接隊(duì)列中移除,然后創(chuàng)建新的完全連接,并將其添加到accept隊(duì)列,等待進(jìn)程調(diào)用accept函數(shù)時(shí)把連接取出來。
如果進(jìn)程不能及時(shí)地調(diào)用 accept 函數(shù),就會造成 accept 隊(duì)列(也稱全連接隊(duì)列)溢出,最終導(dǎo)致建立好的 TCP 連接被丟棄。
如何查看accept連接隊(duì)列已滿
netstat -s 可以隔幾秒鐘執(zhí)行下,如果這個(gè)數(shù)字一直在增加的話,說明 accept 連接隊(duì)列偶爾滿了。
如何繞過三次握手
TCP Fast Open 功能需要客戶端和服務(wù)端同時(shí)支持,才有效果,使得 HTTP 請求減少了 1 個(gè) RTT 的時(shí)間
TCP三次握手優(yōu)化總結(jié)
TCP 四次揮手的性能提升
主動方優(yōu)化,關(guān)閉連接的方式通常有兩種,分別是 RST 報(bào)文關(guān)閉和 FIN 報(bào)文關(guān)閉。
close函數(shù)和shutdown函數(shù)有什么區(qū)別?
調(diào)用了 close 函數(shù)意味著完全斷開連接,完全斷開不僅指無法傳輸數(shù)據(jù),而且也不能發(fā)送數(shù)據(jù)。 此時(shí),調(diào)用了 close 函數(shù)的一方的連接叫做「孤兒連接」,如果你用 netstat -p 命令,會發(fā)現(xiàn)連接對應(yīng)的進(jìn)程名為空。
使用 close 函數(shù)關(guān)閉連接是不優(yōu)雅的。于是,就出現(xiàn)了一種優(yōu)雅關(guān)閉連接的?shutdown
?函數(shù),它可以控制只關(guān)閉一個(gè)方向的連接:
主動方的優(yōu)化
調(diào)整FIN報(bào)文重傳次數(shù)
第一次揮手 ,調(diào)整tcp_orphan_retries參數(shù),降低
調(diào)整FIN WAIT2狀態(tài)的時(shí)間
主動方收到ACK后進(jìn)入FIN—WAIT2狀態(tài),表示主動方的發(fā)送通道已經(jīng)關(guān)閉,接下來將等待對方發(fā)送FIN報(bào)文,關(guān)閉對方的發(fā)送通道。
如果此時(shí)連接使用shutdown函數(shù)關(guān)閉的,連接可以一直處于FIN—WAIT2狀態(tài),因?yàn)檫€可以繼續(xù)發(fā)送或接收數(shù)據(jù)。但是對于close函數(shù)關(guān)閉的孤兒連接,由于無法再發(fā)送和接收數(shù)據(jù),所以這個(gè)狀態(tài)不可持續(xù)太久,,而 tcp_fin_timeout 控制了這個(gè)狀態(tài)下連接的持續(xù)時(shí)長,默認(rèn)值是 60 秒:
調(diào)整孤兒連接的上限個(gè)數(shù)
當(dāng)進(jìn)程調(diào)用了close函數(shù)關(guān)閉連接,此時(shí)連接就會是孤兒連接,因?yàn)闊o法再發(fā)送和接收數(shù)據(jù),有個(gè)tcp_max_orphans孤兒連接數(shù)量參數(shù),大于他就不再走tcp四次揮手直接RST復(fù)位報(bào)文關(guān)閉。
Time wait的作用
①:防止歷史連接的數(shù)據(jù),被后面相同四元組的連接錯(cuò)誤接收:2MSL這個(gè)時(shí)間足以讓兩個(gè)方向上的歷史數(shù)據(jù)包都被丟棄,使得原來連接的數(shù)據(jù)包在網(wǎng)路中都自然消失,再出現(xiàn)數(shù)據(jù)一定都是新建立連接所產(chǎn)生的。
②:保證被動關(guān)閉連接的一方,能被正確關(guān)閉?:等待足夠長的時(shí)間使得ACK能讓被動關(guān)閉方接收,從而幫助其正確關(guān)閉。
調(diào)整time wait 狀態(tài)的上限個(gè)數(shù)
?tcp_max_tw_buckets 參數(shù),當(dāng) TIME_WAIT 的連接數(shù)量超過該參數(shù)時(shí),新關(guān)閉的連接就不再經(jīng)歷 TIME_WAIT 而直接關(guān)閉,并發(fā)增多,可以適當(dāng)增大這個(gè)數(shù)量,也不是越大越好,資源有限。
復(fù)用time_wait狀態(tài)的連接
tcp_tw_reuse 和 tcp_timestamps 設(shè)置為1,只作用在 connect 函數(shù),也就是客戶端,將TIME_WAIT狀態(tài)的端口復(fù)用作為客戶端的新連接,只適用于客戶端。
被動方的優(yōu)化
close_wait狀態(tài)的數(shù)量
被動方收到FIN就開始進(jìn)入close_wait狀態(tài),等待進(jìn)程調(diào)用close函數(shù)關(guān)閉連接。因此,出現(xiàn)大量CLOSE_WAIT狀態(tài)的連接。
減少FIN報(bào)文重傳次數(shù)
TCP 數(shù)據(jù)傳輸?shù)男阅芴嵘?/h1>
擴(kuò)大窗口大小
TCP提供一種可以讓發(fā)送方數(shù)據(jù)根據(jù)接收方的實(shí)際接收能力控制發(fā)送的數(shù)據(jù)量-滑動窗口
內(nèi)核接收到報(bào)文,必須使用緩沖區(qū)存放他們,這樣剩余緩沖區(qū)空間變小,接收窗口也變小;
進(jìn)程調(diào)用read函數(shù),報(bào)文被讀入內(nèi)存空間,內(nèi)核緩存被清空,主機(jī)可以接收更多的報(bào)文,窗口大。
接收方把報(bào)文大小放到TCP報(bào)文頭部的窗口字段中
默認(rèn)的滑動窗口最大值只有 64 KB,不滿足當(dāng)今的高速網(wǎng)絡(luò)的要求,要想提升發(fā)送速度必須提升滑動窗口的上限,在 Linux 下是通過設(shè)置?tcp_window_scaling
?為 1 做到的,此時(shí)最大值可高達(dá) 1GB。
調(diào)整發(fā)送緩沖區(qū)范圍
發(fā)送緩沖區(qū)是自行調(diào)節(jié)的,當(dāng)發(fā)送方發(fā)送的數(shù)據(jù)被確認(rèn)后,并且沒有新的數(shù)據(jù)要發(fā)送,就會把發(fā)送緩沖區(qū)的內(nèi)存釋放掉。
調(diào)整接收緩沖區(qū)范圍
接收緩沖區(qū)可以根據(jù)系統(tǒng)空閑內(nèi)存的大小來調(diào)節(jié)接收窗口:
發(fā)送緩沖區(qū)的調(diào)節(jié)功能是自動開啟的,而接收緩沖區(qū)則需要配置 tcp_moderate_rcvbuf 為 1 來開啟調(diào)節(jié)功能
接收緩沖區(qū)動態(tài)調(diào)節(jié)
,我們應(yīng)該把緩沖區(qū)的上限設(shè)置為帶寬時(shí)延積。發(fā)送緩沖區(qū)的調(diào)節(jié)功能是自動打開的,而接收緩沖區(qū)需要把 tcp_moderate_rcvbuf 設(shè)置為 1 來開啟。其中,調(diào)節(jié)的依據(jù)是 TCP 內(nèi)存范圍 tcp_mem。
調(diào)整內(nèi)存范圍
通過 tcp_mem 配置完成一般情況下這些值是在系統(tǒng)啟動時(shí)根據(jù)系統(tǒng)內(nèi)存數(shù)量計(jì)算得到的