IP,TCP和HTTP

? 可以參考OSI模型定義了七層結(jié)構(gòu)。
? 著重探討特殊的混合模式:基于IP的TCP,以及基于TCP實(shí)現(xiàn)的HTTP。這個(gè)是我們每天app的基本網(wǎng)絡(luò)配置。
? 其實(shí)在互聯(lián)網(wǎng)上傳遞數(shù)據(jù)的方式并不只 HTTP 一種。HTTP 之所以被廣泛使用的原因是其非常穩(wěn)定、易用,即便是防火墻一般也是允許 HTTP 協(xié)議穿透的
IP Header
一個(gè)IP數(shù)據(jù)包通常包含header(報(bào)頭信息)和payload(有效載荷)。
payload中的內(nèi)容既是要傳輸?shù)恼嬲男畔ⅲ鴋eader承載的是與傳輸數(shù)據(jù)有關(guān)的元數(shù)據(jù)(metadata)。
Header長(zhǎng)度為20字節(jié)
header信息中最關(guān)鍵的是源和目標(biāo)IP地址。
Fragmentation(數(shù)據(jù)分片)
由于底部鏈路層對(duì)所傳輸?shù)臄?shù)據(jù)幀有最大長(zhǎng)度的限制,所以有時(shí)候我們需要對(duì)數(shù)據(jù)進(jìn)行分片。假如數(shù)據(jù)超出了數(shù)據(jù)的長(zhǎng)度而數(shù)據(jù)源沒(méi)有啟用對(duì)傳輸數(shù)據(jù)包進(jìn)行分片,就會(huì)收到ICMP(Internet Control Message Protocol,Internet報(bào)文控制協(xié)議) 的數(shù)據(jù)幀超長(zhǎng)報(bào)告信息。
在IPv6中,如果數(shù)據(jù)包超限制,路由會(huì)直接丟棄數(shù)據(jù)包并且向發(fā)送源回傳ICMP6的數(shù)據(jù)幀超長(zhǎng)報(bào)告信息。源和目標(biāo)兩端會(huì)基于這個(gè)特性來(lái)路徑MTU(maximum transfer unit)發(fā)現(xiàn),以此尋找兩端之間最大傳輸單元所在的路由。找到MTU路由后,僅當(dāng)上層數(shù)據(jù)包的最小pauload(負(fù)載)確實(shí)超過(guò)了MTU,IPv6才會(huì)進(jìn)行分片傳輸。對(duì)于IPv6下的TCP,這bu不會(huì)造成什么問(wèn)題。
TCP
TCP是基于IP層的協(xié)議,但是TCP是可靠的,有序的,有錯(cuò)誤檢查機(jī)制的基于字節(jié)流傳輸?shù)膮f(xié)議。
TCP建立的是雙向的連接,通信雙方可以同時(shí)進(jìn)行數(shù)據(jù)的傳輸。
TCP用不同的端口號(hào)來(lái)區(qū)分應(yīng)用。(IP地址和端口號(hào))
TCP Segments(TCP報(bào)文段)
? 主機(jī)之間傳輸?shù)臄?shù)據(jù)流一般先會(huì)被分塊,再轉(zhuǎn)化成 TCP 的報(bào)文段,最終會(huì)生成 IP 數(shù)據(jù)包中的 payload 載荷數(shù)據(jù)。
? 每個(gè) TCP 報(bào)文段都有 header 信息和對(duì)應(yīng)的載荷 payload。payload 信息就是待傳輸?shù)臄?shù)據(jù)塊。TCP 報(bào)文段的 header 信息中主要包含的是源和目標(biāo)端口號(hào),至于說(shuō)源和目標(biāo)的 IP 地址信息則已經(jīng)包含在 IP header 信息中了。
TCP連接
三次握手
數(shù)據(jù)傳輸
? TCP 將流量控制和其他一系列復(fù)雜機(jī)制結(jié)合起來(lái)進(jìn)行擁塞控 制。需要處理以下問(wèn)題:針對(duì)丟失的報(bào)文采用重發(fā)機(jī)制,同時(shí)還需要?jiǎng)討B(tài)的調(diào)整發(fā)送報(bào)文的頻率
終止連接
最終連接會(huì)終止(或結(jié)束)。連接的每一端都會(huì)發(fā)送 FIN 標(biāo)識(shí)給另一端來(lái)聲明結(jié)束傳輸,接著另一端會(huì)對(duì)收到 FIN 進(jìn)行確認(rèn)。當(dāng)連接兩端均發(fā)送完各自 FIN 和做出相應(yīng)的確認(rèn)后,連接將會(huì)徹底關(guān)閉。
HTTPS
Transport Layer Security (安全傳輸層協(xié)議,TLS) 是一種基于 TCP 的加密協(xié)議。它支持兩件事:
傳輸?shù)膬啥丝梢曰ハ囹?yàn)證對(duì)方的身份,以及加密所傳輸?shù)臄?shù)據(jù)
基于 TLS 的 HTTP 請(qǐng)求就是 HTTPS。
基于HTTPS的請(qǐng)求,在網(wǎng)絡(luò)安全方面有顯著的提升。但是請(qǐng)求會(huì)比較耗時(shí)。
綜合結(jié)論
有效的適應(yīng)連接
TCP連接容易在兩個(gè)時(shí)點(diǎn)出現(xiàn)問(wèn)題:初始設(shè)置,以及通過(guò)傳輸?shù)淖詈笠徊糠謭?bào)文。
建立連接
連接設(shè)置可能會(huì)比較耗時(shí)。TCP建立連接的過(guò)程中需要進(jìn)行三次握手。這個(gè)過(guò)程中本身沒(méi)有太多的數(shù)據(jù)需要傳遞。但是,對(duì)于移動(dòng)網(wǎng)絡(luò)來(lái)說(shuō),從手機(jī)端向服務(wù)器端發(fā)送一個(gè)數(shù)據(jù)包普遍需要 250ms,也就是四分之一秒。推及到三次握手,也就是說(shuō)在還沒(méi)有傳送任何數(shù)據(jù)之前,光建立連接就要花費(fèi) 750ms。
HTTPS 的情況更夸張,由于 HTTPS 是基于 TLS 的 HTTP,而 HTTP 又基于 TCP。TCP 連接就要執(zhí)行三次握手,然后到了 TLS 層還會(huì)再握手三次。估算一下,建立一個(gè) HTTPS 連接的耗時(shí)至少是創(chuàng)建一個(gè) HTTP 連接的兩倍。如果 RTT 時(shí)間是 500ms(假設(shè)單程 250ms),HTTPS 建立連接累計(jì)總耗時(shí)將達(dá)1.5秒。
長(zhǎng)連接和管線(xiàn)化
HTTP有兩種策略來(lái)解決這些問(wèn)題。最簡(jiǎn)單的是HTTP持久連接,也被稱(chēng)為長(zhǎng)連接。具體就是,每當(dāng)HTTP完成一組請(qǐng)求相應(yīng)之后,還會(huì)復(fù)用相同的TCP連接。而HTTPS會(huì)復(fù)用同樣的TLS連接:
client sends HTTP request 1 ->
<- server sends HTTP response 1
client sends HTTP request 2 ->
<- server sends HTTP response 2
client sends HTTP request 3 ->
<- server sends HTTP response 3
close connection
第二步就利用了 HTTP 管線(xiàn) (pipelining) 處理,即允許客戶(hù)端利用同樣的連接并行發(fā)送多個(gè)請(qǐng)求,也就是說(shuō)無(wú)需等待上一個(gè)請(qǐng)求的響應(yīng)完成可以發(fā)下一個(gè)請(qǐng)求。這表示能同時(shí)處理請(qǐng)求和響應(yīng),請(qǐng)求處理的順序采用先進(jìn)先出原則,響應(yīng)結(jié)果會(huì)按照請(qǐng)求發(fā)出的順序依次返還給客戶(hù)端。
稍微簡(jiǎn)化一下,看起來(lái)會(huì)是這樣:
open connection
client sends HTTP request 1 ->
client sends HTTP request 2 ->
client sends HTTP request 3 ->
client sends HTTP request 4 ->
<- server sends HTTP response 1
<- server sends HTTP response 2
<- server sends HTTP response 3
<- server sends HTTP response 4
close connection
注意:服務(wù)器發(fā)出的相應(yīng)是實(shí)時(shí)的,不會(huì)等到接受全部請(qǐng)求才處理。
可以利用這個(gè)特點(diǎn)來(lái)提升 TCP 的效率。只需要在建立連接初始階段執(zhí)行握手,而后一直復(fù)用同樣的連接,這樣 TCP 就可以最大限度的利用帶寬。此種情況下,擁塞控制也會(huì)隨之提升。因?yàn)榭焖僦匕l(fā)機(jī)制無(wú)法處理的最末四個(gè)報(bào)文丟失情況只會(huì)發(fā)生在使用本連接的最后一個(gè)請(qǐng)求-響應(yīng)中,而不是像之前那樣每一個(gè)請(qǐng)求-響應(yīng)都需要建立自己的連接,每個(gè)連接中都可能出現(xiàn)最后四個(gè)報(bào)文丟失的問(wèn)題。
本文來(lái)源:鏈接