TCP連接相關(guān)

目錄:
1.TCP連接時(shí)的三次握手
2.TCP斷開(kāi)時(shí)的四次揮手
3.TCP和UDP的異同
4.TCP并發(fā)

TCP連接時(shí)的三次握手

三次握手的過(guò)程

為什么要有三次握手,因?yàn)槿绻挥袃纱挝帐?,那?br> 第一次:客戶端發(fā)送一個(gè)syn包給服務(wù)器,里面有一個(gè)隨機(jī)生成的syn,然后客戶端處于syn_send狀態(tài)
第二次:服務(wù)端收到客戶端發(fā)來(lái)的syn包之后,確認(rèn)syn包,也就是生成一個(gè)ack=syn+1,然后再自己隨機(jī)生成一個(gè)syn包,即syn+ack包,然后返回給客戶端,自己變成syn_recv狀態(tài)
第三次:客戶端收到服務(wù)端發(fā)來(lái)的syn+ack包之后,確認(rèn)ack是正確的之后,返回一個(gè)ack=syn+1給服務(wù)端,此包發(fā)送完畢,客戶端進(jìn)入了ESTABLISHED狀態(tài),服務(wù)端收到ack包后也進(jìn)入ESTABLISHED狀態(tài)。

握手中安全問(wèn)題

SYN攻擊,當(dāng)?shù)诙挝帐址?wù)端發(fā)送了syn+ack包之后,收到客戶端發(fā)送的ack之前這段時(shí)間的tcp鏈接成為半連接,此時(shí)服務(wù)端處于syn_recv狀態(tài)。當(dāng)大量客戶端隨機(jī)IP瘋狂發(fā)送tcp鏈接請(qǐng)求時(shí),客戶端以為是不同用戶的請(qǐng)求,所以隊(duì)列中全是半連接,然后導(dǎo)致服務(wù)器宕機(jī),正常請(qǐng)求被丟棄。

三次握手過(guò)程中出現(xiàn)丟包

第一個(gè)包發(fā)送過(guò)程丟失
A會(huì)周期性超時(shí)重傳,直到收到B的確認(rèn)
第二個(gè)包發(fā)送過(guò)程丟失
B會(huì)周期性超時(shí)重傳,直到收到A的確認(rèn)
第三個(gè)包發(fā)送過(guò)程丟失
A發(fā)送完數(shù)據(jù)后單方面進(jìn)入TCP的ESTABLISHED狀態(tài),B還處于半鏈接:

  1. 如果此時(shí)雙方都沒(méi)有數(shù)據(jù)傳輸,會(huì)進(jìn)行第二步,B會(huì)周期性超時(shí)重傳,直到收到A的確認(rèn),然后TCP也變成ESTABLISHED,雙方開(kāi)始數(shù)據(jù)傳輸。
  2. 如果A有數(shù)據(jù)需要發(fā)送,由于A已經(jīng)單方面進(jìn)入TCP的ESTABLISHED狀態(tài),因此A直接傳輸數(shù)據(jù),B收到A的數(shù)據(jù)包+ACK包后會(huì)卻換到ESTABLISHED狀態(tài),開(kāi)始接受數(shù)據(jù)包,然后開(kāi)始數(shù)據(jù)傳輸
  3. 如果B有數(shù)據(jù)需要發(fā)送,由于B處于半連接狀態(tài),數(shù)據(jù)發(fā)送不了,只會(huì)周期性超時(shí)重傳,直到收到A的確認(rèn)才會(huì)傳輸數(shù)據(jù)
為什么要三次握手

TCP協(xié)議為什么需要三次握手?

TCP斷開(kāi)時(shí)的四次揮手

四次揮手的過(guò)程

第一次:客戶端發(fā)送一個(gè)fin給服務(wù)端表示自己要斷開(kāi)連接了,然后進(jìn)入fin_wait_1狀態(tài)
第二次:服務(wù)端收到fin后,發(fā)送一個(gè)ack=fin+1給客戶端,服務(wù)端進(jìn)入close_wait狀態(tài),客戶端進(jìn)入fin_wait_2狀態(tài)
第三次:服務(wù)端發(fā)送一個(gè)fin,用來(lái)關(guān)閉服務(wù)端到客戶端的數(shù)據(jù)傳輸,服務(wù)端進(jìn)入last_ack狀態(tài)
第四次:客戶端收到fin后,進(jìn)入time_wait狀態(tài),然后發(fā)送一個(gè)ack=fin+1給服務(wù)端,服務(wù)端確認(rèn)后進(jìn)入close狀態(tài),完成四次揮手


image.png
為什么要四次揮手

TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議。TCP是全雙工模式,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí),只是表示主機(jī)1已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,主機(jī)1告訴主機(jī)2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了;但是,這個(gè)時(shí)候主機(jī)1還是可以接受來(lái)自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報(bào)文段時(shí),表示它已經(jīng)知道主機(jī)1沒(méi)有數(shù)據(jù)發(fā)送了,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí),這個(gè)時(shí)候就表示主機(jī)2也沒(méi)有數(shù)據(jù)要發(fā)送了,就會(huì)告訴主機(jī)1,我也沒(méi)有數(shù)據(jù)要發(fā)送了,之后彼此就會(huì)愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理,就需要了解四次分手過(guò)程中的狀態(tài)變化。

  • FIN_WAIT_1: 這個(gè)狀態(tài)要好好解釋一下,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí),它想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài)。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2狀態(tài),當(dāng)然在實(shí)際的正常情況下,無(wú)論對(duì)方何種情況下,都應(yīng)該馬上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般是比較難見(jiàn)到的,而FIN_WAIT_2狀態(tài)還有時(shí)常??梢杂胣etstat看到。(主動(dòng)方)
  • FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài),實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對(duì)方,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你(ACK信息),稍后再關(guān)閉連接。(主動(dòng)方)
  • CLOSE_WAIT:這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己,你系統(tǒng)毫無(wú)疑問(wèn)地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來(lái)呢,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方,如果沒(méi)有的話,那么你也就可以 close這個(gè)SOCKET,發(fā)送FIN報(bào)文給對(duì)方,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。(被動(dòng)方)
  • LAST_ACK: 這個(gè)狀態(tài)還是比較容易好理解的,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文。當(dāng)收到ACK報(bào)文后,也即可以進(jìn)入到CLOSED可用狀態(tài)了。(被動(dòng)方)
  • TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FINWAIT1狀態(tài)下,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài),而無(wú)須經(jīng)過(guò)FIN_WAIT_2狀態(tài)。(主動(dòng)方)
  • CLOSED: 表示連接中斷。

TCP和UDP的異同

? TCP UDP
是否連接 面向連接 面向非連接
傳輸可靠性 可靠 不可靠
應(yīng)用場(chǎng)合 少量數(shù)據(jù) 大量數(shù)據(jù)
速度
數(shù)據(jù)正確性 保證 可能丟包
數(shù)據(jù)順序 保證 不保證

TCP并發(fā)

  1. 網(wǎng)頁(yè)中的圖片資源為什么分放在不同的域名下?
  2. 瀏覽器與服務(wù)器建立一個(gè)TCP連接后,是否會(huì)在完成一個(gè)http請(qǐng)求后斷開(kāi)?什么條件下會(huì)斷開(kāi)?
  3. 一個(gè)TCP連接可以同時(shí)發(fā)送幾個(gè)HTTP請(qǐng)求?
  4. 瀏覽器http請(qǐng)求的并發(fā)性是如何體現(xiàn)的?并發(fā)請(qǐng)求的數(shù)量有沒(méi)有限制?

答案解析:

1.網(wǎng)頁(yè)中的圖片資源為什么分放在不同的域名下?

瀏覽器對(duì)并發(fā)請(qǐng)求的數(shù)目限制是針對(duì)域名的,即針對(duì)同一域名(包括二級(jí)域名)在同一時(shí)間支持的并發(fā)請(qǐng)求數(shù)量的限制。如果請(qǐng)求數(shù)目超出限制,則會(huì)阻塞。因此,網(wǎng)站中對(duì)一些靜態(tài)資源,使用不同的一級(jí)域名,可以提升瀏覽器并行請(qǐng)求的數(shù)目,加速界面資源的獲取速度。

2.瀏覽器與服務(wù)器建立一個(gè)TCP連接后,是否會(huì)在完成一個(gè)http請(qǐng)求后斷開(kāi)?什么條件下會(huì)斷開(kāi)?

HTTP/1.0中,一個(gè)http請(qǐng)求收到服務(wù)器響應(yīng)后,會(huì)斷開(kāi)對(duì)應(yīng)的TCP連接。這樣每次請(qǐng)求,都需要重新建立TCP連接,這樣一直重復(fù)建立和斷開(kāi)的過(guò)程,比較耗時(shí)。所以為了充分利用TCP連接,可以設(shè)置頭字段Connection: keep-alive,這樣http請(qǐng)求完成后,就不會(huì)斷開(kāi)當(dāng)前的TCP連接,后續(xù)的http請(qǐng)求可以使用當(dāng)前TCP連接進(jìn)行通信。

image

第一次訪問(wèn)有初始化連接和SSL開(kāi)銷

image

初始化連接和SSL開(kāi)銷消失了,說(shuō)明使用的是同一個(gè)TCP連接。

HTTP/1.1Connection寫入了標(biāo)準(zhǔn),默認(rèn)值為keep-alive。除非強(qiáng)制設(shè)置為Connection: close,才會(huì)在請(qǐng)求后斷開(kāi)TCP連接。

所以這一題的答案就是:默認(rèn)情況下建立的TCP連接不會(huì)斷開(kāi),只有在請(qǐng)求頭中設(shè)置Connection: close才會(huì)在請(qǐng)求后關(guān)閉TCP連接。

3.一個(gè)TCP連接可以同時(shí)發(fā)送幾個(gè)HTTP請(qǐng)求?

HTTP/1.1中,單個(gè)TCP連接,在同一時(shí)間只能處理一個(gè)http請(qǐng)求,雖然存在Pipelining技術(shù)支持多個(gè)請(qǐng)求同時(shí)發(fā)送,但由于實(shí)踐中存在很多問(wèn)題無(wú)法解決,所以瀏覽器默認(rèn)是關(guān)閉,所以可以認(rèn)為是不支持同時(shí)多個(gè)請(qǐng)求。

HTTP2提供了多路傳輸功能,多個(gè)http請(qǐng)求,可以同時(shí)在同一個(gè)TCP連接中進(jìn)行傳輸。

4.瀏覽器http請(qǐng)求的并發(fā)性是如何體現(xiàn)的?并發(fā)請(qǐng)求的數(shù)量有沒(méi)有限制?

頁(yè)面資源請(qǐng)求時(shí),瀏覽器會(huì)同時(shí)和服務(wù)器建立多個(gè)TCP連接,在同一個(gè)TCP連接上順序處理多個(gè)HTTP請(qǐng)求。所以瀏覽器的并發(fā)性就體現(xiàn)在可以建立多個(gè)TCP連接,來(lái)支持多個(gè)http同時(shí)請(qǐng)求。

Chrome瀏覽器最多允許對(duì)同一個(gè)域名Host建立6個(gè)TCP連接,不同的瀏覽器有所區(qū)別。

補(bǔ)充

如果圖片都是HTTPS的連接,并且在同一域名下,瀏覽器會(huì)先和服務(wù)器協(xié)商使用HTTP2Multiplexing功能進(jìn)行多路傳輸,不過(guò)未必所有的掛在這個(gè)域名下的資源都會(huì)使用同一個(gè)TCP連接。如果用不了HTTPS或者HTTP2(HTTP2是在HTTPS上實(shí)現(xiàn)的),那么瀏覽器會(huì)就在同一個(gè)host建立多個(gè)TCP連接,每一個(gè)TCP連接進(jìn)行順序請(qǐng)求資源。

參考:
[1].第8題-瀏覽器HTTP請(qǐng)求并發(fā)數(shù)和TCP連接的關(guān)系

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容