HTTP是如何使用TCP連接的
TCP基礎(chǔ)簡介
TCP(傳輸控制協(xié)議)(英語:Transmission Control Protocol,縮寫:TCP)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議
TCP連接為HTTP提供了一條可靠的比特傳輸管道,從TCP連接一端填入的字節(jié)會從另一端以原有的順序正確的傳送出來。
TCP流是分段的、由ip分組傳輸。
TCP的數(shù)據(jù)是通過名為IP分組(或IP數(shù)據(jù)報)的小數(shù)據(jù)塊來發(fā)送的。
-
HTTPS只是比HTTP在應(yīng)用層和傳輸層之間多了一層安全層
HTTP和HTTPS網(wǎng)絡(luò)協(xié)議棧 ip分組及tcp段在書中由詳細圖介紹,值得注意的是TCP的首部中有一些用于數(shù)據(jù)排序和完整性檢查的標記。
一個tcp連接需要源ip、源端口、目的IP地址、目的端口。當(dāng)這四個值相同時,該tcp連接是唯一的。
概述
HTTP要出傳送一條報文時,會以流的形式將報文數(shù)據(jù)的內(nèi)容通過一條打開的TCP連接按序傳輸。TCP收到數(shù)據(jù)流之后,會將數(shù)據(jù)流砍成被稱作段的小數(shù)據(jù)塊,封裝在IP分組中通過因特網(wǎng)進行傳輸。
詳細
- 服務(wù)端創(chuàng)建好套接字(socket)
- 將套接字綁定到端口上去(bind)
- 允許套接字進行連接(listen)
- 等待連接(accept)
- 客戶端獲取ip地址及端口號(get)
- 創(chuàng)建新的套接字(socket)
- 連接到服務(wù)器到socket(connect),此時服務(wù)器通知應(yīng)用程序由連接到來并開始讀取請求。
- 發(fā)送http請求并等待http響應(yīng),服務(wù)器應(yīng)用程序處理http請求報文并回送http響應(yīng)。最后關(guān)閉連接。
-
客戶端也關(guān)閉連接。
TCP客戶端是如何通過TCP套接字接口進行通信的
什么是套接字
TCP用主機的ip和端口號作為連接的斷點,這個端點就叫做套接字。用ip:port表示。
一次http事務(wù)中影響到連接時間可能是哪些原因?
- DNS解析
- tcp連接建立時間
- 建立tcp連接后請求報文的傳輸時間、服務(wù)器讀取并處理請求報文的時間
- 服務(wù)器返回給客戶端的響應(yīng)報文傳輸時間
總的來說取決于硬件速度、網(wǎng)絡(luò)及服務(wù)器的負載、請求及響應(yīng)報文的尺寸、客戶端到服務(wù)器的距離、TCP協(xié)議技術(shù)的復(fù)雜性。
TCP連接的時延、瓶頸以及存在的障礙
TCP連接中由哪些原因會導(dǎo)致時延?
- TCP連接建立握手
- 延遲確認
詳細解釋下TCP三次握手?

- 第一次握手:客戶端發(fā)送一個IP分組,分組中含有SYN(Synchronize Sequence Numbers同步序列編號)標記。該標記的作用是說明這是一個連接請求。
- 第一次握手:服務(wù)端收到該分組,并獲取其連接參數(shù)。返回SYN標記和ACK(Acknowledgement 確認)標記。ACK標記的作用是說明該連接已被接受。
- 第三次握手:最后,客戶端再向服務(wù)器發(fā)送一條確認信息,表示此次連接已經(jīng)建立。(現(xiàn)代的TCP協(xié)議都允許在此IP分組中發(fā)送數(shù)據(jù))
TCP為什么是三次握手,而不是兩次或四次?
什么是延遲確認
每個TCP段都有一個序列號和完整性校驗和。接收者收到后需要向發(fā)送者返回一個確認分組,以標識該分組已被收到。如果接收者沒有收到該確認分組,則任務(wù)該分段已破損或者丟失,則會重發(fā)該分組。這就是確認。
關(guān)于延遲確認:由于該確認報文很小,因此允許在其他發(fā)往相同方向的tcp段上捎帶。延遲確認算法會在一個特定的窗口時期(100ms-200ms),將確認分組放到緩沖區(qū),以尋找可以捎帶它的分組,如果沒等到,那就成為一個獨立分組發(fā)往發(fā)送者。
什么是緩沖區(qū)
緩沖區(qū)(Buffer)又稱為緩存(Cache),是內(nèi)存空間的一部分。
也就是說,在內(nèi)存中預(yù)留了一定的存儲空間,用來暫時保存輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。
什么是TCP慢啟動
為了防止網(wǎng)絡(luò)的突然過載和擁塞,TCP對新的連接有速度限制。剛開始連接時,需要先發(fā)送一個分組等待確認,確認成功就可以發(fā)送之前兩倍大小的報文??梢岳斫鉃橛幸粋€窗口大小,默認是最小的,多發(fā)一次,窗口就變大一倍,直到慢啟動門限變量值(就是一個常量,限制慢啟動的最大值)。這個速度其實是很快的,每次都是兩倍速度往上翻。
什么是擁塞避免
等到限制變?yōu)槁龁娱T限變量值時,為了避免增長速度過快,變成以加法的形式線性增長。
什么是超時重傳
上面的兩個機制都是在沒有擁塞的情況下增長的,要是擁塞了如何調(diào)整窗口值呢?
首先看tcp如何判定網(wǎng)絡(luò)進入擁塞狀態(tài):TCP的主要依據(jù)是發(fā)送端重發(fā)TCP段。TCP對每個報文段都有一個定時器叫做重傳定時器,當(dāng)這個定時器超時還沒有得到數(shù)據(jù)確認,那么TCP就會將該分組進行重傳。當(dāng)發(fā)生超時時,重傳的可能性很大,這個時候,TCP就會有以下強烈反應(yīng):
- 將慢啟動門限變量值降低一倍
- 將窗口值重新設(shè)為1
- 重新進入慢啟動
這樣就保證了各個流之間的公平性。
什么是快速重傳以及三次ACK的由來?
Nagle算法解決的問題?
每個TCP段至少裝載了40個字節(jié)的標記和首部,如果該分組中數(shù)據(jù)量很少,那么網(wǎng)絡(luò)性能就會很低。也會影響其他的因特網(wǎng)流量。這個算法就是來解決這個問題的。它在一定條件下才允許發(fā)送非全尺寸的分組。不過也會帶來性能問題,比如它可能一直會等待數(shù)據(jù)來填滿一個分組,雖然有延遲界限,比如100ms-200ms,但總歸速度降低。一般情況下,會設(shè)置TCP_NODELAY參數(shù)來提高性能,同時確保分組數(shù)據(jù)塊但大小。
HTTP的優(yōu)化,包括并行連接、keep-alive(持久連接)和管道化連接
- 并行連接
如果帶寬有限,并行連接不一定能減少加載時間,并且并行連接導(dǎo)致內(nèi)存占用過高導(dǎo)致自身性能問題。服務(wù)器性能也會降低。所以瀏覽器會限制連接總數(shù)。服務(wù)器也可以關(guān)閉來自特定客戶端的超量連接。 - connection首部:keep-alive
因為一個頁面上可能加載同一服務(wù)器的資源,TCP建立連接和關(guān)閉連接耗時較多,存在TCP慢啟動但特性,同時可打開但并行數(shù)量有限。這個首部1996年就被提出了,被HTTP1.0實現(xiàn),HTTP1.1中做了很多問題修正,最新版本是persistent連接。connection:keep-alive是這樣的,客戶端請求帶上這個首部,服務(wù)器同樣需要返回,如果服務(wù)器不返回,那么客戶端任務(wù)該服務(wù)器不支持keep-alive,則關(guān)閉連接。必須保證返回的content-length是正確的,否則沒法保證前一次連接的結(jié)束和新連接的開始。 - keep-alive
只有開啟了connection:keep-alive才有效。并且此首部可選
響應(yīng)首部中的timeout參數(shù)代表服務(wù)器估計的保持連接活躍時間,注意這不是承諾值。
響應(yīng)首部中的max參數(shù)估計了服務(wù)器還希望多少個事務(wù)保持此連接的活躍狀態(tài),注意不是個承諾值。
connection: Keep-Alive
Keep-Alive: max=5, timeout=120
表示最多再為其他5個事務(wù)保持連接打開狀態(tài)。

