一文走進 HTTP 與 TCP 協(xié)議,它們的區(qū)別與聯(lián)系
點擊上方 三分鐘學(xué)前端,關(guān)注公眾號
回復(fù)交流,加入前端編程面試算法每日一題群
引言
本文從 OSI 網(wǎng)絡(luò)分層(7 層) 開始探討 TCP 與 HTTP 的關(guān)系,包含以下幾個部分:
OSI 網(wǎng)絡(luò)分層(7 層) TCP 協(xié)議(三次握手、四次揮手) HTTP TCP 與 HTTP 的區(qū)別與聯(lián)系
OSI 網(wǎng)絡(luò)分層(7 層)
Open Systems Interconncection 開放系統(tǒng)互聯(lián):

1 物理層 -> 2 數(shù)據(jù)鏈路層 -> 3 網(wǎng)絡(luò)層(ip)-> 4 傳輸層(tcp) -> 5 會話層 --> 6 表示層 --> 7 應(yīng)用層(http)
| 協(xié)議 | 描述 | |
|---|---|---|
| 第七層 | 應(yīng)用層 | 支持網(wǎng)絡(luò)應(yīng)用,應(yīng)用協(xié)議僅僅是網(wǎng)絡(luò)應(yīng)用的一個組成部分,運行在不同主機上的進程則使用應(yīng)用層協(xié)議進行通信。主要的協(xié)議有:http、ftp、dns、telnet、smtp、pop3等。 |
| 第六層 | 表示層 | 把數(shù)據(jù)轉(zhuǎn)換為合適、可理解的語法和語義 |
| 第五層 | 會話層 | 維護網(wǎng)絡(luò)中的連接狀態(tài),即保持會話和同步,有 SSL |
| 第四層 | 傳輸層 | 負(fù)責(zé)為信源和信宿提供應(yīng)用程序進程間的數(shù)據(jù)傳輸服務(wù),這一層上主要定義了兩個傳輸協(xié)議,即傳輸控制協(xié)議TCP和用戶數(shù)據(jù)報協(xié)議UDP。 |
| 第三層 | 網(wǎng)絡(luò)層 | 負(fù)責(zé)將數(shù)據(jù)報獨立地從信源發(fā)送到信宿,主要解決路由選擇、擁塞控制和網(wǎng)絡(luò)互聯(lián)等問題。IP 在這一層 |
| 第二層 | 數(shù)據(jù)鏈路層 | 負(fù)責(zé)將IP數(shù)據(jù)報封裝成合適在物理網(wǎng)絡(luò)上傳輸?shù)膸袷讲鬏敚驅(qū)奈锢砭W(wǎng)絡(luò)接收到的幀解封,取出IP數(shù)據(jù)報交給網(wǎng)絡(luò)層。 |
| 第一層 | 物理層 | 負(fù)責(zé)將比特流在結(jié)點間傳輸,即負(fù)責(zé)物理傳輸。該層的協(xié)議既與鏈路有關(guān)也與傳輸介質(zhì)有關(guān)。 |
HTTP 是應(yīng)用層協(xié)議,而 TCP 是傳輸層協(xié)議,接下來我們逐一詳細(xì)介紹??
TCP
TCP、UDP都是是傳輸層協(xié)議:
用戶數(shù)據(jù)報協(xié)議 UDP(User Datagram Protocol): 無連接; 盡最大努力的交付; 面向報文; 無擁塞控制; 支持一對一、一對多、多對一、多對多的交互通信; 首部開銷小(只有四個字段:源端口、目的端口、長度、檢驗和)。 傳輸控制協(xié)議 TCP(Transmission Control Protocol): 面向連接; 每一個TCP連接只能是點對點的(一對一); 提供 可靠交付 服務(wù); 提供 全雙工 通信; 面向字節(jié)流。
另外,UDP是面向報文的傳輸方式是應(yīng)用層交給UDP多長的報文,UDP發(fā)送多長的報文,即一次發(fā)送一個報文。因此,應(yīng)用程序必須選擇合適大小的報文
應(yīng)用程序和 TCP 的交互是一次一個數(shù)據(jù)塊(大小不等),但 TCP 把應(yīng)用程序看成是一連串的無結(jié)構(gòu)的字節(jié)流。TCP有一個緩沖,當(dāng)應(yīng)該程序傳送的數(shù)據(jù)塊太長,TCP就可以把它劃分短一些再傳送
當(dāng)網(wǎng)絡(luò)通信時采用 TCP 協(xié)議時,在真正的讀寫操作之前,客戶端與服務(wù)器端之間必須建立一個連接,當(dāng)讀寫操作完成后,雙方不再需要這個連接時可以釋放這個連接。連接的建立依靠“三次握手”,而釋放則需要“四次握手”,所以每個連接的建立都是需要資源消耗和時間消耗的
TCP連接過程(三次握手)

第一次握手
客戶端向服務(wù)端發(fā)送連接請求報文段。該報文段中包含自身的數(shù)據(jù)通訊初始序號。請求發(fā)送后,客戶端便進入 SYN-SENT 狀態(tài)。
第二次握手
服務(wù)端收到連接請求報文段后,如果同意連接,則會發(fā)送一個應(yīng)答,該應(yīng)答中也會包含自身的數(shù)據(jù)通訊初始序號,發(fā)送完成后便進入 SYN-RECEIVED 狀態(tài)。
第三次握手
當(dāng)客戶端收到連接同意的應(yīng)答后,還要向服務(wù)端發(fā)送一個確認(rèn)報文。客戶端發(fā)完這個報文段后便進入 ESTABLISHED 狀態(tài),服務(wù)端收到這個應(yīng)答后也進入 ESTABLISHED 狀態(tài),此時連接建立成功。
為什么需要三次握手,2次不行嗎?
喂喂喂,我是A,你聽的到嗎?B:在在在,我能聽到,我是B,你能聽到我嗎? A:(聽到了,老子不想理你) B:喂喂喂?聽不聽到?我X,對面死了,我掛了。。
如果只有 2 次的話,B 并不清楚 A 是否收到他發(fā)過去的信息。
TCP斷開鏈接(四次揮手)

第一次揮手
若客戶端 A 認(rèn)為數(shù)據(jù)發(fā)送完成,則它需要向服務(wù)端 B 發(fā)送連接釋放請求。
第二次揮手
B 收到連接釋放請求后,會告訴應(yīng)用層要釋放 TCP 鏈接。然后會發(fā)送 ACK 包,并進入 CLOSE_WAIT 狀態(tài),此時表明 A 到 B 的連接已經(jīng)釋放,不再接收 A 發(fā)的數(shù)據(jù)了。但是因為 TCP 連接是雙向的,所以 B 仍舊可以發(fā)送數(shù)據(jù)給 A。
第三次揮手
B 如果此時還有沒發(fā)完的數(shù)據(jù)會繼續(xù)發(fā)送,完畢后會向 A 發(fā)送連接釋放請求,然后 B 便進入 LAST-ACK 狀態(tài)。
PS:通過延遲確認(rèn)的技術(shù)(通常有時間限制,否則對方會誤認(rèn)為需要重傳),可以將第二次和第三次握手合并,延遲 ACK 包的發(fā)送。
第四次揮手
A 收到釋放請求后,向 B 發(fā)送確認(rèn)應(yīng)答,此時 A 進入 TIME-WAIT 狀態(tài)。該狀態(tài)會持續(xù) 2MSL(最長報文段壽命,指報文段在網(wǎng)絡(luò)中生存的時間,超時會被拋棄) 時間,若該時間段內(nèi)沒有 B 的重發(fā)請求的話,就進入 CLOSED 狀態(tài)。當(dāng) B 收到確認(rèn)應(yīng)答后,也便進入 CLOSED 狀態(tài)。
HTTP
HTTP 是建立在 TCP 上的應(yīng)用層協(xié)議,超文本傳送協(xié)議。
HTTP 連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
http1.0 :客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。
http1.1 :可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結(jié)束后就可以再發(fā)送一個新的請求
http2.0 :支持多路復(fù)用,一個 TCP 可同時傳輸多個 http 請求,頭部數(shù)據(jù)還做了壓縮
http3.0 :使用了 QUIC,開啟多個 TCP 連接,在出現(xiàn)丟包的情況下,只有丟包的 TCP 等待重傳,剩余的 TCP 連接還可以正常傳輸數(shù)據(jù)
HTTP特點
無狀態(tài):協(xié)議對客戶端沒有狀態(tài)存儲,對事物處理沒有“記憶”能力,比如訪問一個網(wǎng)站需要反復(fù)進行登錄操作。 無連接:HTTP/1.1之前,由于無狀態(tài)特點,每次請求需要通過TCP三次握手四次揮手,和服務(wù)器重新建立連接。比如某個客戶機在短時間多次請求同一個資源,服務(wù)器并不能區(qū)別是否已經(jīng)響應(yīng)過用戶的請求,所以每次需要重新響應(yīng)請求,需要耗費不必要的時間和流量。 基于請求和響應(yīng):基本的特性,由客戶端發(fā)起請求,服務(wù)端響應(yīng)。 簡單快速、靈活。 通信使用明文、請求和響應(yīng)不會對通信方進行確認(rèn)、無法保護數(shù)據(jù)的完整性。
Method
GET 方法請求一個指定資源的表示形式. 使用GET的請求應(yīng)該只被用于獲取數(shù)據(jù). HEAD 方法請求一個與GET請求的響應(yīng)相同的響應(yīng),只返回請求頭,沒有響應(yīng)體,多數(shù)由 JavaScript 發(fā)起 POST 方法用于將實體提交到指定的資源,通常導(dǎo)致狀態(tài)或服務(wù)器上的副作用的更改. PUT 方法用請求有效載荷替換目標(biāo)資源的所有當(dāng)前表示。 DELETE 方法刪除指定的資源。 CONNECT 方法建立一個到由目標(biāo)資源標(biāo)識的服務(wù)器的隧道,多用于 HTTPS 和 WebSocket 。 OPTIONS 方法,預(yù)檢,用于描述目標(biāo)資源的通信選項。通過該請求來知道服務(wù)端是否允許跨域請求。 TRACE 方法沿著到目標(biāo)資源的路徑執(zhí)行一個消息環(huán)回測試,多數(shù)線上服務(wù)都不支持 PATCH 方法用于對資源應(yīng)用部分修改。
HTTP 與 TCP 區(qū)別
TCP 協(xié)議對應(yīng)于傳輸層,而 HTTP 協(xié)議對應(yīng)于應(yīng)用層,從本質(zhì)上來說,二者沒有可比性:
HTTP 對應(yīng)于應(yīng)用層,TCP 協(xié)議對應(yīng)于傳輸層
HTTP 協(xié)議是在 TCP 協(xié)議之上建立的,HTTP 在發(fā)起請求時通過 TCP 協(xié)議建立起連接服務(wù)器的通道,請求結(jié)束后,立即斷開 TCP 連接
HTTP 是無狀態(tài)的短連接,而 TCP 是有狀態(tài)的長連接
TCP是傳輸層協(xié)議,定義的是數(shù)據(jù)傳輸和連接方式的規(guī)范,HTTP是應(yīng)用層協(xié)議,定義的是傳輸數(shù)據(jù)的內(nèi)容的規(guī)范
說明:從HTTP/1.1起,默認(rèn)都開啟了Keep-Alive,保持連接特性,簡單地說,當(dāng)一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間。
來自:https://github.com/Advanced-Frontend/Daily-Interview-Question
