網(wǎng)絡(luò)分層模型:
TCP/IP四層模型——>(應(yīng)用層)姿鸿、(傳輸層)、(網(wǎng)絡(luò)層)见秤、(網(wǎng)絡(luò)接口層)
TCP/IP五層模型——>(應(yīng)用層)、(傳輸層)、(網(wǎng)絡(luò)層)屈尼、(數(shù)據(jù)鏈路層炊汹、物理層)
OSI(開放式系統(tǒng)互聯(lián))——>(應(yīng)用層躬充、表示層、會(huì)話層)讨便、(傳輸層)充甚、(網(wǎng)絡(luò)層)、(數(shù)據(jù)鏈路層霸褒、物理層)
TCP/IP基礎(chǔ):
TCP三次握手——>
第一次握手:建立連接時(shí)伴找,客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài)废菱,等待服務(wù)器確認(rèn)技矮;SYN:同步序列編號(hào)(Synchronize Sequence Numbers)。
第二次握手:服務(wù)器收到syn包殊轴,必須確認(rèn)客戶的SYN(ack=j+1)衰倦,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包梳凛,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)耿币;ACK:確認(rèn)字符
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)韧拒,此包發(fā)送完畢淹接,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手叛溢。
TCP四次揮手——>
第一步塑悼,當(dāng)主機(jī)A的應(yīng)用程序通知TCP數(shù)據(jù)已經(jīng)發(fā)送完畢時(shí),TCP向主機(jī)B發(fā)送一個(gè)帶有FIN附加標(biāo)記的報(bào)文段(FIN表示英文finish)楷掉。
第二步厢蒜,主機(jī)B收到這個(gè)FIN報(bào)文段之后,并不立即用FIN報(bào)文段回復(fù)主機(jī)A,而是先向主機(jī)A發(fā)送一個(gè)確認(rèn)序號(hào)ACK斑鸦,同時(shí)通知自己相應(yīng)的應(yīng)用程序:對(duì)方要求關(guān)閉連接(先發(fā)送ACK的目的是為了防止在這段時(shí)間內(nèi)愕贡,對(duì)方重傳FIN報(bào)文段)。
第三步巷屿,主機(jī)B的應(yīng)用程序告訴TCP:我要徹底的關(guān)閉連接固以,TCP向主機(jī)A送一個(gè)FIN報(bào)文段。
第四步嘱巾,主機(jī)A收到這個(gè)FIN報(bào)文段后憨琳,向主機(jī)B發(fā)送一個(gè)ACK表示連接徹底釋放。
一旬昭、HTTP1.0與HTTP 1.1的主要區(qū)別
1. 長(zhǎng)連接
HTTP 1.0需要使用keep-alive參數(shù)來告知服務(wù)器端要建立一個(gè)長(zhǎng)連接篙螟,而HTTP1.1默認(rèn)支持長(zhǎng)連接。
HTTP是基于TCP/IP協(xié)議的问拘,創(chuàng)建一個(gè)TCP連接是需要經(jīng)過三次握手的,有一定的開銷遍略,如果每次通訊都要重新建立連接的話,對(duì)性能有影響场梆。因此最好能維持一個(gè)長(zhǎng)連接墅冷,可以用一個(gè)長(zhǎng)連接來發(fā)多個(gè)請(qǐng)求纯路。
2.節(jié)約帶寬
HTTP 1.1支持只發(fā)送header信息(不帶任何body信息)或油,如果服務(wù)器認(rèn)為客戶端有權(quán)限請(qǐng)求服務(wù)器,則返回100驰唬,否則返回401顶岸。客戶端如果接收到100叫编,才開始把請(qǐng)求body發(fā)送到服務(wù)器辖佣。這樣當(dāng)服務(wù)器返回401的時(shí)候,客戶端就可以不用發(fā)送請(qǐng)求body了搓逾,節(jié)約了帶寬卷谈。
另外HTTP還支持傳送內(nèi)容的一部分。這樣當(dāng)客戶端已經(jīng)有一部分的資源后霞篡,只需要跟服務(wù)器請(qǐng)求另外的部分資源即可世蔗。這是支持文件斷點(diǎn)續(xù)傳的基礎(chǔ)。
3.HOST域
現(xiàn)在可以用web server(例如tomat)朗兵,設(shè)置虛擬站點(diǎn)是非常常見的污淋,也即是說,web server上的多個(gè)虛擬站點(diǎn)可以共享同一個(gè)ip和端口余掖。HTTP1.0是沒有host域的寸爆,HTTP1.1才支持這個(gè)參數(shù)。
二、HTTP1.1與HTTP 2.0的主要區(qū)別
HTTP 2.0的出現(xiàn)赁豆,相比于HTTP 1.x,大幅度的提升了web性能仅醇。在與HTTP/1.1完全語(yǔ)義兼容的基礎(chǔ)上,進(jìn)一步減少了網(wǎng)絡(luò)延遲魔种。而對(duì)于前端開發(fā)人員來說着憨,無疑減少了在前端方面的優(yōu)化工作。
下面基于HTTP 2.0協(xié)議的幾個(gè)基本技術(shù)點(diǎn)來說明HTTP1.1與HTTP2.0的區(qū)別
1. 多路復(fù)用
允許同時(shí)通過單一的 HTTP/2 連接發(fā)起多重的請(qǐng)求-響應(yīng)消息务嫡。
眾所周知甲抖,在HTTP/1.1協(xié)議中,瀏覽器客戶端在同一時(shí)間針對(duì)同一域名的請(qǐng)求有一定數(shù)據(jù)限制心铃。超過限制數(shù)目的請(qǐng)求會(huì)被阻塞准谚。
HTTP2.0使用了多路復(fù)用的技術(shù),做到同一個(gè)連接并發(fā)處理多個(gè)請(qǐng)求去扣,而且并發(fā)請(qǐng)求的數(shù)量比HTTP1.1大了好幾個(gè)數(shù)量級(jí)柱衔。
當(dāng)然HTTP1.1也可以多建立幾個(gè)TCP連接,來支持處理更多并發(fā)的請(qǐng)求愉棱,但是創(chuàng)建TCP連接本身也是有開銷的唆铐。
TCP連接有一個(gè)預(yù)熱和保護(hù)的過程,先檢查數(shù)據(jù)是否傳送成功奔滑,一旦成功過艾岂,則慢慢加大傳輸速度。因此對(duì)應(yīng)瞬時(shí)并發(fā)的連接朋其,服務(wù)器的響應(yīng)就會(huì)變慢王浴。所以最好能使用一個(gè)建立好的連接,并且這個(gè)連接可以支持瞬時(shí)并發(fā)的請(qǐng)求梅猿。
在過去氓辣,HTTP性能優(yōu)化的關(guān)鍵并不在于高帶寬,而是低延遲袱蚓。
單連接多資源的方式钞啸,減少服務(wù)端的鏈接壓力,內(nèi)存占用更少,連接吞吐量更大
由于 TCP 連接的減少而使網(wǎng)絡(luò)擁塞狀況得以改善,同時(shí)慢啟動(dòng)時(shí)間的減少,使擁塞和丟包恢復(fù)速度更快
2. 二進(jìn)制分幀
在不改動(dòng)HTTP/1.x的語(yǔ)義喇潘、語(yǔ)法体斩、狀態(tài)嗎、URI以及首部字段……的情況下响蓉,HTTP/2是如何作做到“突破HTTP1.1的性能限制硕勿,改進(jìn)傳輸性能,實(shí)現(xiàn)低延遲和高吞吐量”的枫甲?
關(guān)鍵之一就是在應(yīng)用層(HTTP/2)和傳輸層(TCP or UDP)之間增加一個(gè)二進(jìn)制分幀層源武。
3. 首部壓縮
HTTP1.1不支持header數(shù)據(jù)的壓縮扼褪,HTTP2.0使用HPACK算法對(duì)header的數(shù)據(jù)進(jìn)行壓縮,這樣數(shù)據(jù)體積小了粱栖,在網(wǎng)絡(luò)上傳輸就會(huì)更快话浇。
4. 服務(wù)器推送
服務(wù)端推送是一種在客戶端請(qǐng)求之前發(fā)送數(shù)據(jù)的機(jī)制。
在HTTP/2中闹究,服務(wù)器可以對(duì)客戶端的一個(gè)請(qǐng)求發(fā)送多個(gè)響應(yīng)幔崖。
Server Push 讓HTTP1.x時(shí)代使用內(nèi)嵌資源的優(yōu)化手段變得沒有意義;
意思是說渣淤,當(dāng)我們對(duì)支持HTTP2.0的web server請(qǐng)求數(shù)據(jù)的時(shí)候赏寇,服務(wù)器會(huì)順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創(chuàng)建連接發(fā)送請(qǐng)求到服務(wù)器端獲取价认。這種方式非常合適加載靜態(tài)資源嗅定。
服務(wù)器推送可以緩存,并且在遵循同源的情況下用踩,不同頁(yè)面之間可以共享緩存渠退。
因此當(dāng)客戶端需要的數(shù)據(jù)已緩存時(shí),客戶端直接從本地加載這些資源就可以了脐彩,不用走網(wǎng)絡(luò)碎乃,速度自然是快很多的。
TCP頭結(jié)構(gòu):
1. TCP源端口(Source Port):
16位的源端口其中包含初始化通信的端口惠奸。源端口和源IP地址的作用是標(biāo)示報(bào)文的返回地址梅誓。
2. TCP目的端口(Destination port):
16位的目的端口域定義傳輸?shù)哪康摹_@個(gè)端口指明報(bào)文接收計(jì)算機(jī)上的應(yīng)用程序地址接口晨川。
3. TCP序列號(hào)(序列碼证九,Sequence Number):
32位的序列號(hào)由接收端計(jì)算機(jī)使用删豺,重新分段的報(bào)文成最初形式共虑。當(dāng)SYN出現(xiàn),序列碼實(shí)際上是初始序列碼(ISN)呀页,而第一個(gè)數(shù)據(jù)字節(jié)是ISN+1妈拌。這個(gè)序列號(hào)(序列碼)是可以補(bǔ)償傳輸中的 不一致。
4. TCP應(yīng)答號(hào)(Acknowledgment Number):
32位的序列號(hào)由接收端計(jì)算機(jī)使用蓬蝶,重組分段的報(bào)文成最初形式尘分。如果設(shè)置了ACK控制位,這個(gè)值表示一個(gè)準(zhǔn)備接收的包的序列碼丸氛。
5. 數(shù)據(jù)偏移量(HLEN):
4位包括TCP頭大小培愁,指示何處數(shù)據(jù)開始。
6.保留(Reserved):
6位值域缓窜,這些位必須是0定续。為了將來定義新的用途所保留谍咆。
7. 志(Code Bits):
6位標(biāo)志域。表示為:緊急標(biāo)志私股、有意義的應(yīng)答標(biāo)志摹察、推、重置連接標(biāo)志倡鲸、同步序列號(hào)標(biāo)志供嚎、完成發(fā)送數(shù)據(jù)標(biāo)志。按照順序排列是:URG峭状、ACK克滴、PSH、RST优床、SYN偿曙、FIN。
8. 窗口(Window):
16位羔巢,用來表示想收到的每個(gè)TCP數(shù)據(jù)段的大小望忆。
9. 校驗(yàn)位(Checksum):
16位TCP頭。源機(jī)器基于數(shù)據(jù)內(nèi)容計(jì)算一個(gè)數(shù)值竿秆,收信息機(jī)要與源機(jī)器數(shù)值結(jié)果完全一樣启摄,從而證明數(shù)據(jù)的有效性。
10. 優(yōu)先指針(緊急幽钢,Urgent Pointer):
16位歉备,指向后面是優(yōu)先數(shù)據(jù)的字節(jié),在URG標(biāo)志設(shè)置了時(shí)才有效匪燕。如果URG標(biāo)志沒有被設(shè)置蕾羊,緊急域作為填充。加快處理標(biāo)示為緊急的數(shù)據(jù)段帽驯。
11. 選項(xiàng)(Option):
長(zhǎng)度不定龟再,但長(zhǎng)度必須是一個(gè)字節(jié)。如果沒有選項(xiàng)就表示這一個(gè)字節(jié)的域等于0尼变。