探索之旅看點(diǎn)
1.當(dāng)從瀏覽器中輸入U(xiǎn)RL(Uniform Resource Locator)后,瀏覽器會(huì)從網(wǎng)址(URL)開(kāi)始解析.
2.根據(jù)解析后的數(shù)據(jù)來(lái)生成請(qǐng)求消息.
3.瀏覽器"委托操作系統(tǒng)"向Web服務(wù)器發(fā)送請(qǐng)求并告訴系統(tǒng)接收方的IP地址(瀏覽器需要向DNS服務(wù)器查詢域名對(duì)應(yīng)的IP地址)
4.全世界的上萬(wàn)臺(tái)DNS服務(wù)器接力完成IP地址的查詢
5.查詢IP地址后,向Web服務(wù)器發(fā)送消息
HTTP請(qǐng)求
簡(jiǎn)介
HTTP(Hypertext Transfer Protocol) 翻譯過(guò)來(lái)為"超文本傳輸協(xié)議".是在1989年在"歐洲核子研究組織"發(fā)起,由"萬(wàn)維網(wǎng)協(xié)會(huì)和互聯(lián)網(wǎng)工程任務(wù)組"制定標(biāo)準(zhǔn) --- HTTP 1.1. 于2015年5月以RFC 7540發(fā)布2.0版本.
HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法只锻。通過(guò)HTTP或者HTTPS協(xié)議請(qǐng)求的資源由統(tǒng)一資源標(biāo)識(shí)符.
統(tǒng)一資源標(biāo)識(shí)符:(URI : Uniform Resource Indentifier)
生成HTTP請(qǐng)求
當(dāng)我們?cè)谳斎肟蛱钊險(xiǎn)RL時(shí),例如:http://www.google.com . 開(kāi)頭的http:// 就是我們接下來(lái)要詳細(xì)聊的. 注:現(xiàn)在大部分的網(wǎng)址都引入了安全的"HTTPS",它的安全機(jī)制后面說(shuō)明.
除了http://, 還有像 ftp:// file:// mailto:// 等.
之所以有很多類型老翘,主要原因是因?yàn)闉g覽器支持很多功能,可以用來(lái)在FTP服務(wù)器上傳/下載文件 使用 ftp://
讀取客戶端本地文件 使用 file://
發(fā)送電子郵件時(shí) mailto:// 等,這里做不一一列舉,我們知道了開(kāi)頭的內(nèi)容是什么作用就可以.
可以將開(kāi)頭部分理解為訪問(wèn)時(shí)的"協(xié)議類型",盡管后面的寫(xiě)法不同,但開(kāi)頭決定了后面的寫(xiě)法,所以不會(huì)造成混亂的現(xiàn)象.
1.HTTP定義了客戶端與服務(wù)器之間交互的內(nèi)容與步驟,客戶端向服務(wù)器發(fā)送請(qǐng)求包括兩個(gè)內(nèi)容: "對(duì)什么" , "進(jìn)行怎樣的操作"
"對(duì)什么"也稱為URI,上面提到過(guò) 例如: "/dir/index.html" "/dir/program.cgi" , 存放一個(gè)網(wǎng)頁(yè)數(shù)據(jù)的文件名或者是一個(gè)CGI程序(Web服務(wù)器調(diào)用程序調(diào)用其他程序的規(guī)則)的文件名. URI的功能不止這些,還有可以直接使用 "http:" 開(kāi)頭的URL作為URI, 可以寫(xiě)各種訪問(wèn)目標(biāo).統(tǒng)稱URI.
"進(jìn)行怎樣的操作": 就是我們常見(jiàn)的一些例如 Get, Post, Head, Options, Put, Delete, Trace, Connect, 通過(guò)這樣的方法可以對(duì)服務(wù)器的數(shù)據(jù)進(jìn)行"增刪改查"操作.
2.Web服務(wù)器收到消息后根據(jù)URI進(jìn)行解析,并返回響應(yīng)消息,在響應(yīng)消息的開(kāi)頭有一個(gè)狀態(tài)碼,我們可以通過(guò)返回的狀態(tài)碼來(lái)判斷本次消息的成功或失敗,失敗原因等.
3.當(dāng)瀏覽器收到Web服務(wù)器響應(yīng)消息后, 無(wú)論成功或失敗, 都會(huì)將響應(yīng)的數(shù)據(jù)顯示到屏幕上.
4.HTTP整個(gè)工作完成
請(qǐng)求頭
當(dāng)URL無(wú)法全部滿足我們需要的條件時(shí),我們就需要添加一些附加信息在請(qǐng)求中,這時(shí)侯就會(huì)使用到head(HTTP頭字段列表).
響應(yīng)頭
當(dāng)消息發(fā)送到Web服務(wù)器后,就會(huì)收到對(duì)應(yīng)的響應(yīng)消息,與請(qǐng)求頭唯一的區(qū)別就在第一行中,第一行的內(nèi)容為狀態(tài)嗎和響應(yīng)短語(yǔ),表示請(qǐng)求的執(zhí)行結(jié)果.狀態(tài)碼是一個(gè)數(shù)字,它用來(lái)向程序告知執(zhí)行結(jié)果, 下表列出了基本常用的狀態(tài)碼概要:
狀態(tài)碼 | 含義 |
---|---|
1xx | 請(qǐng)求的處理進(jìn)度與情況 |
2xx | 成功 |
3xx | 需要進(jìn)一步操作 |
4xx | 客戶端錯(cuò)誤 |
5xx | 服務(wù)器錯(cuò)誤 |
當(dāng)網(wǎng)頁(yè)信息為純文字時(shí),則直接顯示到屏幕上,請(qǐng)求到此結(jié)束,如果還有圖片資源需要顯示,則在源碼中插入標(biāo)簽,用來(lái)占用圖片顯示的位置并且向服務(wù)請(qǐng)求獲取響應(yīng)圖片顯示在預(yù)留空間中.
注:每一張圖片都會(huì)向服務(wù)器請(qǐng)求一次,如3張圖片,一個(gè)URI,則需要向服務(wù)器請(qǐng)求4次,請(qǐng)求與響應(yīng)都是一對(duì)一的.(在HTTP1.1 中已經(jīng)做了優(yōu)化處理,當(dāng)某個(gè)請(qǐng)求完成時(shí),服務(wù)端不會(huì)進(jìn)行close操作,當(dāng)所有數(shù)據(jù)請(qǐng)求完成后,瀏覽器/客戶端會(huì)主動(dòng)發(fā)起close操作)
向DNS服務(wù)器查詢域名對(duì)應(yīng)的IP地址
這里先做一個(gè)IP的簡(jiǎn)介: TCP/IP網(wǎng)絡(luò)是由無(wú)數(shù)個(gè)子網(wǎng)組成,子網(wǎng)通過(guò)發(fā)送到集線器,轉(zhuǎn)發(fā)到最近的路由器上,接下來(lái)會(huì)根據(jù)消息自動(dòng)判斷下一個(gè)要發(fā)送的路由器,通過(guò)不斷的發(fā)送,最終到達(dá)指定路由器.而這個(gè)子網(wǎng)就是IP地址,如現(xiàn)實(shí)中的XX號(hào)XX室,相當(dāng)于消息訪問(wèn)目標(biāo)和地址.
tip: 在IP地址無(wú)法區(qū)分是網(wǎng)絡(luò)號(hào),主機(jī)號(hào)時(shí)通過(guò)子網(wǎng)掩碼這種附加信息來(lái)區(qū)分.
這里還有一個(gè)效率問(wèn)題,域名轉(zhuǎn)換為IP地址提高了運(yùn)行效率, 因?yàn)镮P地址的長(zhǎng)度為32比特(4字節(jié)),相對(duì)域名最短幾十個(gè)字節(jié),最長(zhǎng)255字節(jié)而言,減少了路由器的負(fù)擔(dān),傳送數(shù)據(jù)的時(shí)間也相對(duì)減少.
在轉(zhuǎn)換域名與IP地址之間的機(jī)制就稱為DNS.
那么,DNS是如何查詢IP的呢?其實(shí)很簡(jiǎn)單,就是調(diào)用包含在"Socket庫(kù)"中的解析器來(lái)實(shí)現(xiàn)的,當(dāng)我們通過(guò)DNS來(lái)查詢IP時(shí),通過(guò)將Socket中的解析器調(diào)用結(jié)果,存儲(chǔ)到瀏覽器的內(nèi)存中,待瀏覽器向Web服務(wù)器發(fā)送消息時(shí), 從內(nèi)存中取出對(duì)應(yīng)的IP地址和HTTP一起返回給操作系統(tǒng)進(jìn)行解析.
一句話來(lái)概括就是: 域名查詢IP地址時(shí),瀏覽器會(huì)使用Socket庫(kù)中的解析器
那么解析器內(nèi)部是如何實(shí)現(xiàn)的?
解析器的內(nèi)部實(shí)現(xiàn)原理
這里進(jìn)行一個(gè)簡(jiǎn)單的介紹:
1.瀏覽器/應(yīng)用程序 存儲(chǔ)的IP內(nèi)存空間 = 使用高級(jí)編程語(yǔ)言,調(diào)用Socket庫(kù)根據(jù)域名來(lái)調(diào)用方法
2.Scoket庫(kù)生成發(fā)送給DNS服務(wù)器的查詢消息
3.委托給操作系統(tǒng)內(nèi)部協(xié)議棧將消息發(fā)送出去(操作系統(tǒng)內(nèi)部網(wǎng)絡(luò)控制軟件,也叫 TCP/IP驅(qū)動(dòng) 等)
4.通過(guò)網(wǎng)卡發(fā)送給DNS服務(wù)器
5.查詢到結(jié)果后通過(guò)網(wǎng)卡返回查詢結(jié)果并保存到內(nèi)存中
6.繼續(xù)執(zhí)行下一行代碼,待調(diào)用時(shí)機(jī),在對(duì)應(yīng)內(nèi)存中取出查詢到的IP地址
tip: 只要是在DNS服務(wù)器中注冊(cè)的,都可以作為Web服務(wù)器的域名來(lái)使用
一句話來(lái)概括就是: DNS服務(wù)器會(huì)從域名與IP地址的對(duì)照表中查找相應(yīng)的記錄并返回對(duì)應(yīng)的IP地址
當(dāng)查詢請(qǐng)求提交到DNS服務(wù)器后,會(huì)先找到最近的DNS服務(wù)器進(jìn)行查詢,如果查詢需要的IP地址存在根域中,那么,根據(jù)當(dāng)前DNS服務(wù)器存儲(chǔ)的根域信息向上查找IP地址,直到查到為止.
DNS服務(wù)器的優(yōu)化處理:
1.通過(guò)上級(jí)DNS服務(wù)器查詢出下級(jí)服務(wù)器的IP地址,也可以向上級(jí)發(fā)送查詢請(qǐng)求
2.DNS服務(wù)器利用了分布式存儲(chǔ)的方式
3.查詢后的IP地址會(huì)進(jìn)行緩存操作,并且會(huì)設(shè)置對(duì)應(yīng)的緩存時(shí)間. 在查詢響應(yīng)時(shí), DNS服務(wù)器會(huì)告知客戶端是來(lái)自緩存或管理該域名的DNS服務(wù)器.
TCP/IP
套接字
什么是套接字区赵?
Web瀏覽器/應(yīng)用程序 在與DNS服務(wù)器進(jìn)行交互的時(shí)候,需要?jiǎng)?chuàng)建一個(gè)連接管道,用于它們之間的交互,傳輸信息等操作,而這個(gè)連接管道,其實(shí)就是套接字.
在它的內(nèi)部可以在連接時(shí)在TCP模塊處創(chuàng)建表示連接控制信息的頭部,同時(shí),通過(guò)TCP頭部中的發(fā)送方和接收方端口號(hào)可以找到要連接的套接字.這也就是區(qū)分了同步網(wǎng)絡(luò)情況下對(duì)應(yīng)的套接字連接.
三次握手
簡(jiǎn)單說(shuō)一下連接建立的階段 (后面兩個(gè)階段稍后做分析)
連接建立的階段 : 當(dāng)TCP頭部創(chuàng)建好后委托IP模塊將數(shù)據(jù)發(fā)送給服務(wù)器,服務(wù)器根據(jù)IP模塊接收到數(shù)據(jù)后,根據(jù)傳送過(guò)來(lái)的頭信息找到對(duì)應(yīng)的數(shù)據(jù),使用套接字寫(xiě)入相關(guān)信息,并將狀態(tài)改成正在連接.當(dāng)完成套接字的連接后,服務(wù)器需要利用TCP模塊返回響應(yīng),在服務(wù)器的TCP頭部中設(shè)置發(fā)送方和接收方端口號(hào)以及SYN比特(如果某些原因無(wú)法接受連接,那么將不會(huì)設(shè)置SYN,而是將RST比特設(shè)置為1),此外,再返回響應(yīng)時(shí)還需要將ACK控制位設(shè)置為1,表示已經(jīng)收到響應(yīng)網(wǎng)絡(luò)包.
那么為什么要設(shè)置這幾個(gè)字段映之?
在網(wǎng)絡(luò)連接的過(guò)程中可能會(huì)發(fā)生錯(cuò)誤,發(fā)生丟失.因此雙方進(jìn)行通信必須確認(rèn)網(wǎng)絡(luò)包是否送達(dá),而設(shè)置ACK比特就是用來(lái)進(jìn)行這一確認(rèn).
接下來(lái)網(wǎng)絡(luò)包會(huì)傳輸?shù)娇蛻舳?用過(guò)IP模塊到達(dá)TCP模塊,通過(guò)TCP頭部信息確認(rèn)是否操作成功,如果SYN為1則表示成功.這時(shí)會(huì)向套接字寫(xiě)入一些信息,并將狀態(tài)改為連接完畢(將ACK比特設(shè)置為1并回調(diào)給服務(wù)器告知響應(yīng)包已經(jīng)收到).客戶端完成操作.
tips:
當(dāng)應(yīng)用程序發(fā)送給協(xié)議棧的數(shù)據(jù)長(zhǎng)度達(dá)不到MTU值時(shí),需要等數(shù)據(jù)累積到一定量時(shí)再發(fā)送.當(dāng)數(shù)據(jù)達(dá)不到要求并且間隔一定時(shí)間后,協(xié)議棧內(nèi)存在一個(gè)計(jì)時(shí)器,會(huì)將網(wǎng)絡(luò)包發(fā)出去.
(應(yīng)用程序可以指定不等待填滿緩沖出直接發(fā)送)
MTU: 一個(gè)網(wǎng)絡(luò)報(bào)的最大長(zhǎng)度, 以太網(wǎng)中一般為1500字節(jié)
MSS: 出去頭部后, 一個(gè)網(wǎng)絡(luò)所能容納的TCP數(shù)據(jù)的最大長(zhǎng)度.
一句話來(lái)概括就是:通過(guò) "序號(hào)" 和 "ACK號(hào)" 可以確認(rèn)接收方是否收到網(wǎng)絡(luò)包
網(wǎng)絡(luò)延遲時(shí)間處理
當(dāng)網(wǎng)絡(luò)包延遲的時(shí)候,TCP采用了動(dòng)態(tài)調(diào)整等待時(shí)間的方法,這樣做優(yōu)化了
- 等待時(shí)間過(guò)長(zhǎng),導(dǎo)致訪問(wèn)速度緩慢
- 等待時(shí)間過(guò)短,可能發(fā)生重傳了包之后,前面的ACK號(hào)才姍姍來(lái)遲 (如果最短時(shí)間無(wú)法正確測(cè)量,則有一個(gè)默認(rèn)值,0.5 - 1之間)
滑動(dòng)窗口
那么在等到返回時(shí)間的時(shí)候,如果不進(jìn)行任何的操作,這塊時(shí)間將被浪費(fèi),為了減少這樣的浪費(fèi),TCP采用了"滑動(dòng)窗口"的方式來(lái)節(jié)省浪費(fèi)的時(shí)間.
不等待ACK號(hào)返回,直接發(fā)送一系列包.
滑動(dòng)窗口 基本實(shí)現(xiàn)思路: 接收方會(huì)告知發(fā)送發(fā)自己的"包緩沖區(qū)" 最多可以接受多少比特的包數(shù)據(jù),然后發(fā)送方根據(jù)這個(gè)峰值來(lái)進(jìn)行包發(fā)送的控制操作.