照例是寫(xiě)在前面的話(huà)沼头,今天在這里想和自己說(shuō)一些話(huà),希望未來(lái)的自己能夠記住歹篓,就像我在簡(jiǎn)書(shū)的簽名里寫(xiě)下的瘫证,“希望自己能記得當(dāng)下寫(xiě)下那段文字的初心!”庄撮,學(xué)習(xí)其實(shí)是一件非常嚴(yán)肅的事情,它容不得半點(diǎn)馬虎和粗心毙籽,當(dāng)你在當(dāng)下去學(xué)習(xí)的時(shí)候洞斯,你應(yīng)該去做的事全心全意,專(zhuān)注的去做當(dāng)下的這件事坑赡,而不是又看電視烙如,有看書(shū),又在玩游戲毅否,因?yàn)槟憧雌饋?lái)在學(xué)習(xí)亚铁,其實(shí)是在表演!昨天晚上看了一篇脈脈分享的文章讓我感覺(jué)到很慚愧螟加,“打工”十年月薪7000徘溢,思維落后的努力都是瞎忙,其中有一個(gè)觀點(diǎn)是,如果你的勤奮只是流于表面捆探,只是為了炫耀與朋友圈然爆,只是為了做給領(lǐng)導(dǎo)看,那你就是假的勤奮黍图,這種表演式的勤奮并不能持續(xù)多久曾雕。其中一句話(huà)是"只有真正的勤奮才能改變一個(gè)人的命運(yùn),那些假勤奮的人看起來(lái)很風(fēng)光助被,其實(shí)達(dá)不到很高的高度剖张!"切诀,和大家共勉吧!啰嗦完畢搔弄,下面正式開(kāi)始幅虑。
這次寫(xiě)的文章是《網(wǎng)絡(luò)是怎樣連接的》讀書(shū)筆記,這本書(shū)真的是滿(mǎn)滿(mǎn)的干貨肯污,希望每一個(gè)程序員都應(yīng)該學(xué)習(xí)的一本書(shū)翘单,對(duì)這本書(shū),真的是相見(jiàn)恨晚蹦渣。我們這次記錄第一章的內(nèi)容哄芜,以后我會(huì)堅(jiān)持把這本書(shū)的所有讀書(shū)筆記都寫(xiě)完。
這張腦圖是我自己整理的柬唯,還不是很完善认臊,等把所有的章節(jié)讀完之后,會(huì)有一個(gè)整體的腦圖做出來(lái)锄奢,那一定很壯觀失晴!我們就按照這個(gè)腦圖上的章節(jié)開(kāi)始整理吧。本筆記中所有的圖都來(lái)至?xí)小?/p>
我們的探索之旅是從在瀏覽器中輸入一個(gè)網(wǎng)址開(kāi)始的拘央。那么我們就從第一步涂屁,網(wǎng)址開(kāi)始吧!
第一步:解析網(wǎng)址
網(wǎng)址它的另一個(gè)名字叫URL
灰伟,全名叫:Uniform Resource Locator
拆又,統(tǒng)一資源定位符。還有一個(gè)是URI
栏账,全名叫Uniform Resource Identifier
帖族,統(tǒng)一資源標(biāo)識(shí)符。他們兩個(gè)是什么關(guān)系呢挡爵?想必很多人都不清楚吧竖般。
URI
叫統(tǒng)一資源表示符,是用字符串標(biāo)識(shí)某一互聯(lián)網(wǎng)資源茶鹃,而URL
表示資源的地點(diǎn)(互聯(lián)網(wǎng)上所處的位置)涣雕。可見(jiàn)URL
是URI
的子集前计。
我們可以看一下URL
的各種格式:
這里我們簡(jiǎn)單的介紹一下URL
的格式:
1.http
,ftp
,file
,mailto
,news
這部分文字都表示瀏覽器應(yīng) 當(dāng)使用的訪問(wèn)方法:
比如當(dāng)訪問(wèn)Web 服務(wù)器時(shí)應(yīng)該使用HTTPA 協(xié)議胞谭,而
訪問(wèn)FTP服務(wù)器時(shí)則應(yīng)該使用FTP協(xié)議。因此男杈,我們可以把這部分理解為
訪問(wèn)時(shí)使用的協(xié)議類(lèi)型丈屹。盡管后面部分的寫(xiě)法各不相同,但開(kāi)頭部分的
內(nèi)容決定了后面部分的寫(xiě)法,因此并不會(huì)造成混亂旺垒。
2.user:password
彩库,表示輸入的用戶(hù)名和密碼
3.www.glasscom.com
,表示的訪問(wèn)的域名
4.:80
是表示的端口號(hào)
5./dir/file1.html
表示的訪問(wèn)的文件地址。
而在瀏覽器解析的時(shí)候是這樣的:
HTTP的基本思路
在解析完網(wǎng)址以后,我們已經(jīng)知道了想要訪問(wèn)的文件在哪里睁冬,這個(gè)時(shí)候就需要瀏覽器通過(guò)使用HTTP
協(xié)議來(lái)訪問(wèn)瀏覽器:
HTTP
協(xié)議定義了客戶(hù)端和服務(wù)器之間交互的消息內(nèi)容和步驟奸例,其基 本思路非常簡(jiǎn)單穆趴。首先,客戶(hù)端會(huì)向服務(wù)器發(fā)送請(qǐng)求消息。 請(qǐng)求 消息中包含的內(nèi)容是“對(duì)什么”和“進(jìn)行怎樣的操作”兩個(gè)部分。
其中“對(duì)什么”就是URI
鳞仙,(上面說(shuō)的那個(gè)統(tǒng)一資源定位符)而“進(jìn)行怎樣的操作”就是方法,
方法表示需要讓 Web
服務(wù)器完成怎樣的工作笔时,其中典型的例子包括讀取URI表示的數(shù)據(jù)棍好、 將客戶(hù)端輸入的數(shù)據(jù)發(fā)送給URI
表示的程序等。
那允耿,這里就是大家所熟悉的各種GET,POST,PUT
等方法了借笙,具體方法的含義,我會(huì)在另一個(gè)筆記中進(jìn)行詳解较锡。
第二步:生成HTTP請(qǐng)求信息
對(duì)URL
解析之后业稼,我們知道了Web
服務(wù)器和域名,下面就應(yīng)該生成請(qǐng)求信息了蚂蕴。
我們看一下請(qǐng)求消息的格式:
請(qǐng)求消息:
第一行:請(qǐng)求行,通過(guò)這一行可以大致了解請(qǐng)求的內(nèi)容盼忌。
第二行:消息頭,每行包含一個(gè)頭字段,用于表示請(qǐng)求的附加信息掂墓。
第三行:消息體,包含客戶(hù)端向服務(wù)端發(fā)送的數(shù)據(jù)。
響應(yīng)消息:
第一行:狀態(tài)行
第二行:消息頭
第三行:消息體看成,包含服務(wù)器向客戶(hù)端發(fā)送的數(shù)據(jù)君编。
這里我們列舉一下HTTP
中主要的頭字段:
TODO:這里暫時(shí)先放在這里,后期在整理到別的專(zhuān)門(mén)的一篇里川慌。還有響應(yīng)消息的狀態(tài)碼吃嘿,這里也暫時(shí)欠缺吧
**注意:1 條請(qǐng)求消息中只能寫(xiě) 1 個(gè) URI。如果需要獲取多個(gè)文件梦重,必須 對(duì)每個(gè)文件單獨(dú)發(fā)送 1 條請(qǐng)求兑燥。 **
這里是HTTP
消息示例:
第三步:向DNS服務(wù)器查詢(xún)IP地址
說(shuō)起通過(guò)DNS
服務(wù)器查詢(xún)IP
地址,我們需要明白兩個(gè)概念琴拧,一個(gè)是IP
降瞳,一個(gè)是DNS
,
IP地址的基本知識(shí)
IP地址的基本思路
在網(wǎng)絡(luò)中,所有的設(shè)備都會(huì)被分配一個(gè)地址。這個(gè)地址就相當(dāng)于現(xiàn)實(shí) 中某條路上的“×× 號(hào) ×× 室”挣饥。 其中“號(hào)”對(duì)應(yīng)的號(hào)碼是分配給整個(gè)子 網(wǎng)的除师,而“室”對(duì)應(yīng)的號(hào)碼是分配給子網(wǎng)中的計(jì)算機(jī)的,這就是網(wǎng)絡(luò)中的 地址扔枫⊙淳郏“ 號(hào)”對(duì)應(yīng)的號(hào)碼稱(chēng)為網(wǎng)絡(luò)號(hào),“ 室”對(duì)應(yīng)的號(hào)碼稱(chēng)為主機(jī)號(hào)短荐,這個(gè) 地址的整體稱(chēng)為IP
地址 倚舀。通過(guò)IE
地址我們可以判斷出訪問(wèn)對(duì)象服務(wù)器的 位置,從而將消息發(fā)送到服務(wù)器忍宋。消息傳送的具體過(guò)程在后面的章節(jié)有詳 細(xì)講解痕貌,不過(guò)現(xiàn)在我們先簡(jiǎn)單了解一下。發(fā)送者發(fā)出的消息首先經(jīng)過(guò)子網(wǎng)
中的集線(xiàn)器 讶踪,轉(zhuǎn)發(fā)到距離發(fā)送者最近的路由器上芯侥。 接下來(lái), 路由器會(huì)根據(jù)消息的目的地判斷下一個(gè)路由器的位置乳讥,然后將消息發(fā)送 到下一個(gè)路由器柱查,即消息再次經(jīng)過(guò)子網(wǎng)內(nèi)的集線(xiàn)器被轉(zhuǎn)發(fā)到下一個(gè)路由 器。 前面的過(guò)程不斷重復(fù)云石,最終消息就被傳送到了目的地.
實(shí)際的IP地址
實(shí)際的IP
地址是一串32比特的數(shù)字唉工,按照8比特為一組分成4組,分別用十進(jìn)制表示汹忠,然后再用圓點(diǎn)分開(kāi)淋硝。
這就是我們平常經(jīng)常見(jiàn)到的 IP 地址格式,但僅憑這一 串?dāng)?shù)字我們無(wú)法區(qū)分哪部分是網(wǎng)絡(luò)號(hào)宽菜,哪部分是主機(jī)號(hào)谣膳。
在 IP 地址的規(guī)則 中,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)連起來(lái)總共是 32 比特铅乡,但這兩部分的具體結(jié)構(gòu)是不固
定的继谚。在組建網(wǎng)絡(luò)時(shí),用戶(hù)可以自行決定它們之間的分配關(guān)系阵幸,因此花履,我 們還需要另外的附加信息來(lái)表示 IP
地址的內(nèi)部結(jié)構(gòu)。
這一附加信息稱(chēng)為子網(wǎng)掩碼挚赊。子網(wǎng)掩碼的格式如1.10圖所示诡壁,是一 串與 IP 地址長(zhǎng)度相同的 32 比特?cái)?shù)字,其左邊一半都是 1荠割,右邊一半都是其中妹卿,子網(wǎng)掩碼為 1 的部分表示網(wǎng)絡(luò)號(hào),子網(wǎng)掩碼為 0 的部分表示主機(jī) 號(hào)。將子網(wǎng)掩碼按照和 IP 地址一樣的方式以每 8 比特為單位用圓點(diǎn)分組后 寫(xiě)在 IP 地址的右側(cè)纽帖,這就是圖 1.9(b)的方法宠漩。這種寫(xiě)法太長(zhǎng),我們也可 以把 1 的部分的比特?cái)?shù)用十進(jìn)制表示并寫(xiě)在 IP 地址的右側(cè)懊直,如圖 1.9(c) 所示扒吁。這兩種方式只是寫(xiě)法上的區(qū)別,含義是完全一樣的室囊。
主機(jī)號(hào)部分的比特全部為0則表示整個(gè)子網(wǎng)
主機(jī)號(hào)部分的比特全部為1則表示向子網(wǎng)上所有的設(shè)備發(fā)送包雕崩,及“廣播”。
關(guān)于子網(wǎng)掩碼非常不好理解融撞,可以看這里
為什么我們有了域名還會(huì)需要IP地址呢盼铁?
因?yàn)椋篢CP/IP網(wǎng)絡(luò)是通過(guò)IP地址來(lái)確定通信對(duì)象的,因此必須知道IP地址尝偎。
干嘛不用域名代替IP地址呢饶火?
機(jī)器在處理IP的時(shí)候要比處理域名要快的多,一個(gè)IP地址的長(zhǎng)度是32比特致扯,也就是4個(gè)字節(jié)肤寝,而域名最短也要幾十個(gè)字節(jié),甚至最長(zhǎng)255自己抖僵。也就是使用IP地址鲤看,只需要處理4自己數(shù)字。而域名則需要處理幾十個(gè)到255個(gè)自己耍群,這就增加了路由器的負(fù)擔(dān)义桂,傳送數(shù)據(jù)時(shí)也會(huì)花費(fèi)更多的時(shí)間。
域名是給人用的蹈垢,這樣好記慷吊,比如百度,而IP地址是給機(jī)器用的曹抬,這樣快罢浇!
應(yīng)該怎么查IP呢?通過(guò)Socket庫(kù)來(lái)查詢(xún)DNS服務(wù)器
這里有幾個(gè)概念:
什么是解析器沐祷?
計(jì)算機(jī)上負(fù)責(zé)調(diào)用一段程序來(lái)查詢(xún)DNS的客戶(hù)端叫DNS解析器,簡(jiǎn)稱(chēng)解析器攒岛。
什么是域名解析赖临?
通過(guò)DNS查詢(xún)IP地址的操作稱(chēng)為域名解析。
這一段程序在哪里呢灾锯?
在Socket庫(kù)里兢榨,Socket 庫(kù)是用于調(diào)用網(wǎng)絡(luò)功能的程序組件集合。
解析器的調(diào)用
通過(guò)Socket庫(kù)中的代碼,調(diào)用gethostbyname
吵聪,然后輸入域名參數(shù)凌那,就可以查詢(xún)到IP地址了
解析器的內(nèi)部原理
當(dāng)我們調(diào)用Socket
庫(kù)中的gethostbyname
方法時(shí),我們會(huì)生成一條消息吟逝,這條消息表示“請(qǐng)告訴我www.baidu.com的ip地址”帽蝶,并把這條消息通過(guò)網(wǎng)卡發(fā)送到DNS服務(wù)器中進(jìn)行查詢(xún),查詢(xún)到以后DNS服務(wù)器返回響應(yīng)的消息块攒;從響應(yīng)的消息中取出IP地址励稳,并存放到內(nèi)存地址中,接著返回應(yīng)用程序囱井。
這就是解析器的基本原理驹尼。
DNS服務(wù)器的基本工作
來(lái)自客戶(hù)端的查詢(xún)消息包含以下3種信息。
1:域名
服務(wù)器庞呕、郵件服務(wù)器(郵件地址中 @ 后面的部分)的名稱(chēng)
2:Class
在設(shè)置DNS方案時(shí)新翎,互聯(lián)網(wǎng)之外的網(wǎng)絡(luò)也考慮到了,而Class就是用來(lái)識(shí)別網(wǎng)絡(luò)的住练,不過(guò)現(xiàn)在只有互聯(lián)網(wǎng)地啰,所以它的值永遠(yuǎn)都是代表互聯(lián)網(wǎng)的IN
3:記錄類(lèi)型
標(biāo)識(shí)域名對(duì)應(yīng)何種類(lèi)型的記錄。
類(lèi)型為A:表示域名對(duì)應(yīng)的IP地址
類(lèi)型為MX時(shí)澎羞,表示域名對(duì)應(yīng)的是郵件服務(wù)器髓绽。
類(lèi)型為PTR,表示根據(jù)IP地址反查域名。
類(lèi)型為CNAME,表示查詢(xún)域名相關(guān)別名妆绞。
類(lèi)型為NS顺呕,表示查詢(xún)DNS服務(wù)器IP地址。
類(lèi)型為SOA括饶。表示查詢(xún)域名屬性信息的株茶。
下面是DNS服務(wù)器的基本工作;
DNS 服務(wù)器會(huì)從域名與 IP 地址的對(duì)照表中查找相應(yīng)的記錄图焰,并 返回 IP 地址启盛。
域名的層次結(jié)構(gòu)
由于信息實(shí)際上并不能全部保存在一臺(tái)DNS服務(wù)器上,而是分布在很多臺(tái)DNS服務(wù)器中技羔,這些DNS服務(wù)器相互配合僵闯,才能查詢(xún)出想要的信息。
所以我們這里要看一下:
信息是如何在DNS服務(wù)器上注冊(cè)并保存的藤滥。
1.DNS服務(wù)器中的所有信息都是按照域名以分層次的結(jié)構(gòu)來(lái)保存的鳖粟。
2.DNS中的域名都是用句點(diǎn)來(lái)分割的,比如www.baidu.com
拙绊,這個(gè)句點(diǎn)就代表了三個(gè)層次的域名服務(wù)器向图。www
是一個(gè)泳秀,baidu
是一個(gè),com
是一個(gè)榄攀,越靠左層次越高嗜傅,每個(gè)域都是作為一個(gè)整體來(lái)處理的,也就是一個(gè)域就作為一個(gè)整體存放在DNS服務(wù)器中檩赢,上一級(jí)域保存著下一級(jí)域的信息吕嘀,也就是www
這個(gè)根域保存著baidu
這個(gè)域的信息,當(dāng)我們需要查詢(xún)的時(shí)候漠畜,只需要找到根域币他,然后就可以從根域中查找到我們所要找的域名。
3.實(shí)際上域名的根域并不是www
憔狞,而是在上一個(gè)層次的蝴悉,這個(gè)域名保存著www
這個(gè)層次的域名信息。
查找響應(yīng)的DNS服務(wù)器并獲取IP地址
我們知道了信息是如何保存的后瘾敢,也就是知道了應(yīng)該怎么查詢(xún)拍冠,因?yàn)樯弦患?jí)域名保存著下一級(jí)域名的信息,上一級(jí)的DNS服務(wù)器保存著下一級(jí)的DNS服務(wù)器信息簇抵,我們首先訪問(wèn)最近的DNS服務(wù)器庆杜,這里其實(shí)就是我們計(jì)算機(jī)上自己已經(jīng)記錄的那臺(tái)DNS服務(wù)器,然后我們?cè)L問(wèn)根域的DNS服務(wù)器碟摆,通過(guò)根域我們知道了www
的域名DNS的IP在哪里晃财,然后我們?cè)L問(wèn)它,通過(guò)它的信息里保存的信息繼續(xù)往下查典蜕,一直到我們要查的域名為止断盛,接著返回查到的IP地址。
通過(guò)上面這兩張圖我們就知道查詢(xún)DNS服務(wù)器的全貌愉舔,大家細(xì)細(xì)品味一下钢猛。
我們還可以更快,通過(guò)緩存加快DNS服務(wù)器的查詢(xún)速度
時(shí)候并不需要從最上級(jí)的根域開(kāi)始查找轩缤,因?yàn)?DNS 服務(wù)器有一 個(gè)緩存 A 功能命迈,可以記住之前查詢(xún)過(guò)的域名。如果要查詢(xún)的域名和相關(guān)信息已 經(jīng)在緩存中火的,那么就可以直接返回響應(yīng)壶愤,接下來(lái)的查詢(xún)可以從緩存的位置開(kāi) 始向下進(jìn)行。相比每次都從根域找起來(lái)說(shuō)馏鹤,緩存可以減少查詢(xún)所需的時(shí)間公你。
第四步:委托協(xié)議棧發(fā)送消息
既然我們已經(jīng)知道了IP地址,那么我們就可以委托系統(tǒng)內(nèi)部的協(xié)議棧向這個(gè)IP地址也就是Web
服務(wù)器發(fā)送消息了假瞬。
發(fā)送消息的過(guò)程大體如上圖所示的那樣:
實(shí)際上我們需要經(jīng)過(guò)下面四個(gè)步驟:
1.創(chuàng)建套接字(創(chuàng)建套接字階段)
2.將管道連接到服務(wù)器端的套接字上(連接階段)
3.收發(fā)數(shù)據(jù)(通信階段)
4.斷開(kāi)管道并刪除套接字(斷開(kāi)階段)
這里我們大體講一下流程陕靠,在第二章節(jié)會(huì)詳細(xì)進(jìn)行講解
從上面的圖中,我們可以分為以下幾個(gè)步驟:
1.通過(guò)解析器查詢(xún)DNS服務(wù)器獲取域名的IP地址
2.通過(guò)調(diào)用socket
組件創(chuàng)建套接字脱茉。而描述符就是套接字的句柄剪芥,以讓客戶(hù)端加以區(qū)分
3.通過(guò)調(diào)用Socket
庫(kù)中的connect
方法進(jìn)行三次握手的連接
4.通過(guò)調(diào)用Socket
庫(kù)中的writer
發(fā)送數(shù)據(jù)
5.通過(guò)調(diào)用Socket
庫(kù)中的read
接受數(shù)據(jù)
6.通過(guò)調(diào)用Socket
庫(kù)中close
方法斷開(kāi)連接。
關(guān)于協(xié)議棧發(fā)送消息琴许,我們會(huì)在第二章部分具體詳解税肪。
其實(shí)這篇文章是上周就寫(xiě)完的,由于簡(jiǎn)書(shū)的圖片不能用外部鏈接榜田,所在這周才發(fā)布益兄!