從瀏覽網(wǎng)頁開始談起:網(wǎng)絡(luò)協(xié)議簡介
時(shí)間:2023-07-18 19:36:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-07-18 19:36:01 來源:網(wǎng)站運(yùn)營
從瀏覽網(wǎng)頁開始談起:網(wǎng)絡(luò)協(xié)議簡介:
瀏覽一個(gè)網(wǎng)頁的背后
- 信息時(shí)代的人們對于網(wǎng)絡(luò)已經(jīng)習(xí)以為常。每個(gè)人每天會瀏覽上千個(gè)網(wǎng)頁,接受大量的信息流(有些時(shí)候甚至?xí)屝畔⒘鳠龎哪X袋),并將此作為一天中最重要的休閑方式。
- 我的一位授課導(dǎo)師曾經(jīng)說過:沒有人會對一個(gè)他們不了解的東西完全放心。然而我們不難發(fā)現(xiàn),這個(gè)時(shí)代的普通人們對自己不了解的東西是如此的投入——至少在網(wǎng)上沖浪的時(shí)候是這樣。
- 我們有沒有曾經(jīng)想過,在你點(diǎn)擊瀏覽某個(gè)網(wǎng)頁的時(shí)候,到底發(fā)生了些什么,讓那些大大小小的文字和圖片呈現(xiàn)在你使用的終端上呢?瀏覽一個(gè)網(wǎng)頁的背后,到底都發(fā)生了什么?
- 我們用一個(gè)例子來解釋:假如你去圖書館看書,那么保證你能看到這本書的是什么呢?
首先我們需要有文字——毋庸置疑的是,沒有文字的地方也不會有圖書館這種東西;沒有文字的地方也無法高效而準(zhǔn)確的傳遞信息。在我們?yōu)g覽網(wǎng)頁的背后,這個(gè)相似的概念就是計(jì)算機(jī)語言,它保證了所有的信息能夠被機(jī)器所存儲,所理解,所傳遞。
你會需要一個(gè)認(rèn)識文字的大腦,它能夠正確的將書本上的文字轉(zhuǎn)化成我們更熟悉的圖像和影音,讓我們理解這本書在說些什么——這就是我們的手機(jī),甚至是手機(jī)上的瀏覽器在我們?yōu)g覽網(wǎng)頁的過程中發(fā)揮的作用。它把從遠(yuǎn)處傳來的計(jì)算機(jī)語言解讀成人類可辨識的內(nèi)容,而不是通過一大堆0110的二進(jìn)制字符串來困擾我們。
最后,我們需要一個(gè)書架,或者一個(gè)圖書館,來存儲這些知識,保證在我們需要的時(shí)候可以獲得這些知識。在瀏覽網(wǎng)頁上,我們把這種存儲信息的地方叫做服務(wù)器,因?yàn)樗偸窍蚋鞣N各樣的客戶端(我們的手機(jī)或者電腦就是客戶端)提供信息服務(wù)。 - 以上只是一個(gè)非常粗略的例子,很多細(xì)節(jié)都被掩蓋了。比如說服務(wù)器如何和客戶端實(shí)現(xiàn)通信——就好比我們怎么樣才能攜帶著這一顆充滿智慧的大腦去圖書館;服務(wù)器的各種不同種類——圖書館也分為社區(qū)圖書館,大學(xué)圖書館,國家圖書館等等。但是服務(wù)器和客戶端,永遠(yuǎn)是這個(gè)過程中不會缺少的兩個(gè)角色。
web server是什么
- 就如我們剛剛說的,服務(wù)器種類繁多。根據(jù)服務(wù)器的功能,我們將服務(wù)器分為游戲服務(wù)器,文件服務(wù)器,網(wǎng)頁服務(wù)器,郵件服務(wù)器等等。而web server,就是我們中文所說的網(wǎng)頁服務(wù)器。
- web server(網(wǎng)頁服務(wù)器)會根據(jù)客戶端發(fā)來的http的請求,或返回一個(gè)錯(cuò)誤碼,或返回一個(gè)網(wǎng)頁,作為這個(gè)請求的響應(yīng)。
- 還是用圖書館的例子而言,假如我們希望找到一本書,那么我們或許會到一個(gè)圖書館去,對那里的工作人員說:“我希望能夠借閱《白鹿原》”,然后工作人員會確認(rèn)這個(gè)圖書館有沒有這本書,并依據(jù)確認(rèn)的結(jié)果給你一個(gè)回復(fù)。
- 同樣的,在網(wǎng)絡(luò)世界里,我們會先找到一個(gè)網(wǎng)絡(luò)地址,譬如www.baidu.com,然后向它發(fā)出一個(gè)請求:“我正在尋找2008年奧運(yùn)會的金牌榜”,服務(wù)器接收到你這個(gè)請求后,會查看自己所存儲的信息里有沒有與此相關(guān)的,如果沒有的話,它會返回一個(gè)錯(cuò)誤的狀態(tài)碼,比如我們經(jīng)常看到的404,如果有的話,它就會返回一個(gè)相應(yīng)的結(jié)果。
- 對于web server來說,這個(gè)相應(yīng)的結(jié)果就會是一個(gè)靜態(tài)或者動(dòng)態(tài)的網(wǎng)頁。在這里,靜態(tài)的網(wǎng)頁指的是一個(gè)根據(jù)計(jì)算機(jī)語言產(chǎn)生的,一個(gè)一直存儲起來的網(wǎng)頁。無論是誰用什么方式訪問,都會返回一個(gè)一模一樣的網(wǎng)頁。而用金牌榜的例子來解釋動(dòng)態(tài)的網(wǎng)頁的話,就好比服務(wù)器里只存儲了各個(gè)國家在歷屆奧運(yùn)會中獲取金牌的情況,為了向請求提供一個(gè)理想的答案,服務(wù)器先將2008年的結(jié)果組合起來,再返回給你。假若下次你查詢的是2012年的金牌榜,靜態(tài)網(wǎng)頁可能只能給你一個(gè)錯(cuò)誤碼,因?yàn)樗淮鎯α?008年的金牌榜。但是動(dòng)態(tài)網(wǎng)頁就會將2012的金牌榜組合起來,返回給你。
網(wǎng)絡(luò)模型:初窺http協(xié)議
- 我們剛剛提到了,web server會響應(yīng)客戶端發(fā)來的http請求,那么什么是http?
- 為了解釋http的概念,我們需要分為兩個(gè)方面來解釋:一是協(xié)議是什么。二是網(wǎng)絡(luò)模型是什么。
- 仍然用圖書館的例子來演示:圖書館里存在一種“社交協(xié)議”。我們?nèi)ピ儐柟ぷ魅藛T一本特定的圖書時(shí)我們應(yīng)該使用的方式和提供的信息,以及工作人員回復(fù)我們的時(shí)候,他們應(yīng)該使用的方式和提供的信息。
為了禮貌起見,我首先要表明身份和來意,并帶上禮貌用語。
“您好,我是bearInTheRoad,想向您咨詢一下貴館有沒有《白鹿原》這本書,如果有的話能否告訴我儲藏在哪個(gè)書架上呢?”
工作人員收到了我的問題,然后理解了我在尋找《白鹿原》這本書的意圖,于是禮貌的回復(fù)我。
“您可以去C區(qū)125書架查找,那里應(yīng)該還剩下一本?!?br>假如我不遵循這種固有的社交協(xié)議,不說明自己是誰,或者粗魯?shù)脑儐柟ぷ魅藛T,“白鹿原在哪里你這個(gè)馬鹿?”,大概率下工作人員會回復(fù)我,”我才不告訴你這個(gè)碧池。“
這就是不遵循社交協(xié)議的后果。 - 在網(wǎng)絡(luò)世界也是一樣??蛻舳嗽谙蚍?wù)端請求資源的時(shí)候,要說明自己的身份,自己所需要的資源,自己能夠解析的格式等等信息。服務(wù)端也會遵循這個(gè)協(xié)議,通過某種商定好的方式去提供這些結(jié)果。
我們把這個(gè)約定好的請求方式叫做協(xié)議。 - 那么什么叫做模型呢?在圖書館中,我們在前臺詢問的這名工作人員或許并不知道某本具體的書的情況,他必須通過對講機(jī)聯(lián)系某個(gè)庫管員,而那個(gè)庫管員則需要聯(lián)系現(xiàn)在正在某個(gè)區(qū)域值班的巡視員,以確定某本書是否在某個(gè)位置仍有藏書。這種前臺——>庫管員——>巡視員的傳遞,我們可以叫它”圖書館詢問模型“。因?yàn)槿魏我粋€(gè)對于書籍位置的咨詢都必須經(jīng)過這樣的流程,這是一個(gè)固定的模型。
- 網(wǎng)絡(luò)模型也是一樣。客戶端和服務(wù)端在通訊的過程中,有一套固有的流程,有幾個(gè)和前臺、庫管員、巡視員類似的成員。所有的請求和響應(yīng)都必須遵循這個(gè)模型來進(jìn)行。
在網(wǎng)絡(luò)模型中,我們不再稱呼他們?yōu)閹旃軉T或者巡視員。我們將它們稱為:應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,鏈路層和物理層。 - 我們不詳細(xì)解釋各層的作用和它們各自的組成協(xié)議,只需要知道應(yīng)用層就是”圖書館詢問模型“的前臺,是我們最經(jīng)常使用的網(wǎng)頁瀏覽器所處在的位置。應(yīng)用層強(qiáng)調(diào)的是多個(gè)端系統(tǒng)之間的信息交換(好比客戶端和服務(wù)端的通訊)。而http協(xié)議,就是應(yīng)用層中和網(wǎng)頁關(guān)系最緊密的那個(gè)協(xié)議。也就是說,網(wǎng)頁瀏覽器必須用這種方式去和服務(wù)器交換信息。
(圖片來源:
https://cn.bing.com/th?id=OIP.utYJ0KuUnavnfLPz4HHuOgHaEi&pid=Api&rs=1)
關(guān)于http協(xié)議
- 作為應(yīng)用層中網(wǎng)頁通訊的重要協(xié)議,http協(xié)議是我們最經(jīng)常打交道的一種。它的全稱是hyper text transmission protocol,中文是超文本傳輸協(xié)議。
- 相對于更下層的協(xié)議來說,http協(xié)議的規(guī)則是那么的簡單,開發(fā)和部署也是那么的容易,這主要體現(xiàn)在以下幾個(gè)方面。
- 簡單:http協(xié)議規(guī)定通訊是由header和body兩個(gè)部分組成。header一定要有,body可有可無。header和body都是用文本格式,明文傳輸?shù)摹<词鼓阃耆欢?jì)算機(jī)知識,也大概能看出一點(diǎn)端倪來。
- 靈活易拓展:http協(xié)議中很多東西都不是必備的,屬于你可以加上也可以不加上,只需要服務(wù)端和客戶端達(dá)成一直就可以。這使得這個(gè)協(xié)議可以變得很復(fù)雜,也可以保持非常簡單。
- 無狀態(tài):無狀態(tài)的意思是,http協(xié)議下的通訊,是不會做任何記憶的。通訊之間相互獨(dú)立,互不關(guān)聯(lián)。好比你一分鐘前發(fā)起請求,自報(bào)家門之后提出要什么資源,一分鐘后你再次聯(lián)系服務(wù)端,仍然需要自報(bào)家門然后重新提出資源請求。更簡單的理解,就是你每次詢問圖書館的前臺任何信息,都需要走一遍完整的”社交協(xié)議“,即使你們一秒鐘之前剛剛對話過。
埋藏在http下面的TCP/IP協(xié)議簇
- 我們剛剛說到了http協(xié)議發(fā)生在應(yīng)用層,也是我們接觸的最多的一層。但是就如我們的圖書館例子中說的一樣,一個(gè)請求不會只停留在前臺這里。必然是要經(jīng)歷后面的庫管員和巡視員的步驟的,網(wǎng)絡(luò)請求也不會在應(yīng)用層戛然而止,必然是需要繼續(xù)去訪問更深層的。
- 應(yīng)用層的下一層是傳輸層,也就是我們說的TCP協(xié)議簇發(fā)生的地方。TCP協(xié)議簇是一種面向連接的,可靠的,基于字節(jié)流的通信協(xié)議。TCP協(xié)議最核心的部分就在它的可靠性上。這也就涉及到了人們經(jīng)常說的三次握手和四次揮手。
- 什么是三次握手呢?客戶端和服務(wù)端建立一個(gè)通訊的時(shí)候,為了保證雙方的接受和發(fā)送能力都正常,先要進(jìn)行相關(guān)確認(rèn),通俗的說法如下:
客戶端:”你聽得到我說話嗎?“
服務(wù)端:”我聽得到你說話,你聽得到我說話嗎?“
客戶端:”我聽得到你說話?!?/li> - 什么是四次握手呢?客戶端和服務(wù)端結(jié)束一個(gè)鏈接的時(shí)候,需要雙方都確認(rèn)結(jié)束了,都發(fā)送完了自己需要發(fā)送的信息。通俗的說法如下:
客戶端:”我這邊已經(jīng)說完了,準(zhǔn)備結(jié)束通話了?!?br>服務(wù)端:”好的,我知道你準(zhǔn)備結(jié)束了。你等我說完。“
服務(wù)端:”我這邊也說完了,準(zhǔn)備結(jié)束通話了。“
客戶端:”好的,我知道了?!?/li> - 通過三次握手和四次揮手,TCP保證了客戶端和服務(wù)端的通訊連接始終都是穩(wěn)定可靠的,不會因?yàn)槟骋环降膯栴}出現(xiàn)數(shù)據(jù)丟失。
- 傳輸層的下層是網(wǎng)絡(luò)層,這里是IP協(xié)議的主戰(zhàn)場。
- TCP這邊的相關(guān)信息,會傳輸?shù)骄W(wǎng)絡(luò)層來由IP協(xié)議處理。如何處理呢?IP層主要做兩個(gè)工作:一個(gè)是尋址,一個(gè)是把信息分割成數(shù)據(jù)包,再將數(shù)據(jù)包重組起來。
- 所謂的尋址,可以用人們寄快遞來比喻。我們在寄快遞的時(shí)候,首先把需要寄的物品放在快遞包里面,這個(gè)是應(yīng)用層的工作。然后我們打電話叫順豐快遞上門,以確保這個(gè)快遞寄送的可靠和安全性,這個(gè)是傳輸層的功能。順豐小哥上門之后呢,就會要我們填寫我們自己的姓名地址和收件人的姓名地址,以保證這個(gè)快遞可以準(zhǔn)確的送到正確的地方去,這就是IP協(xié)議在網(wǎng)絡(luò)層所做的,尋址。
在網(wǎng)絡(luò)世界中當(dāng)然是沒有省市街道這種概念的,但是有IP地址這個(gè)概念。譬如111.229.121.33就是一個(gè)網(wǎng)絡(luò)世界里面的地址。IP協(xié)議會根據(jù)需要填寫客戶端和服務(wù)端分別對應(yīng)的網(wǎng)絡(luò)地址。 - 什么是分割數(shù)據(jù)包呢?想象一下,假如你的快遞是一個(gè)1噸重的挖掘機(jī),快遞小哥當(dāng)然沒辦法把挖掘機(jī)給寄出去。他會把挖掘機(jī)拆解成零件,然后分成很多個(gè)包裹,一個(gè)一個(gè)的寄出去。等到收件人那邊收到了之后,他為了還原一個(gè)挖掘機(jī),就會把零件拿出來,一點(diǎn)一點(diǎn)的拼湊成一個(gè)完整的挖掘機(jī)。
IP協(xié)議也是一樣,會根據(jù)不同網(wǎng)絡(luò)所支持的數(shù)據(jù)報(bào)的大小來對信息進(jìn)行切割和重組,以保證傳輸?shù)捻樌M(jìn)行。 - 說到IP協(xié)議的時(shí)候,另一個(gè)不得不說的東西是端口。假如我們只用地址信息寄送快遞,很可能是寄不到正確的人手上的。為什么呢?因?yàn)橛刑嗳嗽诤贾菔形鞒菂^(qū)胡同大街300號這個(gè)地址辦公了,怎么能知道準(zhǔn)確的收件人是誰呢?
于是我們衍生了一個(gè)概念,叫做端口。就好像人名一樣。我們根據(jù)IP地址送到了指定的客戶端或者服務(wù)端的機(jī)器上之后,通過端口來判斷每一個(gè)文件屬于這個(gè)機(jī)器上的哪個(gè)應(yīng)用程序。
也好似人名一樣,這里說的端口也是一個(gè)為了應(yīng)用而產(chǎn)生的概念,并不是計(jì)算機(jī)物理上存在的東西,更多的類似于一個(gè)標(biāo)識符。 - 最后提一下IP協(xié)議的一個(gè)特點(diǎn):IP協(xié)議是不可靠的無連接數(shù)據(jù)報(bào)服務(wù)。什么意思呢?就是IP協(xié)議只管發(fā),只管收,而不管是否送達(dá)和是否正確。還是以挖掘機(jī)為例的話,IP協(xié)議不會管所有的零件是不是真的寄到了以及最后拼出來的到底是個(gè)挖掘機(jī)還是個(gè)計(jì)算機(jī)。這些東西,只有TCP協(xié)議來管理。
如果你不想碰TCP/IP的話:Socket簡介
- 想象一下,假如說一切的網(wǎng)絡(luò)請求都誕生于http,然后交給tcp,然后交給IP,然后再從鏈路層和物理層出去。在接受的時(shí)候則要完整的反過來考慮一次:對于程序員這幫每天都要和網(wǎng)絡(luò)協(xié)議打交道的人,方便嗎?
- Socket,中文叫作套接字,就是為了解決這個(gè)麻煩的問題而誕生的。Socket作為一個(gè)抽象的接口層,橫梗在應(yīng)用層和傳輸層之間,幫助程序員避免每天都要和那么復(fù)雜的TCP/IP協(xié)議打交道,讓他們只需要考慮更高層次的發(fā)什么內(nèi)容等應(yīng)用層問題就可以了。
- 這也就是剛剛我們說的快遞小哥的功能。我們要寄出一個(gè)挖掘機(jī),如果沒有快遞小哥,我們要自己考慮拆解零件,一個(gè)一個(gè)的寄出,再收取零件,一個(gè)一個(gè)的拼接的問題。但是有了快遞小哥,我們只需要告訴他,我們要寄出這臺挖掘機(jī),然后他會處理好其他所有事情。在收到挖掘機(jī)的時(shí)候,他也會先把挖掘機(jī)給拼裝好,再給我們開過來簽收。
- 稍微說深一點(diǎn),Socket其實(shí)來源于Unix,是”一切都是文件“理念的一個(gè)續(xù)寫。人們只需要通過一個(gè)接口,打開文件,讀取文件,寫入文件,再關(guān)閉文件就可以了,而不需要考慮更深層次的轉(zhuǎn)碼等問題。這個(gè)概念延展到網(wǎng)絡(luò)通訊,就成為了我們的socket,一個(gè)接口概念。
(圖片來源:
https://images.cnblogs.com/cnblogs_com/goodcandle/socket2.jpg)
關(guān)鍵詞:網(wǎng)絡(luò),協(xié)議,瀏覽