1. 前言
最近打算學(xué)習(xí)一些網(wǎng)絡(luò)相關(guān)的知識(shí),經(jīng)別人推薦,說《圖解HTTP》這本書不錯(cuò)婆廊,于是便買來打算學(xué)習(xí)一波迅细。筆記之中有什么錯(cuò)誤,還望指出_淘邻。
一般的網(wǎng)絡(luò)協(xié)議相關(guān)的書籍茵典,僅僅是其厚度就令人望而生畏;但這本書僅僅有二百五十多頁宾舅,讓人不那么抵觸统阿,而且內(nèi)容圖文并茂,也不是那么枯燥筹我,讓人有種想看下去的欲望扶平。
好了,廢話不多說了蔬蕊,在學(xué)習(xí)HTTP之前结澄,先了解了一下HTTP的發(fā)展歷史和一些網(wǎng)絡(luò)基礎(chǔ)。
2. HTTP袁串,一個(gè)發(fā)育緩慢的孩子
2.1 什么是 HTTP 概而?
我們使用HTTP最多的時(shí)候,就是我們?cè)跒g覽網(wǎng)頁的時(shí)候囱修。
當(dāng)你在瀏覽器的地址欄中輸入網(wǎng)址后赎瑰,一回車就會(huì)呈現(xiàn)出你要搜尋的頁面,那么這個(gè)過程是如何實(shí)現(xiàn)的呢破镰?
其實(shí)是我們的瀏覽器會(huì)根據(jù)你輸入的網(wǎng)址餐曼,去對(duì)應(yīng)的服務(wù)器端獲取到相應(yīng)的資源,然后在將它顯示出來鲜漩。那么在這個(gè)過程中源譬,肯定要遵守一個(gè)規(guī)則,這個(gè)規(guī)則就是HTTP協(xié)議孕似。
HTTP(HyperText Transfer Protocol),中文名字叫“超文本傳輸協(xié)議”踩娘。HTTP誕生于1990年,由CERN(歐洲核子研究組織)提出喉祭,目的是為解決文檔傳輸難題养渴,讓遠(yuǎn)隔兩地的研究者實(shí)現(xiàn)知識(shí)共享。
2.2 Web技術(shù)飛速發(fā)展
1990年11月泛烙,CERN 研發(fā)出第一臺(tái)Web服務(wù)器和Web瀏覽器理卑;
1993年,HTML1.0在全世界范圍流行蔽氨;
1994年藐唠,網(wǎng)景通信公司發(fā)布了瀏覽器 Netscape Navigator 1.0帆疟;
1995年,微軟公司發(fā)布了瀏覽器 Internet Explorer 1.0 和 2.0宇立,瀏覽器大戰(zhàn)一觸即發(fā)踪宠;
隨后 Web服務(wù)器標(biāo)準(zhǔn)之一的 Apache 以 Apache 0.2 的姿態(tài)出現(xiàn)在世人面前,HTML 也發(fā)布了 2.0 版本泄伪。
隨著瀏覽器大戰(zhàn)愈演愈烈殴蓬,瀏覽器公司不顧Web標(biāo)準(zhǔn)化,屢次新增功能卻沒有對(duì)應(yīng)的說明文檔蟋滴,而且還對(duì)各自的HTML進(jìn)行了擴(kuò)展染厅,導(dǎo)致前端工程師開發(fā)時(shí),必須考慮兼容他們公司的瀏覽器津函。
2000年左右肖粮,隨著網(wǎng)景通信公司的衰落,瀏覽器大戰(zhàn)也告一段落尔苦。但在2004年涩馆,Mozilla基金會(huì)發(fā)布了 Firefox(火狐)瀏覽器,瀏覽器大戰(zhàn)再次爆發(fā)允坚。
Chrome魂那、Opera、Safari 等瀏覽器也紛紛搶占市場(chǎng)稠项。
2.3 駐足不前的HTTP
1990年 HTTP 問世涯雅,但那時(shí)沒有作為正式的標(biāo)準(zhǔn),所以稱之為 HTTP/0.9;
1996年5月展运,HTTP 正式作為標(biāo)準(zhǔn)版公布活逆,命名為 HTTP/1.0,該協(xié)議至今仍在廣泛使用在服務(wù)端拗胜。
1997年1月發(fā)布 HTTP/1.1蔗候,這是目前主流的HTTP協(xié)議版本。
現(xiàn)在 HTTP/2.0 正在制定中埂软,但要達(dá)到較高的使用覆蓋率锈遥,恐怕還需要一段時(shí)間。
3. 網(wǎng)絡(luò)基礎(chǔ) TCP/IP 協(xié)議族
現(xiàn)在通常使用的網(wǎng)絡(luò)都是在 TCP/IP 協(xié)議族的基礎(chǔ)上運(yùn)作的勘畔,HTTP協(xié)議就屬于它內(nèi)部的一個(gè)子集迷殿。
計(jì)算機(jī)要和網(wǎng)絡(luò)設(shè)備實(shí)現(xiàn)通信,雙方就必須基于同樣的方法咖杂,遵守各種協(xié)議,這樣把互聯(lián)網(wǎng)相關(guān)的協(xié)議集合起來蚊夫,總稱為 TCP/IP诉字。
3.1 TCP/IP 的分層管理
為了能方便的修改和擴(kuò)展,TCP/IP 采用分層的設(shè)計(jì)方式,這樣當(dāng)某個(gè)地方需要修改時(shí)壤圃,不需要更改整個(gè)協(xié)議陵霉,只需要修改相應(yīng)的層即可。
TCP/IP 協(xié)議族分為四層:應(yīng)用層伍绳,傳輸層踊挠,網(wǎng)絡(luò)層,鏈路層冲杀。
3.1.1 應(yīng)用層
應(yīng)用層決定了向用戶提供服務(wù)時(shí)通信的活動(dòng)效床,比如HTTP,F(xiàn)TP(文件傳輸協(xié)議)权谁,DNS(域名系統(tǒng))等剩檀。
3.1.2 傳輸層
傳輸層對(duì)上層應(yīng)用層,提供處于網(wǎng)絡(luò)連接中的兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)傳輸旺芽。在這層有兩個(gè)性質(zhì)不同的協(xié)議:TCP(傳輸控制協(xié)議)沪猴,UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。
3.1.3 網(wǎng)絡(luò)層
又名網(wǎng)絡(luò)互連層采章。該層用來處理網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)包运嗜,規(guī)定通過怎樣的路徑把數(shù)據(jù)包傳遞給對(duì)方。IP協(xié)議等位于這一層悯舟。
3.1.4 鏈路層
又名數(shù)據(jù)鏈路層担租,網(wǎng)絡(luò)接口層。用于處理連接網(wǎng)絡(luò)的硬件部分图谷。
3.2 TCP/IP 通信傳輸流
如圖1所示翩活,利用 TCP/IP 進(jìn)行網(wǎng)絡(luò)通信時(shí),發(fā)送端從應(yīng)用層往下走便贵,而接收端從鏈路層往上走菠镇。
如圖2所示,發(fā)送端在傳遞數(shù)據(jù)時(shí)承璃,每經(jīng)過一層利耍,就會(huì)被打上一個(gè)包含該層所屬的首部信息;接收端在傳遞數(shù)據(jù)時(shí)盔粹,每經(jīng)過一層隘梨,就會(huì)把對(duì)應(yīng)的首部信息去掉。
4. 與 HTTP 密切相關(guān)的三個(gè)協(xié)議
在 TCP/IP 協(xié)議族中舷嗡,有三個(gè)和 HTTP 密不可分的協(xié)議轴猎,它們分別是 DNS服務(wù)、TCP協(xié)議 和 IP協(xié)議进萄。
4.1 負(fù)責(zé)域名解析的 DNS服務(wù)
DNS服務(wù) 和 HTTP協(xié)議 都位于應(yīng)用層捻脖。DNS服務(wù)提供域名到IP地址的解析服務(wù)锐峭。
什么是域名?比如 www.baidu.com 就是域名可婶。
什么是IP地址沿癞?比如 119.75.218.70。
域名和IP地址都是用來標(biāo)記計(jì)算機(jī)的矛渴,有了它就可以找到網(wǎng)絡(luò)上相應(yīng)的計(jì)算機(jī)椎扬,舉個(gè)不恰當(dāng)?shù)睦樱帽饶愕拿志褪怯蛎呶拢愕纳矸葑C號(hào)就是IP地址蚕涤,當(dāng)有人想找你的時(shí)候,即可以通過你的名字來找你桂躏,也可以通過你的身份證號(hào)來找你钻趋。
那么為什么會(huì)有兩個(gè)東西來標(biāo)記計(jì)算機(jī)呢? 因?yàn)橐粋€(gè)是給人看的剂习,一個(gè)是為計(jì)算機(jī)看的蛮位。與IP地址的一組純數(shù)字對(duì)比,用字母配合數(shù)字的表示形式更符合人類的記憶習(xí)慣鳞绕;但計(jì)算機(jī)就不擅長處理字母了失仁,它更擅長處理數(shù)字。
為了方便人們記憶们何,DNS服務(wù)應(yīng)運(yùn)而生萄焦,它提供通過域名查找IP地址,或逆向從IP地址反查域名的服務(wù)冤竹。
4.2 確狈鞣猓可靠性的 TCP協(xié)議
TCP協(xié)議位于傳輸層,提供可靠的字節(jié)流服務(wù)鹦蠕。
字節(jié)流服務(wù)是指冒签,為了方便傳輸,將 大塊數(shù)據(jù) 分割成以 報(bào)文段 為單位的 數(shù)據(jù)包 進(jìn)行管理钟病。
為了能夠確保數(shù)據(jù)到達(dá)目標(biāo)萧恕,TCP協(xié)議采用了 三次握手策略。
如圖4所示肠阱,握手過程中使用了TCP的標(biāo)志:SYN(同步) 和 ACK(確認(rèn))票唆。
第一次握手:發(fā)送端先發(fā)送一個(gè)帶有SYN標(biāo)志的數(shù)據(jù)包給對(duì)方。
第二次握手:接收端收到后回傳一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以表示已經(jīng)收到信息屹徘。
第三次握手:發(fā)送端再回傳一個(gè)帶ACK標(biāo)志的數(shù)據(jù)包走趋,表示握手結(jié)束。
如果在握手過程中的任何一個(gè)階段中斷噪伊,發(fā)送端會(huì)再次以相同的順序發(fā)送數(shù)據(jù)包吆视。
舉個(gè)不恰當(dāng)?shù)睦拥涮簦艜r(shí)候有甲、乙啦吧、丙三個(gè)國家打仗,這時(shí)候甲想聯(lián)合乙拙寡,一起攻打丙授滓。
一:但甲不知道乙愿不愿意,那時(shí)候沒有微信肆糕,掃個(gè)碼加個(gè)好友就能聊天般堆,所以只能靠飛鴿傳書。于是甲就寫了封信給乙诚啃。但甲不知道乙有沒有收到信淮摔,也不敢去貿(mào)然攻打丙,就等著乙的回信始赎。
二:這時(shí)候乙收到了信和橙,他也想和甲一起攻打丙,于是乙也寫了封信給甲造垛,告訴他我收到你的信了魔招,同意去攻打丙。但這時(shí)候乙也不敢輕舉妄動(dòng)五辽,他不知道甲有沒有收到信办斑,萬一甲沒收到信,就光我自己上杆逗,那就吃虧了乡翅,所以乙也等著甲的回信。
三:甲終于等到了乙的回信罪郊,既然同意一起攻打丙了蠕蚜,那么咱們就定個(gè)日子,什么時(shí)候去打丙吧排龄,于是甲又給乙寫了封信波势。
乙收到了甲的信,日子都定下了橄维,咱們就一起干吧尺铣。于是甲和乙這次敢出兵攻打丙。
如果有一方?jīng)]有收到回信争舞,肯定會(huì)再從頭來一遍凛忿。
4.3 負(fù)責(zé)傳輸?shù)?IP協(xié)議
IP協(xié)議位于網(wǎng)絡(luò)層,它的作用是把各種數(shù)據(jù)包傳遞給對(duì)方竞川。為了能傳遞到對(duì)方店溢,就必須滿足各類條件叁熔,其中最重要的兩個(gè)是 IP地址 和 MAC地址。
IP地址指明了節(jié)點(diǎn)被分配到的地址床牧,MAC地址指網(wǎng)卡所屬的固定地址荣回。IP地址可以變換,但MAC地址基本上不會(huì)改變戈咳。
一般發(fā)送數(shù)據(jù)包不會(huì)直接發(fā)送的對(duì)方那里心软,而是經(jīng)過多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)備中轉(zhuǎn),才能發(fā)送帶對(duì)方那里著蛙。在中轉(zhuǎn)時(shí)删铃,會(huì)利用下一站中轉(zhuǎn)設(shè)備的 MAC地址 來搜尋下一個(gè)中轉(zhuǎn)目標(biāo)。這里會(huì)采用 ARP協(xié)議踏堡,一種以解析地址的協(xié)議猎唁,可以根據(jù)通信方的IP地址就可以反查出對(duì)應(yīng)的MAC地址。
利用 IP協(xié)議 傳輸數(shù)據(jù)包顷蟆,就好比是快遞公司送貨一樣诫隅,一般都會(huì)從一個(gè)轉(zhuǎn)運(yùn)中心到另一個(gè)轉(zhuǎn)運(yùn)中心,直到可以送到你手中為止慕的。
4.4 利用HTTP協(xié)議阎肝、IP協(xié)議、TCP協(xié)議和DNS服務(wù)來請(qǐng)求一個(gè)網(wǎng)頁的過程圖解
通過下面這個(gè)圖來了解一下在通信過程中肮街,這些協(xié)議都發(fā)揮了哪些作用风题。
5. URI 和 URL
5.1 URI 和 URL 簡介
URI(Uniform Resource Identifier,統(tǒng)一資源標(biāo)識(shí)符)嫉父,用字符串標(biāo)識(shí)某一互聯(lián)網(wǎng)資源沛硅。
URL(Uniform Resource Locator,統(tǒng)一資源定位符)绕辖,表示互聯(lián)網(wǎng)上資源所處的位置摇肌。
可見,URL 是 URI 的子集仪际。
如圖7所示围小,列舉了幾種 URI 例子
5.2 URI 格式
5.2.1 協(xié)議名稱
指訪問資源時(shí)使用哪種協(xié)議類型。
5.2.2 登錄信息認(rèn)證
此為可選項(xiàng)树碱,指定用戶名和密碼作為從服務(wù)器獲取資源的必要登錄信息肯适。
5.2.3 服務(wù)器地址
必須指定,地址可以是域名成榜,也可以是IP地址框舔。
5.2.4 服務(wù)器端口號(hào)
可選項(xiàng),指定服務(wù)器網(wǎng)絡(luò)連接的端口號(hào),不指定使用默認(rèn)的端口號(hào)刘绣。
5.2.5 帶層次的文件路徑
指定服務(wù)器上資源的文件路徑位置樱溉。
5.2.6 查詢字符串
可選項(xiàng),針對(duì)已指定的文件路徑內(nèi)的資源纬凤,可以使用查詢字符串傳入任意參數(shù)福贞。
5.2.7 片段標(biāo)識(shí)符
可選項(xiàng),可以標(biāo)記出已獲取資源中的子資源移斩。
6. 結(jié)語
好了肚医,今天大概了解了一下 HTTP 的歷史,以及一些網(wǎng)絡(luò)基礎(chǔ)向瓷。如果有什么不正確的地方,還請(qǐng)多多指教舰涌。
今天就先到這里吧猖任。以后什么時(shí)候再見還不一定,因?yàn)橛袝r(shí)候懶癌發(fā)作了很難好過來