下面我們從系統(tǒng)網(wǎng)絡(luò)的角度分析輸入www.baidu.com后的過(guò)程:
1、客戶端瀏覽器通過(guò)DNS解析到www.baidu.com的IP地址202.108.22.5狈醉,通過(guò)這個(gè)IP地址找到客戶端到服務(wù)器的路徑朽砰√簦客戶端瀏覽器發(fā)起一個(gè)HTTP會(huì)話到202.108.22.5播赁,然后通過(guò)TCP進(jìn)行封裝數(shù)據(jù)包,輸入到網(wǎng)絡(luò)層薪铜。
2众弓、在客戶端的傳輸層,把HTTP會(huì)話請(qǐng)求分成報(bào)文段隔箍,添加源和目的端口谓娃,如服務(wù)器使用80端口監(jiān)聽(tīng)客戶端的請(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)完成的工作瀑志,無(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ù)器的地址。
事件順序:
(1) 瀏覽器獲取輸入的域名www.baidu.com
(2) 瀏覽器向DNS請(qǐng)求解析www.baidu.com的IP地址
(3) 域名系統(tǒng)DNS解析出百度服務(wù)器的IP地址 (詳細(xì)介紹DNS)-通過(guò)網(wǎng)關(guān)出去常侦;發(fā)起TCP的3次握手
(4) 瀏覽器與該服務(wù)器建立TCP連接(默認(rèn)端口號(hào)80)
(5) 瀏覽器發(fā)出HTTP請(qǐng)求浇冰,請(qǐng)求百度首頁(yè)
(6) 服務(wù)器通過(guò)HTTP響應(yīng)把首頁(yè)文件發(fā)送給瀏覽器
(7) TCP連接釋放(四次揮手)
(8) 瀏覽器將首頁(yè)文件進(jìn)行解析,并將Web頁(yè)顯示給用戶聋亡。
簡(jiǎn)單理解: 域名解析DNS --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求肘习,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js坡倔、css漂佩、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶
事件順序(1)--->涉及到的協(xié)議:
(1) 應(yīng)用層:HTTP(WWW訪問(wèn)協(xié)議)脖含,DNS(域名解析服務(wù))
DNS解析域名為目的IP,通過(guò)IP找到服務(wù)器路徑仅仆,客戶端向服務(wù)器發(fā)起HTTP會(huì)話器赞,然后通過(guò)運(yùn)輸層TCP協(xié)議封裝數(shù)據(jù)包,在TCP協(xié)議基礎(chǔ)上進(jìn)行傳輸墓拜。
(2) 傳輸層:TCP(為HTTP提供可靠的數(shù)據(jù)傳輸)港柜,UDP(DNS使用UDP傳輸),HTTP會(huì)話會(huì)被分成報(bào)文段咳榜,添加源夏醉、目的端口;TCP協(xié)議進(jìn)行主要工作涌韩。
(3)網(wǎng)絡(luò)層:IP(IP數(shù)據(jù)數(shù)據(jù)包傳輸和路由選擇)畔柔,ICMP(提供網(wǎng)絡(luò)傳輸過(guò)程中的差錯(cuò)檢測(cè)),ARP(將本機(jī)的默認(rèn)網(wǎng)關(guān)IP地址映射成物理MAC地址)為數(shù)據(jù)包選擇路由臣樱,IP協(xié)議進(jìn)行主要工作靶擦,相鄰結(jié)點(diǎn)的可靠傳輸,ARP協(xié)議將IP地址轉(zhuǎn)成MAC地址雇毫。
1.URL是什么玄捕?
URL統(tǒng)一資源定位符,用于定位互聯(lián)網(wǎng)上的資源棚放。
統(tǒng)一資源定位符是對(duì)可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問(wèn)方法的一種簡(jiǎn)潔的表示枚粘,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址∑牵互聯(lián)網(wǎng)上的每個(gè)文件都有一個(gè)唯一的URL馍迄,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。
而https://www.baidu.com/正是這樣一個(gè)URL局骤,當(dāng)我們?cè)诘刂窓谥休斎?a target="_blank">https://www.baidu.com/并按下回車后攀圈,DNS服務(wù)器(域名解析系統(tǒng))會(huì)根據(jù)用戶提供的域名查找對(duì)應(yīng)的IP地址。
域名:以百度為例峦甩,baidu.com就是一個(gè)域名赘来,大多數(shù)情況下,我們輸入網(wǎng)址都是輸入它的域名穴店,相比輸入IP地址或者一整串URL來(lái)說(shuō)撕捍,輸入域名會(huì)更加方便更容易記憶。
二泣洞、過(guò)程中使用到的協(xié)議
該過(guò)程中使用到了ARP,IP,SOFP
ARP(地址解析協(xié)議):他主要解決的是同一個(gè)局域網(wǎng)內(nèi)主機(jī)或路由器IP地址和MAC地址之間的映射問(wèn)題忧风。
工作過(guò)程:當(dāng)源主機(jī)要發(fā)送數(shù)據(jù)的時(shí)候,他會(huì)查看自己的ARP高速緩存中是否有目的主機(jī)IP地址對(duì)應(yīng)的MAC地址球凰,如果與狮腿,則直接發(fā)送腿宰,如果沒(méi)有,他就會(huì)向本網(wǎng)段所有主機(jī)發(fā)送ARP請(qǐng)求分組缘厢,接到請(qǐng)求的主機(jī)查看目的IP與自己的IP是否相等吃度,如果不等就忽略,如果相等贴硫,就把源主機(jī)的IP和MAC寫入自己的ARP高速緩存椿每,如果之前有就覆蓋掉,然后把自己的MAC寫入ARP相應(yīng)包英遭,源主機(jī)接到ARP響應(yīng)包后把目的主機(jī)的IP和MAC地址寫入ARP高速緩存间护,并且利用此信息發(fā)送數(shù)據(jù)。
路由選擇協(xié)議
1.內(nèi)部網(wǎng)關(guān)協(xié)議
1)RIP協(xié)議
RIP基于UDP的應(yīng)用層協(xié)議挖诸,他認(rèn)為一個(gè)好的路由是他通過(guò)的路由器少汁尺,RIP允許一條路徑最多可以包含15個(gè)路由,16個(gè)即為不可達(dá)了多律。
工作過(guò)程:假設(shè)路由器R0向R1發(fā)送一個(gè)報(bào)文段
首先修改R0發(fā)來(lái)的RIP報(bào)文中所有的項(xiàng)目痴突,把嚇一跳字段的地址改為R0,把所有距離字段值加1狼荞,
對(duì)于修改后的RIP報(bào)文的每一項(xiàng)進(jìn)行如下步驟辽装,步驟一、首先看原來(lái)的路由表中是否有目的網(wǎng)絡(luò)N粘秆,如果沒(méi)有直接加入到路由表中如迟,如果有進(jìn)行步驟2 步驟二收毫、然后看嚇一跳攻走,如果嚇一跳的地址是R0則用新的項(xiàng)目替換原來(lái)的項(xiàng)目,如果嚇一跳不同則進(jìn)行步驟三步驟三此再、對(duì)比距離昔搂,如果距離小于源路由器的項(xiàng)目,那么更新输拇,否則什么都不做摘符。
首先將R0發(fā)來(lái)的路由更新信息的距離都+1,下一跳都改為R0
Net1在源路由表中沒(méi)有所以直接寫入策吠,Net2中嚇一跳相同逛裤,直接覆蓋原路由表中的Net2那一行,Net3的嚇一跳不同猴抹,所以選擇路徑最小的带族。
2)OSPF(最短路徑優(yōu)先)
OSPF是網(wǎng)絡(luò)層協(xié)議基于IP,當(dāng)路由的鏈路狀態(tài)發(fā)生變化時(shí)蟀给,他會(huì)使用洪泛法向本自治系統(tǒng)中所有路由發(fā)送自己的的鏈路狀態(tài)(鏈路狀態(tài)就是自己和那些路由相鄰)
2.外部網(wǎng)關(guān)協(xié)議
2)BGP
BGP是不同自治系統(tǒng)路由器之間交換路由信息的協(xié)議蝙砌,他只是力求尋找能達(dá)到目的網(wǎng)絡(luò)的比較好的協(xié)議阳堕,而并非最佳路由。
BGP發(fā)言人:每一個(gè)自治系統(tǒng)的管理員都需要至少有一個(gè)路由器作為BGP發(fā)言人择克,BGP發(fā)言人一般是邊界路由器恬总,當(dāng)然也有不是邊界路由器的情況。
BGP交換路由信息:BGP發(fā)言人如果想和別的自治系統(tǒng)的BGP發(fā)言人交換信息(到達(dá)某個(gè)網(wǎng)絡(luò)所要經(jīng)歷的一系列AS)肚邢,他需要先建立起TCP連接壹堰,連接建立成功后在此鏈接上交換BGP報(bào)文,建立BGP會(huì)話骡湖,使用TCP是因?yàn)榭梢蕴峁┛煽康姆?wù)缀旁,也簡(jiǎn)化了路由選擇協(xié)議。
在應(yīng)用層勺鸦,瀏覽器會(huì)給web服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求并巍;
請(qǐng)求頭為:GET http://www.baidu.com/HTTP/1.1
在傳輸層,(上層的傳輸數(shù)據(jù)流分段)HTTP數(shù)據(jù)包會(huì)嵌入在TCP報(bào)文段中换途;
TCP報(bào)文段需要設(shè)置端口懊渡,接收方(百度)的HTTP端口默認(rèn)是80,本機(jī)的端口是一個(gè)1024-65535之間的隨機(jī)整數(shù)军拟,這里假設(shè)為1025剃执,這樣TCP報(bào)文段由TCP首部(包含發(fā)送方和接收方的端口信息)+ HTTP數(shù)據(jù)包組成。
在網(wǎng)絡(luò)層中懈息,TCP報(bào)文段再嵌入IP數(shù)據(jù)包中肾档;
IP數(shù)據(jù)包需要知道雙方的IP地址,本機(jī)IP地址假定為192.168.1.5辫继,接受方IP地址為220.181.111.147(百度)怒见,這樣IP數(shù)據(jù)包由IP頭部(IP地址信息)+TCP報(bào)文段組成。
在網(wǎng)絡(luò)接口層姑宽,IP數(shù)據(jù)包嵌入到數(shù)據(jù)幀(以太網(wǎng)數(shù)據(jù)包)中在網(wǎng)絡(luò)上傳送遣耍;
數(shù)據(jù)幀中包含源MAC地址和目的MAC地址(通過(guò)ARP地址解析協(xié)議得到的)。這樣數(shù)據(jù)幀由頭部(MAC地址)+IP數(shù)據(jù)包組成炮车。
數(shù)據(jù)包經(jīng)過(guò)多個(gè)網(wǎng)關(guān)的轉(zhuǎn)發(fā)到達(dá)百度服務(wù)器舵变,請(qǐng)求對(duì)應(yīng)端口的服務(wù);
服務(wù)接收到發(fā)送過(guò)來(lái)的以太網(wǎng)數(shù)據(jù)包開(kāi)始解析請(qǐng)求信息瘦穆,從以太網(wǎng)數(shù)據(jù)包中提取IP數(shù)據(jù)包—>TCP報(bào)文段—>HTTP數(shù)據(jù)包纪隙,并組裝為有效數(shù)據(jù)交與對(duì)應(yīng)線程池中分配的線程進(jìn)行處理,在這個(gè)過(guò)程中扛或,生成相應(yīng)request绵咱、response對(duì)象。
請(qǐng)求處理完成之后告喊,服務(wù)器發(fā)回一個(gè)HTTP響應(yīng)麸拄;
事件順序(2)--->點(diǎn)擊網(wǎng)址后派昧,<應(yīng)用層>的DNS協(xié)議會(huì)將網(wǎng)址解析為IP地址;
一拢切、DNS查找過(guò)程(由域名→IP 地址):
- 瀏覽器會(huì)檢查緩存中有沒(méi)有這個(gè)域名對(duì)應(yīng)的解析過(guò)的IP地址蒂萎,如果緩存中有,這個(gè)解析過(guò)程就將結(jié)束淮椰。
- 如果用戶的瀏覽器緩存中沒(méi)有五慈,瀏覽器會(huì)查找操作系統(tǒng)緩存(hosts文件)中是否有這個(gè)域名對(duì)應(yīng)的DNS解析結(jié)果。
- 若還沒(méi)有主穗,此時(shí)會(huì)發(fā)送一個(gè)數(shù)據(jù)包給DNS服務(wù)器(操作系統(tǒng)向根域名服務(wù)器發(fā)起請(qǐng)求得到頂級(jí)域名服務(wù)器的IP泻拦,然后根域名服務(wù)器向頂級(jí)域名服務(wù)器發(fā)起請(qǐng)求得到權(quán)限域名服務(wù)器的IP,頂級(jí)域名服務(wù)器再向權(quán)限域名服務(wù)器發(fā)起請(qǐng)求得到IP,本地域名服務(wù)器返回給操作系統(tǒng)IP,同時(shí)將IP緩存起來(lái)艘绍,操作系統(tǒng)將IP返回給瀏覽器,同時(shí)將IP緩存起來(lái))架曹,DNS服務(wù)器找到后將解析所得IP地址返回給用戶。
簡(jiǎn)單理解: 尋找 IP 地址的過(guò)程依次經(jīng)過(guò)了瀏覽器緩存闹瞧、系統(tǒng)緩存绑雄、hosts文件、路由器緩存奥邮、 遞歸搜索根域名服務(wù)器万牺。
事件順序(3)--->解釋TCP的三次握手。
1) Client首先發(fā)送一個(gè)連接試探洽腺,ACK=0 表示確認(rèn)號(hào)無(wú)效脚粟,SYN = 1 表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文,同 時(shí)表示這個(gè)數(shù)據(jù)報(bào)不能攜帶數(shù)據(jù)已脓,seq = x 表示Client自己的初始序號(hào)(seq = 0 就代表這是第0號(hào)包)珊楼,這時(shí)候 Client進(jìn)入syn_sent狀態(tài)通殃,表示客戶端等待服務(wù)器的回復(fù)
2) Server監(jiān)聽(tīng)到連接請(qǐng)求報(bào)文后度液,如同意建立連接,則向Client發(fā)送確認(rèn)画舌。TCP報(bào)文首部中的SYN 和 ACK都置1 堕担,ack = x + 1表示期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)序號(hào)是x+1,同時(shí)表明x為止的所有數(shù)據(jù)都已正確收 到(ack=1其實(shí)是ack=0+1,也就是期望客戶端的第1個(gè)包)曲聂,seq = y 表示Server 自己的初始序號(hào)(seq=0就代表這 是服務(wù)器這邊發(fā)出的第0號(hào)包)霹购。這時(shí)服務(wù)器進(jìn)入syn_rcvd,表示服務(wù)器已經(jīng)收到Client的連接請(qǐng)求朋腋,等待client的 確認(rèn)齐疙。
3) Client收到確認(rèn)后還需再次發(fā)送確認(rèn)膜楷,同時(shí)攜帶要發(fā)送給Server的數(shù)據(jù)。ACK 置1 表示確認(rèn)號(hào)ack= y + 1 有效 (代表期望收到服務(wù)器的第1個(gè)包)贞奋,Client自己的序號(hào)seq= x + 1(表示這就是我的第1個(gè)包赌厅,相對(duì)于第0個(gè)包來(lái)說(shuō) 的),一旦收到Client的確認(rèn)之后轿塔,這個(gè)TCP連接就進(jìn)入Established狀態(tài)特愿,就可以發(fā)起http請(qǐng)求了。
事件順序(4)--->建立TCP連接
費(fèi)了一頓周折終于拿到服務(wù)器IP了勾缭,下一步自然就是鏈接到該服務(wù)器揍障。對(duì)于客戶端與服務(wù)器的TCP鏈接,必然要說(shuō)的就是『三次握手』俩由。
客戶端發(fā)送一個(gè)帶有SYN標(biāo)志的數(shù)據(jù)包給服務(wù)端毒嫡,服務(wù)端收到后,回傳一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息幻梯,最后客戶端再回傳一個(gè)帶ACK標(biāo)志的數(shù)據(jù)包审胚,代表握手結(jié)束,連接成功礼旅。
上圖也可以這么理解:
客戶端:“你好膳叨,在家不,有你快遞痘系》谱欤”
服務(wù)端:“在的,送來(lái)就行汰翠×淦海”
客戶端:“好嘞「椿剑”
事件順序(5)--->發(fā)送HTTP請(qǐng)求
與服務(wù)器建立了連接后健田,就可以向服務(wù)器發(fā)起請(qǐng)求了。這里我們先看下請(qǐng)求報(bào)文的結(jié)構(gòu)(如下圖):
在瀏覽器中查看報(bào)文首部(以google瀏覽器為例):
請(qǐng)求行包括請(qǐng)求方法佛纫、URI妓局、HTTP版本。首部字段傳遞重要信息呈宇,包括請(qǐng)求首部字段好爬、通用首部字段和實(shí)體首部字段。我們可以從報(bào)文中看到發(fā)出的請(qǐng)求的具體信息甥啄。具體每個(gè)首部字段的作用存炮,這里不做過(guò)多闡述。
事件順序(6)--->服務(wù)器處理請(qǐng)求
服務(wù)器端收到請(qǐng)求后的由web服務(wù)器(準(zhǔn)確說(shuō)應(yīng)該是http服務(wù)器)處理請(qǐng)求,諸如Apache穆桂、Ngnix宫盔、IIS等。web服務(wù)器解析用戶請(qǐng)求享完,知道了需要調(diào)度哪些資源文件飘言,再通過(guò)相應(yīng)的這些資源文件處理用戶請(qǐng)求和參數(shù),并調(diào)用數(shù)據(jù)庫(kù)信息驼侠,最后將結(jié)果通過(guò)web服務(wù)器返回給瀏覽器客戶端姿鸿。
事件順序(6)--->返回響應(yīng)結(jié)果
在HTTP里,有請(qǐng)求就會(huì)有響應(yīng)倒源,哪怕是錯(cuò)誤信息苛预。這里我們同樣看下響應(yīng)報(bào)文的組成結(jié)構(gòu):
在響應(yīng)結(jié)果中都會(huì)有個(gè)一個(gè)HTTP狀態(tài)碼,比如我們熟知的200笋熬、301热某、404、500等胳螟。通過(guò)這個(gè)狀態(tài)碼我們可以知道服務(wù)器端的處理是否正常昔馋,并能了解具體的錯(cuò)誤。
狀態(tài)碼由3位數(shù)字和原因短語(yǔ)組成糖耸。根據(jù)首位數(shù)字秘遏,狀態(tài)碼可以分為五類:
事件順序(7)--->關(guān)閉TCP連接
為了避免服務(wù)器與客戶端雙方的資源占用和損耗,當(dāng)雙方?jīng)]有請(qǐng)求或響應(yīng)傳遞時(shí)嘉竟,任意一方都可以發(fā)起關(guān)閉請(qǐng)求邦危。與創(chuàng)建TCP連接的3次握手類似,關(guān)閉TCP連接舍扰,需要4次握手倦蚪。
上圖可以這么理解:
客戶端:“兄弟,我這邊沒(méi)數(shù)據(jù)要傳了边苹,咱關(guān)閉連接吧陵且。”
服務(wù)端:“收到个束,我看看我這邊有木有數(shù)據(jù)了慕购。”
服務(wù)端:“兄弟播急,我這邊也沒(méi)數(shù)據(jù)要傳你了脓钾,咱可以關(guān)閉連接了∽”
客戶端:“好嘞〔茫”
事件順序(8)--->瀏覽器解析HTML
準(zhǔn)確地說(shuō)捶枢,瀏覽器需要加載解析的不僅僅是HTML握截,還包括CSS、JS烂叔。以及還要加載圖片谨胞、視頻等其他媒體資源。
瀏覽器通過(guò)解析HTML蒜鸡,生成DOM樹胯努,解析CSS,生成CSS規(guī)則樹逢防,然后通過(guò)DOM樹和CSS規(guī)則樹生成渲染樹叶沛。渲染樹與DOM樹不同,渲染樹中并沒(méi)有head忘朝、display為none等不必顯示的節(jié)點(diǎn)灰署。
要注意的是,瀏覽器的解析過(guò)程并非是串連進(jìn)行的局嘁,比如在解析CSS的同時(shí)溉箕,可以繼續(xù)加載解析HTML,但在解析執(zhí)行JS腳本時(shí)悦昵,會(huì)停止解析后續(xù)HTML肴茄,這就會(huì)出現(xiàn)阻塞問(wèn)題,關(guān)于JS阻塞相關(guān)問(wèn)題但指,這里不過(guò)多闡述独郎。
事件順序(8)--->瀏覽器布局渲染
根據(jù)渲染樹布局,計(jì)算CSS樣式枚赡,即每個(gè)節(jié)點(diǎn)在頁(yè)面中的大小和位置等幾何信息氓癌。HTML默認(rèn)是流式布局的,CSS和js會(huì)打破這種布局贫橙,改變DOM的外觀樣式以及大小和位置贪婉。