您好,登錄后才能下訂單哦!
前言
作為一個(gè)后端程序員,網(wǎng)絡(luò)連接這塊是一個(gè)繞不過(guò)的砍,當(dāng)你在做服務(wù)器優(yōu)化的時(shí)候,網(wǎng)絡(luò)優(yōu)化也是其中一環(huán),那么作為網(wǎng)絡(luò)連接中最基礎(chǔ)的部分-TCP連接你了解嗎?今天我們來(lái)仔細(xì)看看這個(gè)部分。
TCP建立連接-三次握手
詳解
其中步驟2~4就是三次握手,那么為什么需要三次握手呢?為什么不是一次或者兩次握手呢?
首先,我們需要知道,只有當(dāng)服務(wù)器和客戶(hù)端都能確保自己能夠發(fā)消息和接收消息,這次網(wǎng)絡(luò)通信才算成功的。
步驟2的作用是讓服務(wù)器知道了自己是可以接收消息的。
步驟3的作用是讓客戶(hù)端知道自己發(fā)送消息和接收消息的功能是OK的,發(fā)送消息的能力是通過(guò)服務(wù)器返回的ack=x+1確認(rèn)的,因?yàn)檫@個(gè)值基于當(dāng)初客戶(hù)端發(fā)送的消息seq=x。接收消息的能力是因?yàn)槭盏搅朔?wù)器的返回。
步驟4的作用是讓服務(wù)器端知道自己發(fā)送消息的能力是OK的(和步驟3類(lèi)似)。
linux查看
linux服務(wù)器可以利用netstat -anp | grep tcp
命令,查看服務(wù)器上各個(gè)端口和應(yīng)用的連接狀態(tài)。
你還可以通過(guò)修改linux的配置文件/etc/sysctl.conf,調(diào)整各個(gè)狀態(tài)的數(shù)量
SYN_SENT狀態(tài)相關(guān)
主動(dòng)建立連接時(shí),發(fā)SYN(步驟2)的重試次數(shù)
nct.ipv4.tcp_syn_rctries = 6
建立連接時(shí)的本地端口可用范圍
net.ipv4.ip_local_port_range = 32768 60999
SYN_RCVD狀態(tài)相關(guān)
SYN_RCVD狀態(tài)連接的最大個(gè)數(shù)
net.ipv4.tcp_max_syn_backlog
被動(dòng)建立連接時(shí),發(fā)SYN/ACK(步驟3)重試次數(shù)
net.ipv4.tcp_synack_retries
說(shuō)完了TCP建立連接,接下來(lái),我們?cè)賮?lái)看看TCP正常斷開(kāi)連接的過(guò)程
TCP斷開(kāi)連接-四次揮手
詳解
其中,步驟2、3、5、6即為4次揮手。
TIME_WAIT狀態(tài)及其優(yōu)化
看完之后,大家想必會(huì)有一個(gè)疑問(wèn),為什么TIME_WAIT狀態(tài)需要保持2MSL?因?yàn)檫@可以保證至少一次報(bào)文的往返時(shí)間內(nèi),端口是不可復(fù)用的。
假設(shè)TIME_WAIT狀態(tài)的持續(xù)時(shí)間很短,我們來(lái)模擬下面這種場(chǎng)景:
因此這也是TIME_WAIT狀態(tài)需要保持2MSL的原因,如果這么長(zhǎng)時(shí)間也沒(méi)有收到報(bào)文,即使有正確的報(bào)文從客戶(hù)端發(fā)出,也已經(jīng)過(guò)期了,因此不會(huì)影響到之后的通信。
但這同樣也會(huì)帶來(lái)一個(gè)問(wèn)題,TIME_WAIT狀態(tài)保持的時(shí)間較長(zhǎng),假設(shè)服務(wù)器端有大量TIME_WAIT狀態(tài)的TCP連接,就相當(dāng)于白白浪費(fèi)掉大量的服務(wù)器資源(端口)。此時(shí),我們可以通過(guò)修改以下配置進(jìn)行服務(wù)器調(diào)優(yōu):
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
其他狀態(tài)的優(yōu)化
CLOSE_WAIT狀態(tài)
如果服務(wù)器端有大量CLOSE_WAIT狀態(tài)的連接,很有可能是應(yīng)用進(jìn)程出現(xiàn)bug,沒(méi)有及時(shí)關(guān)閉連接。
FIN_WAIT1狀態(tài)
調(diào)整發(fā)送FIN報(bào)文的重試次數(shù),0相當(dāng)于8
net.ipv4.tcp_orphan_retries = 0
FIN_WAIT2狀態(tài)
調(diào)整保持在FIN_WAIT2狀態(tài)的時(shí)間
net.ipv4.tcp_fin_timeout = 60
總結(jié)
看到這里,想必你應(yīng)該對(duì)TCP連接有了一個(gè)大致的了解。現(xiàn)在服務(wù)器大多都用了nginx做了負(fù)載均衡,因此,我們可能需要在此基礎(chǔ)上了解一些nginx相關(guān)的配置原理,這樣應(yīng)該會(huì)對(duì)我們的服務(wù)器性能調(diào)優(yōu)會(huì)有更大的幫助。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。
免責(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)容。