網(wǎng)絡(luò)是怎樣連接的:Web瀏覽器/應(yīng)用程序

探索之旅看點(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)的套接字連接.

三次握手

網(wǎng)絡(luò)連接圖解

簡(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)化了

  1. 等待時(shí)間過(guò)長(zhǎng),導(dǎo)致訪問(wèn)速度緩慢
  2. 等待時(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ā)送的控制操作.


滑動(dòng)窗口原理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末便锨,一起剝皮案震驚了整個(gè)濱河市歪架,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葛闷,老刑警劉巖憋槐,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異淑趾,居然都是意外死亡阳仔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)治笨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驳概,“玉大人赤嚼,你說(shuō)我怎么就攤上這事旷赖。” “怎么了更卒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵等孵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蹂空,道長(zhǎng)俯萌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任上枕,我火速辦了婚禮咐熙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辨萍。我一直安慰自己棋恼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爪飘,像睡著了一般义起。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师崎,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天默终,我揣著相機(jī)與錄音,去河邊找鬼犁罩。 笑死齐蔽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的床估。 我是一名探鬼主播肴熏,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顷窒!你這毒婦竟也來(lái)了蛙吏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞋吉,失蹤者是張志新(化名)和其女友劉穎鸦做,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谓着,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泼诱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赊锚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治筒。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舷蒲,靈堂內(nèi)的尸體忽然破棺而出耸袜,到底是詐尸還是另有隱情,我是刑警寧澤牲平,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布堤框,位于F島的核電站,受9級(jí)特大地震影響纵柿,放射性物質(zhì)發(fā)生泄漏蜈抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一昂儒、第九天 我趴在偏房一處隱蔽的房頂上張望沟使。 院中可真熱鬧,春花似錦渊跋、人聲如沸腊嗡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叽唱。三九已至屈呕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棺亭,已是汗流浹背虎眨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镶摘,地道東北人嗽桩。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凄敢,于是被迫代替她去往敵國(guó)和親碌冶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容