HTTP访问一个网站的过程详解
訪問(wèn)一個(gè)網(wǎng)站的過(guò)程詳解
例如訪問(wèn):http://www.baidu.com
HTTP請(qǐng)求的準(zhǔn)備
瀏覽器會(huì)將www.baidu.com這個(gè)域名發(fā)送給DNS服務(wù)器,讓它解析成IP地址。由于HTTP是基于TCP協(xié)議的,先建立TCP連接,在HTTP 1.1的協(xié)議里面,默認(rèn)開(kāi)啟了Keep-Alive,這樣建立的TCP連接,就可以在多次請(qǐng)求中復(fù)用。
HTTP請(qǐng)求的發(fā)送
建立TCP連接以后,通過(guò)stream二進(jìn)制流的方式傳給對(duì)方,到了TCP層,會(huì)將二進(jìn)制流變成一個(gè)報(bào)文段發(fā)送給服務(wù)器。
在發(fā)送每個(gè)報(bào)文段的時(shí)候,都需要對(duì)方有一個(gè)回應(yīng)ACK,來(lái)保證報(bào)文可靠地到達(dá)了對(duì)方。如果沒(méi)有回應(yīng),那么TCP就會(huì)重新傳輸,直到可以到達(dá)。有時(shí)候同一個(gè)包可能被傳輸好多次,但這對(duì)于HTTP是透明的。
TCP層發(fā)送每一個(gè)報(bào)文的時(shí)候,都需要加上自己的地址(源地址)和它想要去的地方(目標(biāo)地址),然后將源MAC和目標(biāo)MAC放入MAC頭,發(fā)送出去即可;若不在同一局域網(wǎng)內(nèi),就需要發(fā)送給網(wǎng)關(guān),這時(shí)還需要發(fā)送ARP協(xié)議,來(lái)獲取網(wǎng)關(guān)的MAC地址,然后將源MAC和網(wǎng)關(guān)MAC放入MAC頭,發(fā)送出去。
網(wǎng)關(guān)收到包以后,發(fā)現(xiàn)MAC符合,取出目標(biāo)IP,根據(jù)路由協(xié)議找到下一跳的路由器,獲取下一跳路由器的MAC地址,將包發(fā)送給下一跳路由器。
這樣路由器一跳一跳終于到達(dá)目標(biāo)的局域網(wǎng)。這時(shí)候,最后一跳路由器能夠發(fā)現(xiàn),目標(biāo)地址就在自己的某一個(gè)出口的局域網(wǎng)上。于是,在這個(gè)局域網(wǎng)上發(fā)送ARP,獲得這個(gè)目標(biāo)地址的MAC地址,將包發(fā)送出去。
目標(biāo)機(jī)器發(fā)現(xiàn)MAC地址符合就將包收起來(lái);發(fā)現(xiàn)IP地址符合,根據(jù)IP頭中協(xié)議項(xiàng),知道自己上一層是TCP協(xié)議,于是解析TCP頭,里面有序列號(hào),看一看這個(gè)序列包是不是我需要的,如果是就放入緩存中然后返回一個(gè)ACK,如果不是則丟棄。
TCP頭里面還有端口號(hào),HTTP的服務(wù)器正在監(jiān)聽(tīng)這個(gè)端口號(hào)。于是,目標(biāo)機(jī)器自然知道是 HTTP 服務(wù)器這個(gè)進(jìn)程想要這個(gè)包,于是將包發(fā)給 HTTP 服務(wù)器。HTTP 服務(wù)器的進(jìn)程看到,原來(lái)這個(gè)請(qǐng)求是要訪問(wèn)一個(gè)網(wǎng)頁(yè),于是就把這個(gè)網(wǎng)頁(yè)發(fā)給客戶(hù)端。
HTTP返回的發(fā)送
根據(jù)HTTP 響應(yīng)報(bào)文的格式構(gòu)造好返回的HTTP報(bào)文,接下來(lái)就是把這個(gè)報(bào)文發(fā)送出去。還是交給Socket去發(fā)送,還是交給TCP層,讓TCP層將返回的HTML,也分成一個(gè)個(gè)小的段,并且保證每一段都可靠到達(dá)。
這些段加上 TCP 頭后會(huì)交給 IP 層,然后把剛才的發(fā)送過(guò)程反向走一遍。雖然兩次不一定走相同的路徑,但是邏輯過(guò)程是一樣的,一直到達(dá)客戶(hù)端。
客戶(hù)端發(fā)現(xiàn) MAC 地址符合、IP 地址符合,于是就會(huì)交給 TCP 層。根據(jù)序列號(hào)看是不是自己要的報(bào)文段,如果是,則會(huì)根據(jù) TCP 頭中的端口號(hào),發(fā)給相應(yīng)的進(jìn)程。這個(gè)進(jìn)程就是瀏覽器,瀏覽器作為客戶(hù)端也在監(jiān)聽(tīng)某個(gè)端口。
當(dāng)瀏覽器拿到了 HTTP 的報(bào)文。發(fā)現(xiàn)返回“200”,一切正常,于是就從正文中將 HTML 拿出來(lái)。HTML 是一個(gè)標(biāo)準(zhǔn)的網(wǎng)頁(yè)格式。瀏覽器只要根據(jù)這個(gè)格式,展示出一個(gè)絢麗多彩的網(wǎng)頁(yè)。
這就是一個(gè)正常的 HTTP 請(qǐng)求和返回的完整過(guò)程。
參考資料
- 極客時(shí)間:《趣談網(wǎng)絡(luò)協(xié)議》
?
總結(jié)
以上是生活随笔為你收集整理的HTTP访问一个网站的过程详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于 Kafka 技术栈构建和部署实时搜
- 下一篇: 索引下推