引言
上網(wǎng)如此簡單蒸甜。如果不出所料的話客情,你已經(jīng)掌握了如何利用網(wǎng)絡(luò)來搜索有用的消息了鹰服,不然你就看不到這篇精彩的文章了
一般來說,我們想要在網(wǎng)上獲取某些信息嗦玖,只需要在瀏覽器上敲個網(wǎng)址,不出一會随常,我們就會收到來自服務(wù)器端的信息掩蛤。假如你未曾學(xué)過計算機,你甚至可能不知道服務(wù)器的存在干花。即使你學(xué)過計算機妄帘,在實際的開發(fā)中,你也只需要調(diào)用socket接口發(fā)起請求池凄,返回響應(yīng)就可以了
其實我想說抡驼,計算機網(wǎng)絡(luò)被隱藏地太好了,再加上它看不見摸不著肿仑,其中的細(xì)節(jié)很容易被我們所忽略致盟。所以我常常喜歡稱網(wǎng)絡(luò)為熟悉的陌生人
網(wǎng)絡(luò)如此復(fù)雜。假如尤慰,我現(xiàn)在問你HTTP馏锡、TCP/IP協(xié)議是什么?數(shù)據(jù)在傳輸?shù)倪^程中逐步經(jīng)歷了什么伟端?Socket到底是個什么東西杯道?成百上千的信息如何做到有條不紊的傳輸?shù)模咳绾巫龅礁咝鬏斃笥荆靠蛻舳伺c服務(wù)端又是如何配合的蕉饼?如何搞定網(wǎng)絡(luò)安全?這些你能回答到幾個呢?不要著急玛歌,這些問題我會在下面的文章中進行講解
在講解之前昧港,我先將網(wǎng)絡(luò)的傳輸過程進行細(xì)分,大致可以分為三個階段:客戶端請求階段支子、網(wǎng)線傳輸階段创肥、服務(wù)端響應(yīng)階段。因為網(wǎng)線傳輸階段不是軟件開發(fā)中的重點值朋,所以我會弱化網(wǎng)線傳輸?shù)闹v解叹侄,挑客戶端請求階段和服務(wù)器端兩點進行詳細(xì)地說明。那么現(xiàn)在讓我們開始吧
瀏覽器生成消息
這個小節(jié)總共有5個看點:
瀏覽器如何解析網(wǎng)址
HTTP請求消息長啥樣
如何通過域名解析獲取IP地址
全世界DNS是如何配合的
委托協(xié)議棧發(fā)送消息到底是如何完成的
生成HTTP請求消息
訪問網(wǎng)站的第一件事情是先在瀏覽器中輸入URL地址昨登。我們就以百度為例 http://www.baidu.com
將網(wǎng)址拆分成兩部分趾代,分別是"http://"和"www.baidu.com",這兩部分分別代表訪問協(xié)議和服務(wù)器域名。
協(xié)議
瀏覽器除了支持HTTP協(xié)議外丰辣,還支持“ FTP:”“ FILE:”“ MAILTO:”協(xié)議撒强,這部分文字都表示瀏覽器應(yīng)使用的訪問方法禽捆。比如,當(dāng)訪問Web服務(wù)器時飘哨,應(yīng)該使用HTTP協(xié)議胚想,而訪問FTP服務(wù)器時則應(yīng)該使用FTP協(xié)議。
網(wǎng)絡(luò)協(xié)議是什么呢芽隆?百度百科上的解釋是:網(wǎng)絡(luò)協(xié)議是為計算機網(wǎng)絡(luò)中的數(shù)據(jù)進行交換而建立的規(guī)則浊服、標(biāo)準(zhǔn)或約定的集合。對胚吁,沒錯牙躺,就是規(guī)則和約定。最簡單的協(xié)議囤采,比如說述呐,我們過馬路要遵守交通規(guī)則,否則就有可能發(fā)生意外蕉毯。那為什么要建立交通規(guī)則呢乓搬?因為我們需要對馬路上的車輛和人流(范圍)進行管理,使得每個人都能安全的通過馬路(目的)代虾。
現(xiàn)在你能說出為什么需要網(wǎng)絡(luò)協(xié)議了嗎进肯?是為了能夠進行數(shù)據(jù)交換(目的)而制定的規(guī)則,保證(管理)不同類型的數(shù)據(jù)能夠以各種方式準(zhǔn)確、高效的傳到你的電腦上棉磨。
協(xié)議的類型有很多:比如江掩,HTTP協(xié)議是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議;FTP是網(wǎng)絡(luò)共享文件的傳輸協(xié)議乘瓤;MAILTO是一個用于發(fā)送郵件的URL協(xié)議环形;FILE協(xié)議用于訪問本地計算機中的文件的協(xié)議
這樣說可能還是有點抽象,沒關(guān)系衙傀,那么我們就以HTTP協(xié)議為例子抬吟,講解一下協(xié)議到底是個什么東西吧。協(xié)議總歸是有內(nèi)容的吧统抬,比如交通規(guī)則是紅燈停與綠燈行火本,紅燈和綠燈是一個信號,用來告訴你的大腦現(xiàn)在該干什么了聪建。不過钙畔,HTTP協(xié)議的規(guī)定可不只兩個哦,可以按照實際請求的需要往HTTP請求消息里面添加金麸。
大家應(yīng)該都知道HTTP請求消息包括請求行擎析、請求頭、請求體吧挥下,見下圖叔锐。
請求頭和請求體都是控制信息挪鹏,請求體才是真正的內(nèi)容见秽。其實電腦就像我們的大腦愉烙,只不過這個大腦把他的智商兌換成了它的處理速度。電腦只做三件事情解取,分別是:輸入步责,處理請求,響應(yīng)禀苦。我們來分析一下電腦解析下面這段請求消息的過程吧:電腦會先按照換行符把請求消息劃分為三個部分蔓肯,然后依次讀取到請求行、請求頭的信息振乏,服務(wù)程序再根據(jù)請求行和請求頭的控制信息對請求體進行相應(yīng)的處理蔗包,生成對應(yīng)的響應(yīng)信息。總結(jié)起來慧邮,HTTP請求消息就是我們?nèi)藶榈囊?guī)定了一些字段调限,計算機接收到信號之后(紅綠燈),按照HTTP協(xié)議規(guī)定的方式去處理(停误澳、走耻矮、發(fā)生錯誤),從而達(dá)到傳輸超文本的目的
理解協(xié)議是很關(guān)鍵的一環(huán)忆谓,下面會大量提到協(xié)議裆装,所以我盡量通俗的講解協(xié)議,花了很多筆墨倡缠,接下來講一下域名
域名
互聯(lián)網(wǎng)是一張大網(wǎng)哨免,在互聯(lián)網(wǎng)上有上億的計算機通過網(wǎng)絡(luò)連接,如何確定我要訪問的是哪一臺計算機昙沦?對琢唾,你說得沒錯,是通過IP去找的桅滋,所以如何找是通過IP協(xié)議規(guī)定的慧耍。IP協(xié)議僅僅是能夠幫你定位到這臺主機在互聯(lián)網(wǎng)的位置,如何進行連接就需要使用到TCP協(xié)議了丐谋。這就是我們常常掛在嘴邊的TCP/IP協(xié)議了芍碧。這里要注意一點的是,TCP是傳輸層的協(xié)議号俐,而IP是網(wǎng)絡(luò)層的協(xié)議泌豆,這兩個協(xié)議是兩個層的代表,所以我們常說的TCP/IP協(xié)議是一個協(xié)議族吏饿。
再介紹TCP/IP協(xié)議之前踪危,我先簡單的引入網(wǎng)絡(luò)層次結(jié)構(gòu)的概念蔬浙,見下圖:
不同的網(wǎng)絡(luò)層次只負(fù)責(zé)自己分內(nèi)的工作,處理完了自己的工作后贞远,就把這個工作交給其他人繼續(xù)完成畴博。好了,先說到這里蓝仲,更多的知識我們接下來很快就會講到俱病,我們回到主線:域名解析與IP
IP寫出來是一個數(shù)字串,數(shù)字的設(shè)計是為了讓人們更加高效的找到他們要訪問的主機袱结。如果要拿什么作類比的話亮隙,就像學(xué)生的學(xué)號,你不可能用名字來識別學(xué)校里的每一個學(xué)生垢夹,所以如果你想快速地找到某個人溢吻,那么最高效的方式就是查學(xué)號,然后得到這個人的所有信息果元。
網(wǎng)絡(luò)中總共有約42億個地址促王,合理的分類和規(guī)劃就顯得非常重要。我們國家有14億人口噪漾,你想想看硼砰,你的身份證號是如何編碼的?有哪幾部分組成欣硼?像身份證就能唯一表示你這個人题翰。為了方便管理,IP地址被人為地分成了A類地址诈胜、B類地址豹障、C類地址,每一個IP又有網(wǎng)路號和主機號構(gòu)成焦匈。像有些大公司里面可能需要一個能夠接入很多電腦的IP血公,那么他就要申請一個A類地址的IP。一個IP最多可以接入16,777,214臺電腦(A類地址)缓熟,最少可以接入254臺電腦(C類地址)累魔。
IPv4當(dāng)初設(shè)計的時候只是為了實驗,只有2^32個地址够滑。但是隨著現(xiàn)在PC垦写、網(wǎng)絡(luò)設(shè)備和移動設(shè)備越來越多,需要的IP地址也越來越多彰触,所以IPv4的地址資源已經(jīng)枯竭梯投,而IPv6又沒有開始普及,所以只能盡量節(jié)省地址。比如定義了私有地址分蓖、開發(fā)了NAT技術(shù)以及子網(wǎng)劃分等尔艇。
我相信不會有人會去申請不夠用的IP,但是會發(fā)生申請到的IP存在浪費的情況么鹤。比如终娃,這是一個小公司,存在一個公司需要接入的電腦還不足256臺的情況午磁。為了有效利用ip地址尝抖,這個時候我們就可以根據(jù)情況將一個IP劃分成幾個子網(wǎng),分配給這個公司的子公司使用迅皇。
大致了解了IP的概念,我們開始講重頭戲:域名解析衙熔。IP雖然高效登颓,但是帶來一個問題,那就是IP太難記了红氯,于是我們就想了一個辦法框咙,那就是域名解析。有了域名解析服務(wù)之后痢甘,我們既可以用域名也可以用IP訪問網(wǎng)站了喇嘱。域名解析的含義就是將域名映射成IP的過程。域名如果不經(jīng)過轉(zhuǎn)換塞栅,是無法直接用于訪問的者铜。你可能很好奇吧,好端端的一個域名www.baidu.com是如何變成http://112.80.248.76/的呢放椰?
域名服務(wù)器在其中發(fā)揮了重要的作用作烟。在瀏覽器發(fā)起請求之前,會先向域名服務(wù)器發(fā)起請求砾医,返回相應(yīng)的要訪問的服務(wù)器的IP地址拿撩。有了域名對應(yīng)的IP地址后,就可以向目標(biāo)服務(wù)器發(fā)起請求了如蚜。
簡單理解就是這么個過程压恒,但我們的目標(biāo)不僅于此。DNS服務(wù)器中的所有信息都是按照域名错邦,分層次保存的探赫。一個層級的部分稱為域。以百度為例兴猩,www.baidu.com是一個域名期吓,它由三部分組成,以'.'號進行分隔,從右往左分別為一級域名com,二級域名baidu讨勤,三級域名www箭跳。在一級域名之前有一個根源,根域是最高的域潭千,用一個點來表示谱姓,一般可以省略。根域的DNS服務(wù)器中保管著com刨晴、jp等的DNS服務(wù)器的IP信息屉来。根域服務(wù)器在全世界上只存在13個。而且根域的地址幾乎不發(fā)生變化狈癞,因此將這些地址保存在所有的DNS服務(wù)器中也并不是一件難事
解析的具體過程茄靠。首先,將負(fù)責(zé)管理下級域的DNS服務(wù)器的IP地址注冊到它們的上級DNS服務(wù)器中蝶桶,然后上級DNS服務(wù)器的IP地址再注冊到更上一級的DNS服務(wù)器中慨绳,以此類推。也就是說真竖,負(fù)責(zé)管理www.baidu.com這個域的DNS服務(wù)器的IP地址需要注冊到baidu.com域的DNS服務(wù)器中脐雪,而baidu.com域的DNS服務(wù)器的IP地址又需要注冊到com域的DNS服務(wù)器中。這樣恢共,我們就可以通過上級DNS服務(wù)器查詢出下級DNS服務(wù)器的IP地址战秋,也就可以向下級DNS服務(wù)器發(fā)送查詢請求了
用百度舉個例子。從你的電腦出發(fā)讨韭,域名首先會發(fā)往離你最近的域名解析服務(wù)器脂信,最近的域名解析服務(wù)器如果沒有找到該域名的緩存,那么該域名服務(wù)器就會把域名發(fā)給根域服務(wù)器拐袜。補充一點吉嚣,根域服務(wù)器存在于與任何一臺域名服務(wù)器上。因為根域服務(wù)器只有13個蹬铺,所以任何一臺根域服務(wù)器都能輕易存儲尝哆。最近的根域服務(wù)器會返回他管轄的最近的com域服務(wù)器的IP。你的電腦收到最近的com域服務(wù)器的IP后甜攀,會將域名發(fā)給最近的com域服務(wù)器秋泄,com域服務(wù)器會返回他管轄的baidu.com域服務(wù)器的IP地址。最后规阀,你的電腦繼續(xù)把域名發(fā)給最近的baidu.com域服務(wù)器恒序,返回www.baidu.com的域名服務(wù)器。你的電腦收到收到這個域名服務(wù)器的ip后谁撼,判斷這就是我想要的域名IP歧胁,接著瀏覽器就會向這個IP地址發(fā)送HTTP請求。
域名解析到此結(jié)束。接下來喊巍,我們將正式向客戶端發(fā)送消息了屠缭。
瀏覽器委托操作系統(tǒng)發(fā)送消息
還記得我們前面說得計算機層級結(jié)構(gòu)嗎? HTTP協(xié)議與DNS協(xié)議都位于應(yīng)用層。像TCP協(xié)議規(guī)定了如何可靠的傳輸崭参、IP協(xié)議規(guī)定了如何快速地找到目的主機呵曹,分別位于傳輸層與網(wǎng)絡(luò)層。層次從上而下就好比我們一步一步的解決問題何暮。我們通過使用HTTP協(xié)議控制客戶端與服務(wù)端之間的超文本傳輸奄喂,要傳輸就要建立可靠連接(TCP),建立連接后就要高效的定位主機(IP)海洼,由上而下跨新,分別對應(yīng)了應(yīng)用層、傳輸層贰军、網(wǎng)絡(luò)層玻蝌。如果要做個類比的話,應(yīng)用層之下的層級好比一顆樹的樹干,應(yīng)用層好比是樹的樹枝词疼。樹枝向四處發(fā)展,每個樹枝都有自己獨特的地方帘腹,但是每個樹枝都依靠同樣的一根樹干去傳輸養(yǎng)分贰盗。這好比應(yīng)用層的協(xié)議,它基于應(yīng)用層之下的各層阳欲,為了實現(xiàn)一個特定應(yīng)用功能舵盈,從而規(guī)定和控制信息的傳輸。像HTTP協(xié)議可以控制超文本傳輸過程球化、FTP協(xié)議可以控制文件的傳輸過程秽晚、MAILTO可以控制郵件傳輸過程,DNS協(xié)議控制域名與IP的傳輸過程筒愚。網(wǎng)絡(luò)層次中的每一層都依賴下一層赴蝇,下一層對上一層提供服務(wù),這是層次結(jié)構(gòu)的精髓
我們已經(jīng)講了HTTP和DNS這樣的應(yīng)用層了巢掺,接下來我們講TCP的傳輸層句伶。
在講之前,我們先把數(shù)據(jù)包從瀏覽器到網(wǎng)卡經(jīng)過的路徑先捋一下
- 域名解析流程陆淀。對于DNS服務(wù)器考余,我們的計算機上一定有相應(yīng)的DNS客戶端,而相當(dāng)于DNS客戶端的部分稱為DNS解析器轧苫,或者簡稱解析器楚堤。解析器實際上是一段程序,它包含在操作系統(tǒng)的Socket庫中。庫就是一堆通用程序組件的集合身冬,其他的應(yīng)用程序都需要使用其中的組件衅胀。Socket庫也是一種庫,其中包含的程序組件可以讓其他的應(yīng)用程序調(diào)用操作系統(tǒng)的網(wǎng)絡(luò)功能吏恭。但我們輸入網(wǎng)址拗小,按下回車,瀏覽器就會調(diào)用解析器樱哼。響應(yīng)消息中包含查詢到的IP地址哀九,解析器會取出IP 地址,并將其寫入瀏覽器指定的內(nèi)存地址中搅幅。
瀏覽器內(nèi)部偽代碼如下:
<應(yīng)用程序名>(<參數(shù)>)
{ ....
....
<內(nèi)存地址> = gethostbyname("www.baidu.com");
....
....
<發(fā)送HTTP消息>
....
}
什么是協(xié)議棧阅束。協(xié)議棧是操作系統(tǒng)內(nèi)部的網(wǎng)絡(luò)控制軟件,也叫“協(xié)議驅(qū)動”“TCP/IP 驅(qū)動”等茄唐。是真正處理網(wǎng)絡(luò)收發(fā)過程的軟件息裸。這是因為和瀏覽器一樣,解析器本身也不具備使用網(wǎng)絡(luò)收發(fā)數(shù)據(jù)的功能沪编。解析器調(diào)用協(xié)議棧后呼盆,控制流程會再次轉(zhuǎn)移,協(xié)議棧會執(zhí)行發(fā)送消息的操作蚁廓,然后通過網(wǎng)卡將消息發(fā)送給DNS服務(wù)器访圃。計算機的內(nèi)部結(jié)構(gòu)就是這樣一層一層的。也就是說相嵌,很多程序組成不同的層次腿时,彼此之間分工協(xié)作。當(dāng)接到上層委派的操作時饭宾,本層的程序并 不會完成所有的工作批糟,而是會完成一部分工作,再將剩下的部分委派到下 層來完成看铆。
-
委托協(xié)議棧發(fā)送消息徽鼎。瀏覽器程序得到IP后就要調(diào)用協(xié)議棧來收發(fā)數(shù)據(jù)了。要發(fā)送給Web服務(wù)器的HTTP消息是一種數(shù)字信息性湿, 因此也可以說是委托協(xié)議 棧來發(fā)送數(shù)字信息纬傲。收發(fā)數(shù)字信息這一操作不僅限于瀏覽器,對于各種使用網(wǎng)絡(luò)的應(yīng)用程序來說都是共通的肤频。因此叹括,這一操作的過程也不僅適用于 Web,而是適用于任何網(wǎng)絡(luò)應(yīng)用程序宵荒。收發(fā)數(shù)據(jù)的操作分為若干個階段汁雷,可以大致總結(jié)為以下4個:
創(chuàng)建套接字(創(chuàng)建套接字階段)
將管道連接到服務(wù)器端的套接字上(連接階段)
收發(fā)數(shù)據(jù)(通信階段)
斷開管道并刪除套接字(斷開階段)
協(xié)議棧會調(diào)用Socket庫中的程序組件去執(zhí)行相關(guān)的數(shù)據(jù)收發(fā)操作净嘀。為了顯得內(nèi)容不那么繁雜,關(guān)于Socket套接字我會在下一篇文章講TCP/IP的時候具體講吧侠讯。
協(xié)議棧委托網(wǎng)卡發(fā)送數(shù)據(jù)挖藏。協(xié)議棧的上半部分有兩塊,分別是負(fù)責(zé)用TCP協(xié)議收發(fā)數(shù)據(jù)的部分和負(fù)責(zé)用UDP協(xié)議收發(fā)數(shù)據(jù)的部分厢漩,它們會接受應(yīng)用程序的委托執(zhí)行收發(fā)數(shù)據(jù)的操作膜眠。下面一半是用IP協(xié)議控制網(wǎng)絡(luò)包收發(fā)操作的部分。在互聯(lián)網(wǎng)上傳送數(shù)據(jù)時溜嗜,數(shù)據(jù)會被切分成一個一個的網(wǎng)絡(luò)包 宵膨,而將網(wǎng)絡(luò)包發(fā)送給通信對象的操作就是由IP來負(fù)責(zé)的。此外炸宵,IP 中還包括ICMP協(xié)議和ARP協(xié)議辟躏。 ICMP用于告知網(wǎng)絡(luò)包傳送過程中產(chǎn)生的錯誤以及各種控制消息,ARP用于根據(jù)IP地址查詢相應(yīng)的以太網(wǎng)MAC地址(鏈路層)土全。 IP下面的網(wǎng)卡驅(qū)動程序負(fù)責(zé)控制網(wǎng)卡硬件捎琐,而最下面的網(wǎng)卡則負(fù)責(zé)完成實際的收發(fā)操作,也就是對網(wǎng)線中的信號執(zhí)行發(fā)送和接收的操作裹匙。
- 網(wǎng)卡出去進入互聯(lián)網(wǎng)瑞凑。因為不是簡介的重點,我就講一下這一步的流程概页。以家庭上網(wǎng)為例拨黔。第一步需要通過PPP協(xié)議驗證密碼。電信號從網(wǎng)卡出去绰沥,到達(dá)你家里的路由器,路由器通過接入網(wǎng)(如光纖)到達(dá)運營商贺待,運營商自動給你的路由器分配一個公網(wǎng)IP和DNS服務(wù)器地址徽曲;第二步,使用外網(wǎng)IP對數(shù)據(jù)包進行封裝麸塞,從而使得數(shù)據(jù)包能在互聯(lián)網(wǎng)上傳輸秃臣,其實運營商的網(wǎng)絡(luò)也是以路由器為核心組成的,運營商之間的相互通信就構(gòu)成了核心網(wǎng)絡(luò)哪工。我們的數(shù)據(jù)包在核心網(wǎng)絡(luò)里可以被轉(zhuǎn)發(fā)到世界上任何一個主機上奥此。于是,你就可以訪問世界上任何一臺主機了雁比。