http請(qǐng)求實(shí)際上是 TCP連接淆珊。
是的浸策,HTTP請(qǐng)求實(shí)際上是通過TCP(傳輸控制協(xié)議)連接來傳輸?shù)?/b>奏司。HTTP(超文本傳輸協(xié)議)是一種應(yīng)用層協(xié)議瓷叫,它定義了客戶端(如瀏覽器)和服務(wù)器之間交換數(shù)據(jù)的格式拢军。然而楞陷,HTTP本身并不直接處理網(wǎng)絡(luò)連接的建立和維持,這是由TCP協(xié)議來完成的茉唉。
以下是HTTP請(qǐng)求通過TCP連接傳輸?shù)幕静襟E:
1. **三次握手**:客戶端和服務(wù)器通過TCP協(xié)議進(jìn)行三次握手來建立連接固蛾。這個(gè)過程包括以下步驟:
? - 客戶端發(fā)送一個(gè)SYN(同步序列編號(hào))包到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài)度陆。
? - 服務(wù)器收到SYN包艾凯,發(fā)送一個(gè)SYN+ACK(同步序列編號(hào)+確認(rèn))包作為響應(yīng),并進(jìn)入SYN_RECEIVED狀態(tài)懂傀。
? - 客戶端收到SYN+ACK包后趾诗,發(fā)送一個(gè)ACK(確認(rèn))包,并進(jìn)入ESTABLISHED狀態(tài)鸿竖。服務(wù)器收到ACK包后也進(jìn)入ESTABLISHED狀態(tài)沧竟,此時(shí)連接建立完成。(三次互通之后才建立起連接傳輸數(shù)據(jù))
問:為什么是三次握手缚忧?不是兩次悟泵、四次?
答:
三次握手的原因:
三次握手才可以阻止重復(fù)歷史連接的初始化(主要原因)闪水;
三次握手才可以同步雙方的初始序列號(hào)糕非;
三次握手才可以避免資源浪費(fèi);
如果是兩次握手連接球榆,就無法阻止歷史連接朽肥,浪費(fèi)了服務(wù)端的資源。
可以看到持钉,如果采用兩次握手建立 TCP 連接的場(chǎng)景下衡招,服務(wù)端在向客戶端發(fā)送數(shù)據(jù)前,并沒有阻止掉歷史連接每强,導(dǎo)致服務(wù)端建立了一個(gè)歷史連接始腾,又白白發(fā)送了數(shù)據(jù),妥妥地浪費(fèi)了服務(wù)端的資源空执。
因此浪箭,要解決這種現(xiàn)象,最好就是在服務(wù)端發(fā)送數(shù)據(jù)前辨绊,也就是建立連接之前奶栖,要阻止掉歷史連接,這樣就不會(huì)造成資源浪費(fèi),而要實(shí)現(xiàn)這個(gè)功能宣鄙,就需要三次握手袍镀。(即多建立了一個(gè)沒用的連接)
所以,TCP 使用三次握手建立連接的最主要原因是防止「歷史連接」初始化了連接冻晤。
四次的話沒必要流椒。因?yàn)?、3次可以合成為一次明也。變?yōu)?次即可。
問:TCP報(bào)文失敗重傳惯裕?TCP如何實(shí)現(xiàn)可靠傳輸和流量控制温数?
答:
以字節(jié)為單位的滑動(dòng)窗口技術(shù)(主要解決流量控制);
重傳機(jī)制蜻势;
2. **發(fā)送HTTP請(qǐng)求**:一旦TCP連接建立撑刺,客戶端就可以發(fā)送HTTP請(qǐng)求到服務(wù)器。
3. **服務(wù)器響應(yīng)**:服務(wù)器接收到HTTP請(qǐng)求后握玛,處理請(qǐng)求并返回HTTP響應(yīng)够傍。
4. **四次揮手**:當(dāng)數(shù)據(jù)交換完成后,客戶端和服務(wù)器需要通過四次揮手來關(guān)閉連接挠铲。這個(gè)過程包括以下步驟:
? - 客戶端發(fā)送一個(gè)FIN(結(jié)束)包冕屯,并進(jìn)入FIN_WAIT_1狀態(tài)。
? - 服務(wù)器收到FIN包后拂苹,發(fā)送一個(gè)ACK包安聘,并進(jìn)入CLOSE_WAIT狀態(tài)。
? - 服務(wù)器發(fā)送一個(gè)FIN包瓢棒,并進(jìn)入LAST_ACK狀態(tài)浴韭。
? - 客戶端收到FIN包后,發(fā)送一個(gè)ACK包脯宿,并進(jìn)入TIME_WAIT狀態(tài)念颈。服務(wù)器收到ACK包后,進(jìn)入CLOSED狀態(tài)连霉,客戶端在等待一段時(shí)間后也進(jìn)入CLOSED狀態(tài)榴芳。
通過這種方式,HTTP請(qǐng)求可以在TCP連接的保障下安全窘面、可靠地傳輸翠语。
參考文章:TCP 三次握手與四次揮手深入探究