主要介紹TCP鏈接,TCP性能考慮,TCP的三次握手。
http鏈接實際上就是tcp鏈接及其使用規則。要弄懂http,必須弄懂tcp。
1.tcp/ip的七層架構
我們先複習一下tcp/ip的七層架構。
2.TCP的三次握手
TCP(Transmission Control Protocol) 傳輸控制協議
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:
位碼即tcp標誌位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連接建立成功。
完成三次握手,主機A與主機B開始傳送數據。
http事務延遲
http事務的時延有幾個原因。
1.URI轉成IP,http客戶端都有一個小的DNS緩存。
2.每條鏈接會有鏈接建立的時延。
3.請求處理
3.回送http相應
TCP的相關延遲
1.TCP鏈接建立握手
2.TCP慢啓動擁塞
3.數據聚集的Nagle算法
4.用於攜帶確認的TCP延遲確認算法
5.TIME_WAIT時延和端口耗盡
1.TCP鏈接建立握手
但你花費這些時間建立鏈接,傳輸數據少,不靠譜。小的http事務會花費50%的時間進行TCP鏈接,HTTP會有重用現存鏈接,減少TCP建立鏈接造成的影響。也就是持久鏈接關鍵字keep-alive。
兩種:HTTP/1.0+ "keep-alive" 已經不再使用。服務器不一定同意keep-alive會話。
HTTP/1.1 “persistent”
Connection: keep-alive
Keep-Alive:max=5,timeout=120 最多爲5個事務服務,保持鏈接空閒120秒。
Keep-alive鏈接的限制和規則
1.要有content-length
2.不應該與無法確定是否支持Connection首部的呆梨服務器建立keep-alive鏈接。
服務器支持會回送一個Connection:keep-alive 如:http://www.woyaofun.com/
盲中繼,就是代理不會處理同一條鏈接的其他請求,建立不了長鏈接。
作爲代理是不能轉發connection首部的。
HTTP/1.1 persistent鏈接。
2.TCP慢啓動擁塞
防止因特網得突然過載,每成功接受到一個分組,發送端就有路發送另外兩個分組得權限。
3.數據聚集的Nagle算法
Nagle算法的基本定義是任意時刻,最多只能有一個未被確認的小段。 所謂“小段”,指的是小於MSS尺寸的數據塊,所謂“未被確認”,是指一個數據塊發送出去後,沒有收到對方發送的ACK確認該數據已收到。
Nagle算法的規則(可參考tcp_output.c文件裏tcp_nagle_check函數註釋):
(1)如果包長度達到MSS,則允許發送;
(2)如果該包含有FIN,則允許發送;
(3)設置了TCP_NODELAY選項,則允許發送;
(4)未設置TCP_CORK選項時,若所有發出去的小數據包(包長度小於MSS)均被確認,則允許發送;
(5)上述條件都未滿足,但發生了超時(一般爲200ms),則立即發送。
4TIME_WAIT時延和端口耗盡
當某個TCP斷電關閉TCP鏈接時,會在內存中維護一個小的控制快,用來記錄最近所關閉鏈接的IP地址和端口號。緩存小於兩分鐘。