深入解析常見(jiàn)?TCP?三次握手異常
今天跟大家說(shuō)說(shuō) TCP 三次握手期間存在的異?,F(xiàn)象,了解這個(gè)有助于我們?cè)诠ぷ髦信挪橐呻y雜癥。在后端接口性能指標(biāo)中一類(lèi)重要的指標(biāo)就是接口耗時(shí)。具體包括平均響應(yīng)時(shí)間 TP90、TP99 耗時(shí)值等。這些值越低越好,一般來(lái)說(shuō)是幾毫秒,或者是幾十毫秒。如果響應(yīng)時(shí)間一旦過(guò)長(zhǎng),比如超過(guò)了 1 秒,在用戶(hù)側(cè)就能感覺(jué)到非常明顯的卡頓。如果長(zhǎng)此以往,用戶(hù)可能就直接用腳投票,卸載我們的 App 了。在正常情況下一次 TCP 連接耗時(shí)也就大約是一次 RTT 多一點(diǎn)。但事情不一定總是這么美好,總會(huì)有意外發(fā)生。在某些情況下,可能會(huì)導(dǎo)致連接耗時(shí)上漲、CPU 處理開(kāi)銷(xiāo)增加、甚至是超時(shí)失敗。今天飛哥就來(lái)說(shuō)一下我在線上遇到過(guò)的那些 TCP 握手相關(guān)的各種異常情況。
一、客戶(hù)端 connect 異常
端口號(hào)和 CPU 消耗這二者聽(tīng)起來(lái)感覺(jué)沒(méi)啥太大聯(lián)系。但我卻遭遇過(guò)因?yàn)槎丝谔?hào)不足導(dǎo)致 CPU 消耗大幅上漲的情況。來(lái)聽(tīng)飛哥分析分析為啥會(huì)出現(xiàn)這種問(wèn)題!客戶(hù)端在發(fā)起 connect 系統(tǒng)調(diào)用的時(shí)候,主要工作就是端口選擇。在選擇的過(guò)程中,有個(gè)大循環(huán),從 ip_local_port_range 的一個(gè)隨機(jī)位置開(kāi)始把這個(gè)范圍遍歷一遍,找到可用端口則退出循環(huán)。如果端口很充足,那么循環(huán)只需要執(zhí)行少數(shù)幾次就可以退出。但假設(shè)說(shuō)端口消耗掉很多已經(jīng)不充足,或者干脆就沒(méi)有可用的了。那么這個(gè)循環(huán)就得執(zhí)行很多遍。我們來(lái)看下詳細(xì)的代碼。//file:net/ipv4/inet_hashtables.c
int?__inet_hash_connect(...)
{
?inet_get_local_port_range(