HTTP是基于TCP協(xié)議傳輸?shù)? 所以在這我們先了解下TCP協(xié)議
TCP包頭格式
我們先看看TCP報(bào)文頭部的格式:

首先 源端口號和目標(biāo)端口號是必不可少的, 沒有沒有這兩個(gè)端口,數(shù)據(jù)就不知道應(yīng)該發(fā)給哪個(gè)應(yīng)用
序號: 是為了解決發(fā)送包的亂序問題
確認(rèn)號: 是為了確認(rèn)發(fā)出去的包對象是否有收到, 如果沒有收到,就應(yīng)該重新發(fā)送, 直到送到為止, 這就是為了解決丟包問題
接下來就是狀態(tài)位. TCP是面向連接的, 因而雙方需要維護(hù)連接的狀態(tài), 這些帶狀態(tài)的數(shù)據(jù)包發(fā)送, 會(huì)引起雙方的連接狀態(tài)變更
SYN 發(fā)起一個(gè)連接,
ACK回復(fù),
RST重新連接,
FIN結(jié)束連接
窗口大小: TCP要做流量控制, 通信雙方各生成一個(gè)窗口(緩存大小), 標(biāo)識自己當(dāng)前能夠處理的數(shù)據(jù)的能力, 別發(fā)送的太快, 撐死我, 也別發(fā)送的太慢, 餓死了
擁塞控制: 對于真正的道路堵不堵車, 它無能為力, 唯一能做的就是控制自己, 也及控制發(fā)送的速度,
TCP傳輸數(shù)據(jù)之前,要先建立三次握手
在HTTP傳輸數(shù)據(jù)之前, 首先需要TCP連接, TCP連接建立, 通常稱為三次握手
這個(gè)所謂的[連接] 只是雙方計(jì)算機(jī)里維護(hù)一個(gè)狀態(tài), 在連接建立的過程中, 雙方的狀態(tài)變?yōu)闀r(shí)序圖就想這樣

- 一開始, 客戶端服務(wù)端都處于close狀態(tài), 服務(wù)端主動(dòng)監(jiān)聽某個(gè)端口,變?yōu)長ISTEN狀態(tài)
- 客戶端發(fā)起來一個(gè)
syn連接請求, 之后處于syn_send狀態(tài) - 服務(wù)端收到客戶端的連接請求會(huì)回復(fù)一個(gè)
syn + ack的確認(rèn)請求給客戶端, 然后狀態(tài)變?yōu)?syn_rcvd - 客戶端收到服務(wù)器的確認(rèn)后,也會(huì)發(fā)一個(gè)
ACK確認(rèn)給服務(wù)端告訴他, 收到了你的ACK確認(rèn),然后狀態(tài)變?yōu)镋STABLISHED,連接已建立 , 因?yàn)樗话l(fā)一收成功 - 服務(wù)端收到
ACK后也會(huì)變?yōu)镋STABLISHED連接已建立狀態(tài), 因?yàn)樗惨话l(fā)一收成功
所以三次握手是保證雙方都有發(fā)送和接收的能力