Web 及網(wǎng)絡(luò)基礎(chǔ)
我在學(xué)習(xí) Web 開發(fā)的過程中,曾接觸到編寫網(wǎng)絡(luò)爬蟲程序、分析抓包數(shù)據(jù)、實(shí)現(xiàn) HTTP 服務(wù)器、提供網(wǎng)站 REST API、修改后端定制框架等方面,它們無一例外,都會(huì)用到 HTTP 協(xié)議的各方面知識(shí)。
Web 使用一種名為 HTTP(超文本傳輸協(xié)議 ,準(zhǔn)確點(diǎn)超文本轉(zhuǎn)移協(xié)議)的協(xié)議作為規(guī)范,完成從客戶端到服務(wù)器端等一系列運(yùn)作流程。而協(xié)議是指規(guī)則的約定??梢哉f,Web 是建立在 HTTP 協(xié)議上通信的。?
HTTP 的誕生
CERN的蒂姆 ? 伯納斯 - 李博士提出了一種能讓遠(yuǎn)隔兩地的研究者們共享知識(shí)的設(shè)想。?最初設(shè)想的基本理念是:借助多文檔之間相互關(guān)聯(lián)形成的超文本 ,連成可相互參閱的 WWW(World Wide Web,萬維 網(wǎng))。 現(xiàn)在已提出了 3 項(xiàng) WWW 構(gòu)建技術(shù),分別是:把 SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)作為頁面的文本標(biāo) 記語言的 HTML(超文本標(biāo)記語言); 作為文檔傳遞協(xié)議的 HTTP ;指定文檔所在地址的 URL(統(tǒng)一資源定位符)。 WWW 這一名稱,是 Web 瀏覽器當(dāng)年用來瀏覽超文本的客戶端應(yīng)用 程序時(shí)的名稱?,F(xiàn)在則用來表示這一系列的集合,也可簡(jiǎn)稱為 Web。?
1990 年 11 月,CERN 成功研發(fā)了世界上第一臺(tái) Web 服務(wù)器和 Web 瀏覽器。兩年后的 1992 年 9 月,日本第一個(gè)網(wǎng)站的主頁上線了。
網(wǎng)絡(luò)基礎(chǔ) TCP/IP
TCP/IP 協(xié)議族 :計(jì)算機(jī)與網(wǎng)絡(luò)設(shè)備要相互通信,雙方就必須基于相同的方法。比如,如何探測(cè)到通信目標(biāo)、由哪一邊先發(fā)起通信、使用哪種語言進(jìn)行通信、怎樣結(jié)束通信等規(guī)則都需要事先確定。不同的硬件、操作系統(tǒng)之間的通信,所有的這一切都需要一種規(guī)則。而我們就把這種規(guī)則稱為協(xié)議。
協(xié)議中存在各式各樣的內(nèi)容。從電纜的規(guī)格到 IP 地址的選定方法、尋找異地用戶的方法、雙方建立通信的順序,以及 Web 頁面顯示需要處理的步驟,等等。像這樣把與互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集合起來總稱為 TCP/IP。也有說法認(rèn)為,TCP/IP 是指 TCP 和 IP 這兩種協(xié)議。還有一種說法認(rèn)為,TCP/IP 是在 IP 協(xié)議的通信過程中,使用到的協(xié)議族的統(tǒng)稱。
TCP/IP 的分層管理 :TCP/IP 協(xié)議族里重要的一點(diǎn)就是分層。TCP/IP 協(xié)議族按層次分別分為以下 4 層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層。
值得一提的是,層次化之后,設(shè)計(jì)也變得相對(duì)簡(jiǎn)單了。處于應(yīng)用層上的應(yīng)用可以只考慮分派給自己的任務(wù),而不需要弄清對(duì)方在地球上哪個(gè)地方、對(duì)方的傳輸路線是怎樣的、是否能確保傳輸送達(dá)等問題。
與 HTTP 關(guān)系密切的協(xié)議 : IP、TCP 和DNS
負(fù)責(zé)傳輸?shù)?IP 協(xié)議:按層次分,IP網(wǎng)際協(xié)議位于網(wǎng)絡(luò)層。TCP/IP 協(xié)議族中的 IP 指的就是網(wǎng)際協(xié)議,協(xié)議名稱中占據(jù)了一半位置,其重要性可見一斑。可能有人會(huì)把“IP”和“IP 地址”搞混,“IP”其實(shí)是一種協(xié)議的名稱。IP 協(xié)議的作用是把各種數(shù)據(jù)包傳送給對(duì)方。而要保證確實(shí)傳送到對(duì)方那里,則需要滿足各類條件。其中兩個(gè)重要的條件是 IP 地址和 MAC地址。無論哪臺(tái)計(jì)算機(jī)、哪臺(tái)網(wǎng)絡(luò)設(shè)備,它們都無法全面掌握互聯(lián)網(wǎng)中的細(xì)節(jié)。
確??煽啃缘?TCP 協(xié)議 :按層次分,TCP 位于傳輸層,提供可靠的字節(jié)流服務(wù)。TCP 協(xié)議為了更容易傳送大數(shù)據(jù)才把數(shù)據(jù)分割,而且 TCP 協(xié)議能夠確認(rèn)數(shù)據(jù)最終是否送達(dá)到對(duì)方。為了準(zhǔn)確無誤地將數(shù)據(jù)送達(dá)目標(biāo)處,TCP 協(xié)議采用了三次握手策略。握手過程中使用了 TCP 的標(biāo)志—— SYN和ACK。發(fā)送端首先發(fā)送一個(gè)帶 SYN 標(biāo)志的數(shù)據(jù)包給對(duì)方。接收端收到后,回傳一個(gè)帶有 SYN/ACK 標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息。最后,發(fā)送端再回傳一個(gè)帶 ACK 標(biāo)志的數(shù)據(jù)包,代表“握手”結(jié)束。
負(fù)責(zé)域名解析的 DNS 服務(wù) :DNS服務(wù)是和 HTTP 協(xié)議一樣位于應(yīng)用層的協(xié)議。它提供域名到 IP 地址之間的解析服務(wù)。計(jì)算機(jī)既可以被賦予 IP 地址,也可以被賦予主機(jī)名和域名。比如www.hackr.jp。用戶通常使用主機(jī)名或域名來訪問對(duì)方的計(jì)算機(jī),而不是直接通過 IP地址訪問。因?yàn)榕c IP 地址的一組純數(shù)字相比,用字母配合數(shù)字的表示形式來指定計(jì)算機(jī)名更符合人類的記憶習(xí)慣。但要讓計(jì)算機(jī)去理解名稱,相對(duì)而言就變得困難了。因?yàn)橛?jì)算機(jī)更擅長(zhǎng)處理一長(zhǎng)串?dāng)?shù)字。為了解決上述的問題,DNS 服務(wù)應(yīng)運(yùn)而生。DNS 協(xié)議提供通過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務(wù)。
HTTP 協(xié)議用于客戶端和服務(wù)器端之間的通信
HTTP 協(xié)議和 TCP/IP 協(xié)議族內(nèi)的其他眾多的協(xié)議相同,用于客戶端和服務(wù)器之間的通信。請(qǐng)求訪問文本或圖像等資源的一端稱為客戶端,而提供資源響應(yīng)的一端稱為服務(wù)器端。
HTTP 是不保存狀態(tài)的協(xié)議 :HTTP 是一種不保存狀態(tài),即無狀態(tài)協(xié)議。HTTP 協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。也就是說在 HTTP 這個(gè)級(jí)別,協(xié)議對(duì)于發(fā)送過的請(qǐng)求或響應(yīng)都不做持久化處理。使用 HTTP 協(xié)議,每當(dāng)有新的請(qǐng)求發(fā)送時(shí),就會(huì)有對(duì)應(yīng)的新響應(yīng)產(chǎn)生。協(xié)議本身并不保留之前一切的請(qǐng)求或響應(yīng)報(bào)文的信息。這是為了更快地處理大量事務(wù),確保協(xié)議的可伸縮性,而特意把 HTTP 協(xié)議設(shè)計(jì)成如此簡(jiǎn)單的。HTTP/1.1 雖然是無狀態(tài)協(xié)議,但為了實(shí)現(xiàn)期望的保持狀態(tài)功能,于是引入了 Cookie 技術(shù)。有了 Cookie 再用 HTTP 協(xié)議通信,就可以管理狀態(tài)了。
持久連接節(jié)省通信量
以當(dāng)年的通信情況來說,因?yàn)槎际切┤萘亢苄〉奈谋緜鬏?,所以即使這樣也沒有多大問題。可隨著 HTTP 的普及,文檔中包含大量圖片的情況多了起來。比如,使用瀏覽器瀏覽一個(gè)包含多張圖片的 HTML頁面時(shí),在發(fā)送請(qǐng)求訪問 HTML頁面資源的同時(shí),也會(huì)請(qǐng)求該 HTML頁面里包含的其他資源。因此,每次的請(qǐng)求都會(huì)造成無謂的 TCP 連接建立和斷開,增加通信量的開銷。
持久連接 :為解決上述 TCP 連接的問題,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久連接(HTTP Persistent Connections,也稱為 HTTP keep-alive 或HTTP connection reuse)的方法。持久連接的特點(diǎn)是,只要任意一端沒有明確提出斷開連接,則保持 TCP 連接狀態(tài)。持久連接的好處在于減少了 TCP 連接的重復(fù)建立和斷開所造成的額外開銷,減輕了服務(wù)器端的負(fù)載。另外,減少開銷的那部分時(shí)間,使HTTP 請(qǐng)求和響應(yīng)能夠更早地結(jié)束,這樣 Web 頁面的顯示速度也就相應(yīng)提高了。在 HTTP/1.1 中,所有的連接默認(rèn)都是持久連接,但在 HTTP/1.0 內(nèi)并未標(biāo)準(zhǔn)化。雖然有一部分服務(wù)器通過非標(biāo)準(zhǔn)的手段實(shí)現(xiàn)了持久連接,但服務(wù)器端不一定能夠支持持久連接。毫無疑問,除了服務(wù)器端,客戶端也需要支持持久連接。
管理持久連接 :HTTP/1.1 版本的默認(rèn)連接都是持久連接。為此,客戶端會(huì)在持久連接上連續(xù)發(fā)送請(qǐng)求。當(dāng)服務(wù)器端想明確斷開連接時(shí),則指定Connection 首部字段的值為 Close。HTTP/1.1 之前的 HTTP 版本的默認(rèn)連接都是非持久連接。為此,如果想在舊版本的 HTTP 協(xié)議上維持持續(xù)連接,則需要指定Connection 首部字段的值為 Keep-Alive。
管線化 :持久連接使得多數(shù)請(qǐng)求以管線化方式發(fā)送成為可能。從前發(fā)送請(qǐng)求后需等待并收到響應(yīng),才能發(fā)送下一個(gè)請(qǐng)求。管線化技術(shù)出現(xiàn)后,不用等待響應(yīng)亦可直接發(fā)送下一個(gè)請(qǐng)求。這樣就能夠做到同時(shí)并行發(fā)送多個(gè)請(qǐng)求,而不需要一個(gè)接一個(gè)地等待響應(yīng)了。比如,當(dāng)請(qǐng)求一個(gè)包含 10 張圖片的 HTMLWeb 頁面,與挨個(gè)連接相比,用持久連接可以讓請(qǐng)求更快結(jié)束。而管線化技術(shù)則比持久連接還要快。請(qǐng)求數(shù)越多,時(shí)間差就越明顯。