近期準(zhǔn)備session瘾晃,希望能跟大家輕松地分享一些東西贷痪,一些常見的場景。比如:web后臺服務(wù)器到底是如何工作的蹦误。
上網(wǎng)過程對于普通人:首先劫拢,他需要一臺電腦,然后强胰,他的電腦可以接入網(wǎng)絡(luò)舱沧,最后,他可以打開瀏覽器鍵入自己想要瀏覽的網(wǎng)址偶洋,然后就可以上網(wǎng)了熟吏。但是對于計算機(jī)來講,是一個比較復(fù)雜的過程,里面包含了信息如何保存牵寺,信息如何傳遞以及信息如何展示的過程悍引。所以,針對整個上網(wǎng)過程帽氓,我們從前到后趣斤,分析一下其中包含的各種技術(shù)細(xì)節(jié),可能不全黎休,目的是拋磚引玉浓领,希望大家在簡單的流程當(dāng)中學(xué)習(xí)更多的東西分享出來,一些基礎(chǔ)知識則當(dāng)做復(fù)習(xí)奋渔。之前buddy王老吉講過瀏覽器的工作方式镊逝,所以本文內(nèi)容不包含瀏覽器的工作方式,重點在于各種后臺服務(wù)以及通信層面的分析嫉鲸。
URL
前面說到撑蒜,用戶瀏覽器中鍵入網(wǎng)址便瀏覽網(wǎng)頁信息,這個網(wǎng)址實際上就是URL玄渗,英文全稱是Uniform Resource Locator——統(tǒng)一資源定位符座菠。
統(tǒng)一資源定位符是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址藤树≡〉危互聯(lián)網(wǎng)上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它岁钓。
完整的升略、帶有授權(quán)部分的普通統(tǒng)一資源標(biāo)志符語法看上去如下:
協(xié)議://用戶名:密碼@子域名.域名.頂級域名:端口號/目錄/文件名.文件后綴?參數(shù)=值
協(xié)議部分可以是http,https屡限,ftp等協(xié)議類型品嚣。
協(xié)議
前面提到,互聯(lián)網(wǎng)上的每個文件都有一個唯一的URL钧大,那么翰撑,到底是如何確認(rèn)的。前面提到了協(xié)議啊央,協(xié)議是什么眶诈?比如大家寫信時都需要寫郵編、地址和姓名瓜饥,便可以通過這種方式將信郵寄到世界上唯一的那個人手里逝撬,填寫的郵編,地址和姓名就是一種協(xié)議乓土。協(xié)議的價值在于世界上所有的瀏覽器和后臺服務(wù)器都需要遵循h(huán)ttp這些協(xié)議宪潮,才能正常進(jìn)行信息的傳遞。
計算機(jī)通信跟人的通信是類似的,也是遵循各種協(xié)議的坎炼,不同的協(xié)議承載著不同的功能。通常拦键,瀏覽器上網(wǎng)使用的是http或者h(yuǎn)ttps協(xié)議谣光,從網(wǎng)絡(luò)分層的角度來講,這些協(xié)議屬于應(yīng)用層協(xié)議芬为,建立在傳輸層之上萄金。傳輸層跑是什么協(xié)議呢?相信大家都非常熟悉媚朦,傳輸層跑的是TCP和UDP協(xié)議氧敢,再往下就是網(wǎng)絡(luò)層,網(wǎng)絡(luò)層上面跑的是IP數(shù)據(jù)報询张。每層的功能各不相同孙乖,每層的協(xié)議也不同,但是一般來講份氧,越往下層唯袄,協(xié)議會越少,這樣才能化繁為簡蜗帜,從而支持不同的上層協(xié)議恋拷。傳輸層協(xié)議一般是由操作系統(tǒng)層面支持的,同時還需要跟網(wǎng)絡(luò)層進(jìn)行交互(對于物理機(jī)來說就是網(wǎng)卡)厅缺,所以針對我們操作系統(tǒng)之上的程序員來講蔬顾,新創(chuàng)造的協(xié)議都是應(yīng)用層協(xié)議,因為我們的通信都是在傳輸層(TCP和UDP)基礎(chǔ)之上構(gòu)建的湘捎。
http協(xié)議
http是應(yīng)用層協(xié)議诀豁,也就是說,在界面敲下網(wǎng)址那一刻消痛,實際上瀏覽器向服務(wù)器發(fā)送了http協(xié)議格式的消息且叁,也叫做http請求。http協(xié)議是構(gòu)建在tcp協(xié)議之上的秩伞,而tcp是可靠的協(xié)議逞带,所以http協(xié)議無需考慮可靠性,只管傳輸就可以了纱新。
http協(xié)議比較簡單展氓,如下所示:
那么瀏覽器又是如何組織http請求,并且將信息發(fā)送的相應(yīng)服務(wù)器的呢脸爱?例如:http://www.baidu.com
DNS服務(wù)
我們鍵入的僅僅是服務(wù)器域名遇汞,但是實際上在網(wǎng)絡(luò)中我們通信是通過套接字來進(jìn)行通信的。套接字=IP + 端口,在網(wǎng)絡(luò)中空入,IP的作用是用來在網(wǎng)絡(luò)層進(jìn)行路由尋址络它,尋找唯一的主機(jī);端口的作用是用來在這個主機(jī)中尋找唯一的進(jìn)程歪赢』粒總體來說,套接字可以用來在網(wǎng)絡(luò)中確定唯一主機(jī)的唯一進(jìn)程埋凯,所以通過套接字我們可以進(jìn)行通信点楼。
但是問題是上網(wǎng)通過域名來訪問,那么是如何通過域名來確認(rèn)唯一主機(jī)的唯一后臺web服務(wù)器進(jìn)程的呢白对?做一個假設(shè)掠廓,如果我們可以在互聯(lián)中提供一個確定的服務(wù),這個服務(wù)里面裝有域名到套接字的映射甩恼,上網(wǎng)的人通過這個服務(wù)獲取對應(yīng)域名的套接字蟀瞧,那么這個問題不就解決了。而實際上条摸,DNS服務(wù)原理簡單來說就是剛才假設(shè)的方法黄橘,服務(wù)商通過提供公共的DNS服務(wù),大家上網(wǎng)時便可以查詢到相應(yīng)域名對應(yīng)的套接字屈溉,通過這個套接字便可以訪問確定的服務(wù)器了塞关。真正的DNS服務(wù)其實更為復(fù)雜,分為迭代式查詢和遞歸式查詢子巾,兩種方式各有優(yōu)劣帆赢,同時,為了性能线梗,DNS服務(wù)通常也配有不同級別的緩存椰于,關(guān)于DNS的具體實現(xiàn)有興趣的可以自行查詢資料學(xué)習(xí)。
總結(jié)一下仪搔,上網(wǎng)時瀏覽器實際上做了兩件事瘾婿,第一,通過瀏覽器內(nèi)置的DNS客戶端烤咧,向DNS服務(wù)器發(fā)送請求偏陪,獲取域名對應(yīng)套接字;第二煮嫌,使用套接字發(fā)送http請求笛谦,獲取數(shù)據(jù),然后在瀏覽器端呈現(xiàn)昌阿。
另外饥脑,DNS服務(wù)也需要遵循某種協(xié)議才能通信恳邀,其協(xié)議為DNS協(xié)議,其服務(wù)固定為53端口灶轰,屬于應(yīng)用層協(xié)議谣沸。DNS英文為DomainNameSystem。其實DNS服務(wù)跟電話簿的工作方式一樣笋颤,因為你沒法記得每個人的電話號碼鳄抒,但是很容易記住每個人的名字。
后臺服務(wù)器
上網(wǎng)前椰弊,我們的計算機(jī)里面什么都沒有,為何鍵入網(wǎng)址后能在界面顯示出各種各樣的數(shù)據(jù)瓤鼻?實際上秉版,數(shù)據(jù)都來自于后臺服務(wù)器,所有的數(shù)據(jù)當(dāng)然也都存儲在后臺服務(wù)器茬祷,瀏覽器僅僅請求數(shù)據(jù)清焕。前面講了,請求數(shù)據(jù)時祭犯,使用套接字加上http請求來獲取數(shù)據(jù)秸妥,后臺則必定要提供相應(yīng)的套接字,接收信息沃粗,解析http請求粥惧,才能正常的返回客戶端需要的數(shù)據(jù)。所以最盅,后臺服務(wù)器做的工作突雪,第一,綁定套接字涡贱,通過該套接字向外提供http服務(wù)咏删;第二,解析http請求问词,根據(jù)請求返回響應(yīng)督函。
http服務(wù)器實現(xiàn)
理論上講,我們可以實現(xiàn)自己的http服務(wù)激挪,并且解析不同的http請求辰狡,返回響應(yīng)。但是垄分,作為開發(fā)者來講搓译,重復(fù)造輪子是不推薦的,市面上有多種現(xiàn)成框架供我們選擇锋喜。對于java開發(fā)者來講些己,就有tomcat或者jetty豌鸡,其他語言理論上也有類似的框架。tomcat和jetty幫我們做了什么呢段标?實際上最主要的功能還就是接受http請求涯冠,針對不同的請求返回響應(yīng),當(dāng)然逼庞,他們也提供了更多的高級特性蛇更,比如遵循servlet規(guī)范,使人們更高效的開發(fā)web應(yīng)用赛糟。
總結(jié)
總結(jié)一下派任,上網(wǎng)的實際流程在程序員的角度來看,首先需要通過DNS服務(wù)解析域名璧南,獲取該域名所在web服務(wù)器應(yīng)用程序的套接字掌逛,然后瀏覽器組裝符合http協(xié)議的請求,通過套接字發(fā)送給web服務(wù)器司倚,web服務(wù)器解析請求豆混,根據(jù)解析結(jié)果將需要返回的內(nèi)容組裝符合http協(xié)議的響應(yīng),瀏覽器接到響應(yīng)后动知,根據(jù)http協(xié)議解析響應(yīng)皿伺,獲取數(shù)據(jù),將數(shù)據(jù)展示在瀏覽器上盒粮。
包含的知識點:DNS協(xié)議鸵鸥,HTTP協(xié)議,計算機(jī)網(wǎng)絡(luò)知識丹皱,后臺服務(wù)器實現(xiàn)(tomcat/jetty等)脂男。