計(jì)算機(jī)網(wǎng)絡(luò)?https://www.runoob.com/w3cnote/summary-of-network.html#_label11
網(wǎng)絡(luò)協(xié)議是為計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)交換而建立的規(guī)則、標(biāo)準(zhǔn)或者說(shuō)是約定的集合。
1.?計(jì)算機(jī)網(wǎng)絡(luò) 七層模型
網(wǎng)絡(luò)標(biāo)準(zhǔn)層次模型
自頂向下:應(yīng)用層财骨、表示層念搬、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層罩抗。
應(yīng)用層:處理網(wǎng)絡(luò)應(yīng)用。
表示層:數(shù)據(jù)表示灿椅。
會(huì)話層:互連主機(jī)通信套蒂。
傳輸層:端到端連接钞支。舉例:TCP、UDP
網(wǎng)絡(luò)層:尋址和最短路徑操刀。舉例:IP
數(shù)據(jù)鏈路層:接入介質(zhì)烁挟。
物理層:二進(jìn)制傳輸。
HTTP協(xié)議
超文本傳輸協(xié)議(HTTP骨坑,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議撼嗓。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。 HTTP?協(xié)議包括哪些請(qǐng)求欢唾?
GET:請(qǐng)求讀取由URL所標(biāo)志的信息且警。
POST:給服務(wù)器添加信息(如注釋)。
PUT:在給定的URL下存儲(chǔ)一個(gè)文檔礁遣。
DELETE:刪除給定的URL所標(biāo)志的資源斑芜。
HTTP?中,?POST?與?GET?的區(qū)別
1)Get是從服務(wù)器上獲取數(shù)據(jù)亡脸,Post是向服務(wù)器傳送數(shù)據(jù)押搪。
2)Get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的Action屬性所指向的URL中树酪,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng)浅碾,在URL中可以看到。
3)Get傳送的數(shù)據(jù)量小续语,不能大于2KB垂谢;Post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制疮茄。
4)根據(jù)HTTP規(guī)范滥朱,GET用于信息獲取,而且應(yīng)該是安全的和冪等的力试。
I. 所謂安全的意味著該操作用于獲取信息而非修改信息徙邻。換句話說(shuō),GET請(qǐng)求一般不應(yīng)產(chǎn)生副作用畸裳。就是說(shuō)缰犁,它僅僅是獲取資源信息,就像數(shù)據(jù)庫(kù)查詢一樣怖糊,不會(huì)修改帅容,增加數(shù)據(jù),不會(huì)影響資源的狀態(tài)伍伤。
II.冪等的意味著對(duì)同一URL的多個(gè)請(qǐng)求應(yīng)該返回同樣的結(jié)果并徘。
TCP協(xié)議
TCP三次握手
PS:TCP協(xié)議中,主動(dòng)發(fā)起請(qǐng)求的一端稱為『客戶端』扰魂,被動(dòng)連接的一端稱為『服務(wù)端』麦乞。不管是客戶端還是服務(wù)端蕴茴,TCP連接建立完后都能發(fā)送和接收數(shù)據(jù)。
起初路幸,服務(wù)器和客戶端都為CLOSED狀態(tài)荐开。在通信開始前,雙方都得創(chuàng)建各自的傳輸控制塊(TCB)简肴。 服務(wù)器創(chuàng)建完TCB后便進(jìn)入LISTEN狀態(tài)晃听,此時(shí)準(zhǔn)備接收客戶端發(fā)來(lái)的連接請(qǐng)求。
第一次握手
客戶端向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文段砰识。該報(bào)文段的頭部中SYN=1能扒,ACK=0,seq=x辫狼。請(qǐng)求發(fā)送后初斑,客戶端便進(jìn)入SYN-SENT狀態(tài)。
PS1:SYN=1膨处,ACK=0表示該報(bào)文段為連接請(qǐng)求報(bào)文见秤。
PS2:x為本次TCP通信的字節(jié)流的初始序號(hào)。
TCP規(guī)定:SYN=1的報(bào)文段不能有數(shù)據(jù)部分真椿,但要消耗掉一個(gè)序號(hào)鹃答。
第二次握手
服務(wù)端收到連接請(qǐng)求報(bào)文段后,如果同意連接突硝,則會(huì)發(fā)送一個(gè)應(yīng)答:SYN=1测摔,ACK=1,seq=y解恰,ack=x+1锋八。 該應(yīng)答發(fā)送完成后便進(jìn)入SYN-RCVD狀態(tài)。
PS1:SYN=1护盈,ACK=1表示該報(bào)文段為連接同意的應(yīng)答報(bào)文挟纱。
PS2:seq=y表示服務(wù)端作為發(fā)送者時(shí),發(fā)送字節(jié)流的初始序號(hào)腐宋。
PS3:ack=x+1表示服務(wù)端希望下一個(gè)數(shù)據(jù)報(bào)發(fā)送序號(hào)從x+1開始的字節(jié)紊服。
第三次握手
當(dāng)客戶端收到連接同意的應(yīng)答后,還要向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文段脏款,表示:服務(wù)端發(fā)來(lái)的連接同意應(yīng)答已經(jīng)成功收到围苫。 該報(bào)文段的頭部為:ACK=1,seq=x+1撤师,ack=y+1剂府。 客戶端發(fā)完這個(gè)報(bào)文段后便進(jìn)入ESTABLISHED狀態(tài),服務(wù)端收到這個(gè)應(yīng)答后也進(jìn)入ESTABLISHED狀態(tài)剃盾,此時(shí)連接的建立完成腺占!
為什么連接建立需要三次握手淤袜,而不是兩次握手?
防止失效的連接請(qǐng)求報(bào)文段被服務(wù)端接收衰伯,從而產(chǎn)生錯(cuò)誤铡羡。
PS:失效的連接請(qǐng)求:若客戶端向服務(wù)端發(fā)送的連接請(qǐng)求丟失,客戶端等待應(yīng)答超時(shí)后就會(huì)再次發(fā)送連接請(qǐng)求意鲸,此時(shí)烦周,上一個(gè)連接請(qǐng)求就是『失效的』。
若建立連接只需兩次握手怎顾,客戶端并沒(méi)有太大的變化读慎,仍然需要獲得服務(wù)端的應(yīng)答后才進(jìn)入ESTABLISHED狀態(tài),而服務(wù)端在收到連接請(qǐng)求后就進(jìn)入ESTABLISHED狀態(tài)槐雾。此時(shí)如果網(wǎng)絡(luò)擁塞夭委,客戶端發(fā)送的連接請(qǐng)求遲遲到不了服務(wù)端,客戶端便超時(shí)重發(fā)請(qǐng)求募强,如果服務(wù)端正確接收并確認(rèn)應(yīng)答株灸,雙方便開始通信,通信結(jié)束后釋放連接擎值。此時(shí)慌烧,如果那個(gè)失效的連接請(qǐng)求抵達(dá)了服務(wù)端,由于只有兩次握手幅恋,服務(wù)端收到請(qǐng)求就會(huì)進(jìn)入ESTABLISHED狀態(tài)杏死,等待發(fā)送數(shù)據(jù)或主動(dòng)發(fā)送數(shù)據(jù)泵肄。但此時(shí)的客戶端早已進(jìn)入CLOSED狀態(tài)捆交,服務(wù)端將會(huì)一直等待下去,這樣浪費(fèi)服務(wù)端連接資源腐巢。
TCP四次揮手
TCP連接的釋放一共需要四步品追,因此稱為『四次揮手』。 我們知道冯丙,TCP連接是雙向的肉瓦,因此在四次揮手中,前兩次揮手用于斷開一個(gè)方向的連接胃惜,后兩次揮手用于斷開另一方向的連接泞莉。
第一次揮手
若A認(rèn)為數(shù)據(jù)發(fā)送完成,則它需要向B發(fā)送連接釋放請(qǐng)求船殉。該請(qǐng)求只有報(bào)文頭鲫趁,頭中攜帶的主要參數(shù)為: FIN=1,seq=u利虫。此時(shí)挨厚,A將進(jìn)入FIN-WAIT-1狀態(tài)堡僻。
PS1:FIN=1表示該報(bào)文段是一個(gè)連接釋放請(qǐng)求。
PS2:seq=u疫剃,u-1是A向B發(fā)送的最后一個(gè)字節(jié)的序號(hào)钉疫。
第二次揮手
B收到連接釋放請(qǐng)求后,會(huì)通知相應(yīng)的應(yīng)用程序巢价,告訴它A向B這個(gè)方向的連接已經(jīng)釋放牲阁。此時(shí)B進(jìn)入CLOSE-WAIT狀態(tài),并向A發(fā)送連接釋放的應(yīng)答壤躲,其報(bào)文頭包含: ACK=1咨油,seq=v,ack=u+1柒爵。
PS1:ACK=1:除TCP連接請(qǐng)求報(bào)文段以外役电,TCP通信過(guò)程中所有數(shù)據(jù)報(bào)的ACK都為1,表示應(yīng)答棉胀。
PS2:seq=v法瑟,v-1是B向A發(fā)送的最后一個(gè)字節(jié)的序號(hào)。
PS3:ack=u+1表示希望收到從第u+1個(gè)字節(jié)開始的報(bào)文段唁奢,并且已經(jīng)成功接收了前u個(gè)字節(jié)霎挟。
A收到該應(yīng)答,進(jìn)入FIN-WAIT-2狀態(tài)麻掸,等待B發(fā)送連接釋放請(qǐng)求酥夭。
第二次揮手完成后,A到B方向的連接已經(jīng)釋放脊奋,B不會(huì)再接收數(shù)據(jù)熬北,A也不會(huì)再發(fā)送數(shù)據(jù)。但B到A方向的連接仍然存在诚隙,B可以繼續(xù)向A發(fā)送數(shù)據(jù)讶隐。
第三次揮手
當(dāng)B向A發(fā)完所有數(shù)據(jù)后,向A發(fā)送連接釋放請(qǐng)求久又,請(qǐng)求頭:FIN=1巫延,ACK=1,seq=w地消,ack=u+1炉峰。B便進(jìn)入LAST-ACK狀態(tài)。
第四次揮手
A收到釋放請(qǐng)求后脉执,向B發(fā)送確認(rèn)應(yīng)答疼阔,此時(shí)A進(jìn)入TIME-WAIT狀態(tài)。該狀態(tài)會(huì)持續(xù)2MSL時(shí)間适瓦,若該時(shí)間段內(nèi)沒(méi)有B的重發(fā)請(qǐng)求的話竿开,就進(jìn)入CLOSED狀態(tài)谱仪,撤銷TCB。當(dāng)B收到確認(rèn)應(yīng)答后否彩,也便進(jìn)入CLOSED狀態(tài)疯攒,撤銷TCB。
為什么A要先進(jìn)入TIME-WAIT狀態(tài)列荔,等待2MSL時(shí)間后才進(jìn)入CLOSED狀態(tài)敬尺?
為了保證B能收到A的確認(rèn)應(yīng)答。 若A發(fā)完確認(rèn)應(yīng)答后直接進(jìn)入CLOSED狀態(tài)贴浙,那么如果該應(yīng)答丟失砂吞,B等待超時(shí)后就會(huì)重新發(fā)送連接釋放請(qǐng)求,但此時(shí)A已經(jīng)關(guān)閉了崎溃,不會(huì)作出任何響應(yīng)蜻直,因此B永遠(yuǎn)無(wú)法正常關(guān)閉。
在瀏覽器中輸入?http://www.baidu.com/?后執(zhí)行的全部過(guò)程袁串。(一次完整的http請(qǐng)求過(guò)程)
整體流程:
1. DNS域名解析
2.?建立TCP連接
3.?發(fā)送HTTP請(qǐng)求
4.?服務(wù)器處理請(qǐng)求
5.?返回響應(yīng)結(jié)果
6.?關(guān)閉TCP連接
7.?瀏覽器解析HTML
8.?瀏覽器布局渲染
使用的協(xié)議:
DNS概而、TCP、IP囱修、OSPF(IP數(shù)據(jù)包在路由器中赎瑰,路由選擇協(xié)議)、ARP破镰、HTTP
詳細(xì):
1.DNS域名解析
在瀏覽器輸入網(wǎng)址餐曼,其實(shí)就是要向服務(wù)器請(qǐng)求我們想要的頁(yè)面內(nèi)容,所以瀏覽器首先要確認(rèn)的是域名所對(duì)應(yīng)的服務(wù)器在哪里鲜漩。
將域名解析成對(duì)應(yīng)的服務(wù)器IP地址這項(xiàng)工作源譬,是由DNS服務(wù)器來(lái)完成的。
客戶端收到域名地址后宇整,首先去找本地的hosts文件瓶佳,檢查在該文件中是否有相應(yīng)的域名芋膘、IP對(duì)應(yīng)關(guān)系鳞青,如果有,則向其IP地址發(fā)送請(qǐng)求为朋,如果沒(méi)有臂拓,再去找DNS服務(wù)器。
2.建立TCP連接
三次握手:請(qǐng)求連接(SYN數(shù)據(jù)包)习寸,確認(rèn)信息(SYN/ACK數(shù)據(jù)包)胶惰,握手結(jié)束(ACK數(shù)據(jù)包)
3.發(fā)起http請(qǐng)求
與服務(wù)器建立了連接后,就可以向服務(wù)器發(fā)起請(qǐng)求了霞溪。
4.服務(wù)器處理請(qǐng)求
服務(wù)器端收到請(qǐng)求后的由web服務(wù)器(準(zhǔn)確說(shuō)應(yīng)該是http服務(wù)器)處理請(qǐng)求孵滞。
web服務(wù)器解析用戶請(qǐng)求中捆,知道了需要調(diào)度哪些資源文件,再通過(guò)相應(yīng)的這些資源文件處理用戶請(qǐng)求和參數(shù)坊饶,并調(diào)用數(shù)據(jù)庫(kù)信息泄伪,最后將結(jié)果通過(guò)web服務(wù)器返回給瀏覽器客戶端。
5.返回響應(yīng)結(jié)果
在http里匿级,有請(qǐng)求就會(huì)有響應(yīng)蟋滴,哪怕是錯(cuò)誤信息。
在響應(yīng)結(jié)果中都會(huì)有個(gè)一個(gè)http狀態(tài)碼痘绎,如200津函、301、404孤页、500等尔苦。通過(guò)這個(gè)狀態(tài)碼可以知道服務(wù)器端的處理是否正常,并能了解具體的錯(cuò)誤行施。
6.關(guān)閉TCP連接
為了避免服務(wù)器與客戶端雙方的資源占用和損耗蕉堰,當(dāng)雙方?jīng)]有請(qǐng)求或響應(yīng)傳遞時(shí),任意一方都可以發(fā)起關(guān)閉請(qǐng)求悲龟。四次揮手屋讶。
7.瀏覽器解析HTML
瀏覽器需要加載解析的不僅僅是HTML,還包括CSS须教、JS皿渗。以及還要加載圖片、視頻等其他媒體資源轻腺。
瀏覽器通過(guò)解析HTML乐疆,生成DOM樹,解析CSS贬养,生成CSS規(guī)則樹挤土,然后通過(guò)DOM樹和CSS規(guī)則樹生成渲染樹。
渲染樹與DOM樹不同误算,渲染樹中并沒(méi)有head仰美、display為none等不必顯示的節(jié)點(diǎn)。
8.瀏覽器布局渲染
根據(jù)渲染樹布局儿礼,計(jì)算CSS樣式咖杂,即每個(gè)節(jié)點(diǎn)在頁(yè)面中的大小和位置等幾何信息。
HTML默認(rèn)是流式布局的蚊夫,CSS和js會(huì)打破這種布局诉字,改變DOM的外觀樣式以及大小和位置。
現(xiàn)在假設(shè)如果我們?cè)诳蛻舳耍蛻舳耍g覽器中輸入 http://www.baidu.com, 而 baidu.com 為要訪問(wèn)的服務(wù)器(服務(wù)器)壤圃,下面詳細(xì)分析客戶端為了訪問(wèn)服務(wù)器而執(zhí)行的一系列關(guān)于協(xié)議的操作:
1)客戶端瀏覽器通過(guò)DNS解析到www.baidu.com的IP地址220.181.27.48陵霉,通過(guò)這個(gè)IP地址找到客戶端到服務(wù)器的路徑∥樯客戶端瀏覽器發(fā)起一個(gè)HTTP會(huì)話到220.161.27.48撩匕,然后通過(guò)TCP進(jìn)行封裝數(shù)據(jù)包,輸入到網(wǎng)絡(luò)層墨叛。
2)在客戶端的傳輸層止毕,把HTTP會(huì)話請(qǐng)求分成報(bào)文段,添加源和目的端口漠趁,如服務(wù)器使用80端口監(jiān)聽客戶端的請(qǐng)求扁凛,客戶端由系統(tǒng)隨機(jī)選擇一個(gè)端口如5000,與服務(wù)器進(jìn)行交換闯传,服務(wù)器把相應(yīng)的請(qǐng)求返回給客戶端的5000端口谨朝。然后使用IP層的IP地址查找目的端。
3)客戶端的網(wǎng)絡(luò)層不用關(guān)系應(yīng)用層或者傳輸層的東西甥绿,主要做的是通過(guò)查找路由表確定如何到達(dá)服務(wù)器字币,期間可能經(jīng)過(guò)多個(gè)路由器,這些都是由路由器來(lái)完成的工作共缕,不作過(guò)多的描述洗出,無(wú)非就是通過(guò)查找路由表決定通過(guò)那個(gè)路徑到達(dá)服務(wù)器。
4)客戶端的鏈路層图谷,包通過(guò)鏈路層發(fā)送到路由器翩活,通過(guò)鄰居協(xié)議查找給定IP地址的MAC地址,然后發(fā)送ARP請(qǐng)求查找目的地址便贵,如果得到回應(yīng)后就可以使用ARP的請(qǐng)求應(yīng)答交換的IP數(shù)據(jù)包現(xiàn)在就可以傳輸了菠镇,然后發(fā)送IP數(shù)據(jù)包到達(dá)服務(wù)器的地址。