看完这篇文章,跟面试官扯皮就没问题了
認識 HTTP
首先你聽的最多的應該就是 HTTP 是一種 超文本傳輸協議(Hypertext Transfer Protocol),這你一定能說出來,但是這樣還不夠,假如你是大廠面試官,這不可能是他想要的最終結果,我們在面試的時候往往把自己知道的盡可能多的說出來,才有和面試官談價錢的資本。
那么什么是超文本傳輸協議?
超文本傳輸協議可以進行文字分割:超文本(Hypertext)、傳輸(Transfer)、協議(Protocol),它們之間的關系如下
按照范圍的大小 協議 > 傳輸 > 超文本。下面就分別對這三個名次做一個解釋。
什么是超文本
在互聯網早期的時候,我們輸入的信息只能保存在本地,無法和其他電腦進行交互。我們保存的信息通常都以文本即簡單字符的形式存在,文本是一種能夠被計算機解析的有意義的二進制數據包。而隨著互聯網的高速發展,兩臺電腦之間能夠進行數據的傳輸后,人們不滿足只能在兩臺電腦之間傳輸文字,還想要傳輸圖片、音頻、視頻,甚至點擊文字或圖片能夠進行超鏈接的跳轉,那么文本的語義就被擴大了,這種語義擴大后的文本就被稱為超文本(Hypertext)。
什么是傳輸
那么我們上面說到,兩臺計算機之間會形成互聯關系進行通信,我們存儲的超文本會被解析成為二進制數據包,由傳輸載體(例如同軸電纜,電話線,光纜)負責把二進制數據包由計算機終端傳輸到另一個終端的過程(對終端的詳細解釋可以參考 你說你懂互聯網,那這些你知道么?這篇文章)稱為傳輸(transfer)。
通常我們把傳輸數據包的一方稱為請求方,把接到二進制數據包的一方稱為應答方。請求方和應答方可以進行互換,請求方也可以作為應答方接受數據,應答方也可以作為請求方請求數據,它們之間的關系如下
如圖所示,A 和 B 是兩個不同的端系統,它們之間可以作為信息交換的載體存在,剛開始的時候是 A 作為請求方請求與 B 交換信息,B 作為響應的一方提供信息;隨著時間的推移,B 也可以作為請求方請求 A 交換信息,那么 A 也可以作為響應方響應 B 請求的信息。
什么是協議
協議這個名詞不僅局限于互聯網范疇,也體現在日常生活中,比如情侶雙方約定好在哪個地點吃飯,這個約定也是一種協議,比如你應聘成功了,企業會和你簽訂勞動合同,這種雙方的雇傭關系也是一種 協議。注意自己一個人對自己的約定不能成為協議,協議的前提條件必須是多人約定。
那么網絡協議是什么呢
網絡協議就是網絡中(包括互聯網)傳遞、管理信息的一些規范。如同人與人之間相互交流是需要遵循一定的規矩一樣,計算機之間的相互通信需要共同遵守一定的規則,這些規則就稱為網絡協議。
沒有網絡協議的互聯網是混亂的,就和人類社會一樣,人不能想怎么樣就怎么樣,你的行為約束是受到法律的約束的;那么互聯網中的端系統也不能自己想發什么發什么,也是需要受到通信協議約束的。
那么我們就可以總結一下,什么是 HTTP?可以用下面這個經典的總結回答一下: HTTP 是一個在計算機世界里專門在兩點之間傳輸文字、圖片、音頻、視頻等超文本數據的約定和規范。
與 HTTP 有關的組件
隨著網絡世界演進,HTTP 協議已經幾乎成為不可替代的一種協議,在了解了 HTTP 的基本組成后,下面再來帶你進一步認識一下 HTTP 協議。
網絡模型
網絡是一個復雜的系統,不僅包括大量的應用程序、端系統、通信鏈路、分組交換機等,還有各種各樣的協議組成,那么現在我們就來聊一下網絡中的協議層次。
為了給網絡協議的設計提供一個結構,網絡設計者以分層(layer)的方式組織協議,每個協議屬于層次模型之一。每一層都是向它的上一層提供服務(service),即所謂的服務模型(service model)。每個分層中所有的協議稱為 協議棧(protocol stack)。因特網的協議棧由五個部分組成:物理層、鏈路層、網絡層、運輸層和應用層。我們采用自上而下的方法研究其原理,也就是應用層 -> 物理層的方式。
應用層
應用層是網絡應用程序和網絡協議存放的分層,因特網的應用層包括許多協議,例如我們學 web 離不開的 HTTP,電子郵件傳送協議 SMTP、端系統文件上傳協議 FTP、還有為我們進行域名解析的 DNS 協議。應用層協議分布在多個端系統上,一個端系統應用程序與另外一個端系統應用程序交換信息分組,我們把位于應用層的信息分組稱為 報文(message)。
運輸層
因特網的運輸層在應用程序斷點之間傳送應用程序報文,在這一層主要有兩種傳輸協議 TCP 和UDP,利用這兩者中的任何一個都能夠傳輸報文,不過這兩種協議有巨大的不同。
TCP 向它的應用程序提供了面向連接的服務,它能夠控制并確認報文是否到達,并提供了擁塞機制來控制網絡傳輸,因此當網絡擁塞時,會抑制其傳輸速率。
UDP 協議向它的應用程序提供了無連接服務。它不具備可靠性的特征,沒有流量控制,也沒有擁塞控制。我們把運輸層的分組稱為 報文段(segment)
網絡層
因特網的網絡層負責將稱為 數據報(datagram) 的網絡分層從一臺主機移動到另一臺主機。網絡層一個非常重要的協議是 IP 協議,所有具有網絡層的因特網組件都必須運行 IP 協議,IP 協議是一種網際協議,除了 IP 協議外,網絡層還包括一些其他網際協議和路由選擇協議,一般把網絡層就稱為 IP 層,由此可知 IP 協議的重要性。
鏈路層
現在我們有應用程序通信的協議,有了給應用程序提供運輸的協議,還有了用于約定發送位置的 IP 協議,那么如何才能真正的發送數據呢?為了將分組從一個節點(主機或路由器)運輸到另一個節點,網絡層必須依靠鏈路層提供服務。鏈路層的例子包括以太網、WiFi 和電纜接入的DOCSIS 協議,因為數據從源目的地傳送通常需要經過幾條鏈路,一個數據包可能被沿途不同的鏈路層協議處理,我們把鏈路層的分組稱為 幀(frame)
物理層
雖然鏈路層的作用是將幀從一個端系統運輸到另一個端系統,而物理層的作用是將幀中的一個個比特 從一個節點運輸到另一個節點,物理層的協議仍然使用鏈路層協議,這些協議與實際的物理傳輸介質有關,例如,以太網有很多物理層協議:關于雙絞銅線、關于同軸電纜、關于光纖等等。
五層網絡協議的示意圖如下
OSI 模型
我們上面討論的計算網絡協議模型不是唯一的 協議棧,ISO(國際標準化組織)提出來計算機網絡應該按照7層來組織,那么7層網絡協議棧與5層的區別在哪里?
OSI 要比上面的網絡模型多了 表示層 和 會話層,其他層基本一致。表示層主要包括數據壓縮和數據加密以及數據描述,數據描述使得應用程序不必擔心計算機內部存儲格式的問題,而會話層提供了數據交換的定界和同步功能,包括建立檢查點和恢復方案。
瀏覽器
就如同各大郵箱使用電子郵件傳送協議 SMTP 一樣,瀏覽器是使用 HTTP 協議的主要載體,說到瀏覽器,你能想起來幾種?是的,隨著網景大戰結束后,瀏覽器迅速發展,至今已經出現過的瀏覽器主要有
瀏覽器正式的名字叫做 Web Broser,顧名思義,就是檢索、查看互聯網上網頁資源的應用程序,名字里的 Web,實際上指的就是 World Wide Web,也就是萬維網。
我們在地址欄輸入URL(即網址),瀏覽器會向DNS(域名服務器,后面會說)提供網址,由它來完成 URL 到 IP 地址的映射。然后將請求你的請求提交給具體的服務器,在由服務器返回我們要的結果(以HTML編碼格式返回給瀏覽器),瀏覽器執行HTML編碼,將結果顯示在瀏覽器的正文。這就是一個瀏覽器發起請求和接受響應的過程。
Web 服務器
Web 服務器的正式名稱叫做 Web Server,Web 服務器一般指的是網站服務器,上面說到瀏覽器是 HTTP 請求的發起方,那么 Web 服務器就是 HTTP 請求的應答方,Web 服務器可以向瀏覽器等 Web 客戶端提供文檔,也可以放置網站文件,讓全世界瀏覽;可以放置數據文件,讓全世界下載。目前最主流的三個Web服務器是Apache、 Nginx 、IIS。
CDN
CDN的全稱是Content Delivery Network,即內容分發網絡,它應用了 HTTP 協議里的緩存和代理技術,代替源站響應客戶端的請求。CDN 是構建在現有網絡基礎之上的網絡,它依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。CDN的關鍵技術主要有內容存儲和分發技術。
打比方說你要去亞馬遜上買書,之前你只能通過購物網站購買后從美國發貨過海關等重重關卡送到你的家里,現在在中國建立一個亞馬遜分基地,你就不用通過美國進行郵寄,從中國就能把書盡快給你送到。
WAF
WAF 是一種 Web 應用程序防護系統(Web Application Firewall,簡稱 WAF),它是一種通過執行一系列針對HTTP / HTTPS的安全策略來專門為Web應用提供保護的一款產品,它是應用層面的防火墻,專門檢測 HTTP 流量,是防護 Web 應用的安全技術。
WAF 通常位于 Web 服務器之前,可以阻止如 SQL 注入、跨站腳本等攻擊,目前應用較多的一個開源項目是 ModSecurity,它能夠完全集成進 Apache 或 Nginx。
WebService
WebService 是一種 Web 應用程序,WebService是一種跨編程語言和跨操作系統平臺的遠程調用技術。
Web Service 是一種由 W3C 定義的應用服務開發規范,使用 client-server 主從架構,通常使用 WSDL 定義服務接口,使用 HTTP 協議傳輸 XML 或 SOAP 消息,它是一個基于 Web(HTTP)的服務架構技術,既可以運行在內網,也可以在適當保護后運行在外網。
HTML
HTML 稱為超文本標記語言,是一種標識性的語言。它包括一系列標簽.通過這些標簽可以將網絡上的文檔格式統一,使分散的 Internet 資源連接為一個邏輯整體。HTML 文本是由 HTML 命令組成的描述性文本,HTML 命令可以說明文字,圖形、動畫、聲音、表格、鏈接等。
Web 頁面構成
Web 頁面(Web page)也叫做文檔,是由一個個對象組成的。一個對象(Objecy) 只是一個文件,比如一個 HTML 文件、一個 JPEG 圖形、一個 Java 小程序或一個視頻片段,它們在網絡中可以通過 URL 地址尋址。多數的 Web 頁面含有一個 HTML 基本文件 以及幾個引用對象。
舉個例子,如果一個 Web 頁面包含 HTML 文件和5個 JPEG 圖形,那么這個 Web 頁面就有6個對象:一個 HTML 文件和5個 JPEG 圖形。HTML 基本文件通過 URL 地址引用頁面中的其他對象。
與 HTTP 有關的協議
在互聯網中,任何協議都不會單獨的完成信息交換,HTTP 也一樣。雖然 HTTP 屬于應用層的協議,但是它仍然需要其他層次協議的配合完成信息的交換,那么在完成一次 HTTP 請求和響應的過程中,需要哪些協議的配合呢?一起來看一下
TCP/IP
TCP/IP 協議你一定聽過,TCP/IP 我們一般稱之為協議簇,什么意思呢?就是 TCP/IP 協議簇中不僅僅只有 TCP 協議和 IP 協議,它是一系列網絡通信協議的統稱。而其中最核心的兩個協議就是 TCP / IP 協議,其他的還有 UDP、ICMP、ARP 等等,共同構成了一個復雜但有層次的協議棧。
TCP 協議的全稱是 Transmission Control Protocol 的縮寫,意思是傳輸控制協議,HTTP 使用 TCP 作為通信協議,這是因為 TCP 是一種可靠的協議,而可靠能保證數據不丟失。
IP 協議的全稱是 Internet Protocol 的縮寫,它主要解決的是通信雙方尋址的問題。IP 協議使用 IP 地址來標識互聯網上的每一臺計算機,可以把 IP 地址想象成為你手機的電話號碼,你要與他人通話必須先要知道他人的手機號碼,計算機網絡中信息交換必須先要知道對方的 IP 地址。(關于 TCP 和 IP 更多的討論我們會在后面詳解)
DNS
你有沒有想過為什么你可以通過鍵入 www.google.com 就能夠獲取你想要的網站?我們上面說到,計算機網絡中的每個端系統都有一個 IP 地址存在,而把 IP 地址轉換為便于人類記憶的協議就是 DNS 協議。
DNS 的全稱是域名系統(Domain Name System,縮寫:DNS),它作為將域名和 IP 地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。
URI / URL
我們上面提到,你可以通過輸入 www.google.com 地址來訪問谷歌的官網,那么這個地址有什么規定嗎?我怎么輸都可以?AAA.BBB.CCC 是不是也行?當然不是的,你輸入的地址格式必須要滿足URI 的規范。
URI的全稱是(Uniform Resource Identifier),中文名稱是統一資源標識符,使用它就能夠唯一地標記互聯網上資源。
URL的全稱是(Uniform Resource Locator),中文名稱是統一資源定位符,也就是我們俗稱的網址,它實際上是 URI 的一個子集。
URI 不僅包括 URL,還包括 URN(統一資源名稱),它們之間的關系如下
HTTPS
HTTP 一般是明文傳輸,很容易被攻擊者竊取重要信息,鑒于此,HTTPS 應運而生。HTTPS 的全稱為 (Hyper Text Transfer Protocol over SecureSocket Layer),全稱有點長,HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全為目標的 HTTP 通道,在 HTTP 的基礎上通過傳輸加密和身份認證保證了傳輸過程的安全性。HTTPS 在 HTTP 的基礎上增加了 SSL 層,也就是說 HTTPS = HTTP + SSL。(這塊我們后面也會詳談 HTTPS)
HTTP 請求響應過程
你是不是很好奇,當你在瀏覽器中輸入網址后,到底發生了什么事情?你想要的內容是如何展現出來的?讓我們通過一個例子來探討一下,我們假設訪問的 URL 地址為http://www.someSchool.edu/someDepartment/home.index,當我們輸入網址并點擊回車時,瀏覽器內部會進行如下操作
DNS服務器會首先進行域名的映射,找到訪問www.someSchool.edu所在的地址,然后HTTP 客戶端進程在 80 端口發起一個到服務器 www.someSchool.edu 的 TCP 連接(80 端口是 HTTP 的默認端口)。在客戶和服務器進程中都會有一個套接字與其相連。
HTTP 客戶端通過它的套接字向服務器發送一個 HTTP 請求報文。該報文中包含了路徑someDepartment/home.index 的資源,我們后面會詳細討論 HTTP 請求報文。
HTTP 服務器通過它的套接字接受該報文,進行請求的解析工作,并從其存儲器(RAM 或磁盤)中檢索出對象 www.someSchool.edu/someDepartment/home.index,然后把檢索出來的對象進行封裝,封裝到 HTTP 響應報文中,并通過套接字向客戶進行發送。
HTTP 服務器隨即通知 TCP 斷開 TCP 連接,實際上是需要等到客戶接受完響應報文后才會斷開 TCP 連接。
HTTP 客戶端接受完響應報文后,TCP 連接會關閉。HTTP 客戶端從響應中提取出報文中是一個 HTML 響應文件,并檢查該 HTML 文件,然后循環檢查報文中其他內部對象。
檢查完成后,HTTP 客戶端會把對應的資源通過顯示器呈現給用戶。
至此,鍵入網址再按下回車的全過程就結束了。上述過程描述的是一種簡單的請求-響應全過程,真實的請求-響應情況可能要比上面描述的過程復雜很多。
HTTP 請求特征
從上面整個過程中我們可以總結出 HTTP 進行分組傳輸是具有以下特征
支持客戶-服務器模式
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有 GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于 HTTP 協議簡單,使得 HTTP 服務器的程序規模小,因而通信速度很快。
靈活:HTTP 允許傳輸任意類型的數據對象。正在傳輸的類型由 Content-Type 加以標記。
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
無狀態:HTTP 協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
詳解 HTTP 報文
我們上面描述了一下 HTTP 的請求響應過程,流程比較簡單,但是凡事就怕認真,你這一認真,就能拓展出很多東西,比如 HTTP 報文是什么樣的,它的組成格式是什么? 下面就來探討一下
HTTP 協議主要由三大部分組成:
起始行(start line):描述請求或響應的基本信息;
頭部字段(header):使用 key-value 形式更詳細地說明報文;
消息正文(entity):實際傳輸的數據,它不一定是純文本,可以是圖片、視頻等二進制數據。
其中起始行和頭部字段并成為 請求頭 或者 響應頭,統稱為 Header;消息正文也叫做實體,稱為 body。HTTP 協議規定每次發送的報文必須要有 Header,但是可以沒有 body,也就是說頭信息是必須的,實體信息可以沒有。而且在 header 和 body 之間必須要有一個空行(CRLF),如果用一幅圖來表示一下的話,我覺得應該是下面這樣
我們使用上面的那個例子來看一下 http 的請求報文
如圖,這是 http://www.someSchool.edu/someDepartment/home.index 請求的請求頭,通過觀察這個 HTTP 報文我們就能夠學到很多東西,首先,我們看到報文是用普通 ASCII 文本書寫的,這樣保證人能夠可以看懂。然后,我們可以看到每一行和下一行之間都會有換行,而且最后一行(請求頭部后)再加上一個回車換行符。
每個報文的起始行都是由三個字段組成:方法、URL 字段和 HTTP 版本字段。
HTTP 請求方法
HTTP 請求方法一般分為 8 種,它們分別是
GET 獲取資源,GET 方法用來請求訪問已被 URI 識別的資源。指定的資源經服務器端解析后返回響應內容。也就是說,如果請求的資源是文本,那就保持原樣返回;
POST 傳輸實體,雖然 GET 方法也可以傳輸主體信息,但是便于區分,我們一般不用 GET 傳輸實體信息,反而使用 POST 傳輸實體信息,
PUT 傳輸文件,PUT 方法用來傳輸文件。就像 FTP 協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然后保存到請求 URI 指定的位置。但是,鑒于 HTTP 的 PUT 方法自身不帶驗證機制,任何人都可以上傳文件 , 存在安全性問題,因此一般的 W eb 網站不使用該方法。若配合 W eb 應用程序的驗證機制,或架構設計采用REST(REpresentational State Transfer,表征狀態轉移)標準的同類 Web 網站,就可能會開放使用 PUT 方法。
HEAD 獲得響應首部,HEAD 方法和 GET 方法一樣,只是不返回報文主體部分。用于確認 URI 的有效性及資源更新的日期時間等。
DELETE 刪除文件,DELETE 方法用來刪除文件,是與 PUT 相反的方法。DELETE 方法按請求 URI 刪除指定的資源。
OPTIONS 詢問支持的方法,OPTIONS 方法用來查詢針對請求 URI 指定的資源支持的方法。
TRACE 追蹤路徑,TRACE 方法是讓 Web 服務器端將之前的請求通信環回給客戶端的方法。
CONNECT 要求用隧道協議連接代理,CONNECT 方法要求在與代理服務器通信時建立隧道,實現用隧道協議進行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協議把通信內容加 密后經網絡隧道傳輸。
我們一般最常用的方法也就是 GET 方法和 POST 方法,其他方法暫時了解即可。
總結
以上是生活随笔為你收集整理的看完这篇文章,跟面试官扯皮就没问题了的全部內容,希望文章能夠幫你解決所遇到的問題。