【HTTP】TCP/IP 協議族到底怎麼回事

在世界各地,各類各樣的計算機運行着各類各樣的操做系統,爲計算機使用者提供服務。而單獨的一臺計算機並不會發揮太大做用,沒法爲咱們提供所需的服務,因此咱們須要想辦法把他們鏈接在一塊兒,互相協做,纔可以來提供最爲便捷而豐富的服務,發揮最大的價值。緩存

固然,你應該明白簡單的用電線把他們鏈接在一塊兒,並沒什麼卵用,就好像兩我的見了面,語言不通,互相也是對牛彈琴的。因而人類就發明了漢語、英語等語言來完成協做,於是咱們只須要爲計算機定義一套共通的規則協議,它們就能夠進行通訊交流了,因而 TCP/IP 應運而生了。特別須要注意 TCP/IP 並非一個協議,而是一個網絡通訊模型,是一整個網絡傳輸協議家族的統稱,包括了 IP 協議、IMCP 協議、TCP 協議,以及咱們這本小冊的主角 httpftppop3smtp 協議等等,它定義了電子設備如何連入互聯網,以及通訊數據如何在他們之間傳輸,能夠說是整個網絡的基礎通訊架構。這樣計算機終端之間就能夠自由的交流協做了。服務器

如今,咱們知道整個 TCP/IP 協議族包含的協議至關多,能夠按照功能分爲4層結構 ,每一層都使用它的下一層所提供的協議來完成本身的需求,與 OSI七層模型 遙相呼應,以下圖所示:網絡

在圖中你會發現,一些咱們熟知的協議,IP協議位於網絡層, TCP 協議位於傳輸層,而 HTTP 協議則位於應用層,這一層還有比較熟悉的FTP協議、DNS協議及用於電子郵件的SMTP協議等。可見,咱們平常主要工做是在應用層中發生的,下層發生了什麼基本不用操心的。架構

另外,上圖中紅藍兩條線爲咱們簡單展現了 TCP/IP協議數據流。咱們能夠看出當經過 http 發起一個請求時,應用層、傳輸層、網絡層和鏈路層的相關協議依次對該請求進行了包裝並攜帶對應的頭部,最終在鏈路層生成以太網數據包,以太網數據包經過物理介質傳輸給對方主機,對方主機接收到數據包之後,而後再一層層採用對應的協議進行拆包,最後把應用層數據交給應用程序處理。網絡傳輸協議

網絡通訊就比如送快遞,商品外面的一層層包裹就是各類協議,協議包含了商品信息、收貨地址、收件人、聯繫方式等,而後還須要配送車、配送站、快遞員,商品才能最終到達用戶手中。操作系統

通常狀況下,快遞是不能直達的,須要先轉發到對應的配送站,而後由配送站再進行派件。3d

配送車就是物理介質,配送站就是網關, 快遞員就是路由器,收貨地址就是IP地址,聯繫方式就是MAC地址。code

快遞員負責把包裹轉發到各個配送站,配送站根據收穫地址裏的省市區,確認是否須要繼續轉發到其餘配送站,當包裹到達了目標配送站之後,配送站再根據聯繫方式找到收件人進行派件。cdn

有了總體概念之後,下面咱們詳細瞭解一下各層的分工。blog

一、鏈路層

網絡通訊就是把有特定意義的數據經過物理介質傳送給對方,單純的發送 0 和 1 是沒有意義的,要傳輸有意義的數據,就須要以字節爲單位對 0 和 1 進行分組,而且要標識好每一組電信號的信息特徵,而後按照分組的順序依次發送。以太網規定一組電信號就是一個數據包,一個數據包被稱爲一幀, 制定這個規則的協議就是以太網協議

一個完整的以太網數據包以下圖所示:

整個數據幀由頭部數據尾部三部分組成,首部固定爲14個字節,包含了目標MAC地址、源MAC地址和類型;數據最短爲46個字節,最長爲1500個字節,若是須要傳輸的數據很長,就必須分割成多個幀進行發送;尾部固定爲4個字節,表示數據幀校驗序列,用於肯定數據包在傳輸過程當中是否損壞。所以,以太網協議經過對電信號進行分組並造成數據幀,而後經過物理介質把數據幀發送給接收方。那麼以太網如何來識接收方的身份呢?

以太網規協議定,接入網絡的設備都必須安裝網絡適配器,即網卡, 數據包必須是從一塊網卡傳送到另外一塊網卡。而網卡地址就是數據包的發送地址和接收地址,也就是幀首部所包含的MAC地址,MAC地址是每塊網卡的身份標識,就如同咱們身份證上的身份證號碼,具備全球惟一性。MAC地址採用十六進制標識,共6個字節, 前三個字節是廠商編號,後三個字節是網卡流水號,例如 4C-0F-6E-12-D2-19

有了MAC地址之後,以太網採用廣播形式,把數據包發給該子網內全部主機,子網內每臺主機在接收到這個包之後,都會讀取首部裏的目標MAC地址,而後和本身的MAC地址進行對比,若是相同就作下一步處理,若是不一樣,就丟棄這個包。

因此鏈路層的主要工做就是對電信號進行分組並造成具備特定意義的數據幀,而後以廣播的形式經過物理介質發送給接收方

二、網絡層

對於上面的過程,有幾個細節問題值得咱們思考:

  • 發送者如何知道接收者的MAC地址?
  • 發送者如何知道接收者和本身同屬一個子網?
  • 若是接收者和本身不在同一個子網,數據包如何發給對方?

爲了解決這些問題,網絡層引入了三個協議,分別是IP協議ARP協議路由協議

IP協議

經過前面的介紹咱們知道,MAC地址只與廠商有關,與所處的網絡無關,因此沒法經過MAC地址來判斷兩臺主機是否屬於同一個子網。

所以,網絡層引入了IP協議,制定了一套新地址,使得咱們可以區分兩臺主機是否同屬一個網絡,這套地址就是網絡地址,也就是所謂的IP地址。

IP地址目前有兩個版本,分別是IPv4和IPv6,IPv4是一個32位的地址,常採用4個十進制數字表示。IP協議將這個32位的地址分爲兩部分,前面部分表明網絡地址,後面部分表示該主機在局域網中的地址。因爲各種地址的分法不盡相同,以C類地址192.168.24.1爲例,其中前24位就是網絡地址,後8位就是主機地址。所以, 若是兩個IP地址在同一個子網內,則網絡地址必定相同。爲了判斷IP地址中的網絡地址,IP協議還引入了子網掩碼, IP地址和子網掩碼經過按位與運算後就能夠獲得網絡地址。

因爲發送者和接收者的IP地址是已知的(應用層的協議會傳入), 所以咱們只要經過子網掩碼對兩個IP地址進行AND運算後就可以判斷雙方是否在同一個子網了。

ARP協議

即地址解析協議,是根據IP地址獲取MAC地址的一個網絡層協議。其工做原理以下:

ARP首先會發起一個請求數據包,數據包的首部包含了目標主機的IP地址,而後這個數據包會在鏈路層進行再次包裝,生成以太網數據包,最終由以太網廣播給子網內的全部主機,每一臺主機都會接收到這個數據包,並取出標頭裏的IP地址,而後和本身的IP地址進行比較,若是相同就返回本身的MAC地址,若是不一樣就丟棄該數據包。ARP接收返回消息,以此肯定目標機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應的IP地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。cmd輸入 arp -a 就能夠查詢本機緩存的ARP數據。

路由協議

經過ARP協議的工做原理能夠發現,ARP的MAC尋址仍是侷限在同一個子網中,所以網絡層引入了路由協議,首先經過IP協議來判斷兩臺主機是否在同一個子網中,若是在同一個子網,就經過ARP協議查詢對應的MAC地址,而後以廣播的形式向該子網內的主機發送數據包;若是不在同一個子網,以太網會將該數據包轉發給本子網的網關進行路由。網關是互聯網上子網與子網之間的橋樑,因此網關會進行屢次轉發,最終將該數據包轉發到目標IP所在的子網中,而後再經過ARP獲取目標機MAC,最終也是經過廣播形式將數據包發送給接收方。

而完成這個路由協議的物理設備就是路由器,在錯綜複雜的網絡世界裏,路由器扮演者交通樞紐的角色,它會根據信道狀況,選擇並設定路由,以最佳路徑來轉發數據包。

IP數據包

在網絡層被包裝的數據包就叫IP數據包,IPv4數據包的結構以下圖所示:

IP數據包由首部和數據兩部分組成,首部長度爲20個字節,主要包含了目標IP地址和源IP地址,目標IP地址是網關路由的線索和依據;數據部分的最大長度爲65515字節,理論上一個IP數據包的總長度能夠達到65535個字節,而以太網數據包的最大長度是1500個字符,若是超過這個大小,就須要對IP數據包進行分割,分紅多幀發送。

因此,網絡層的主要工做是定義網絡地址,區分網段,子網內MAC尋址,對於不一樣子網的數據包進行路由

三、傳輸層

鏈路層定義了主機的身份,即MAC地址, 而網絡層定義了IP地址,明確了主機所在的網段,有了這兩個地址,數據包就從能夠從一個主機發送到另外一臺主機。但實際上數據包是從一個主機的某個應用程序發出,而後由對方主機的應用程序接收。而每臺電腦都有可能同時運行着不少個應用程序,因此當數據包被髮送到主機上之後,是沒法肯定哪一個應用程序要接收這個包。

所以傳輸層引入了UDP協議來解決這個問題,爲了給每一個應用程序標識身份,UDP協議定義了端口,同一個主機上的每一個應用程序都須要指定惟一的端口號,而且規定網絡中傳輸的數據包必須加上端口信息。 這樣,當數據包到達主機之後,就能夠根據端口號找到對應的應用程序了。UDP定義的數據包就叫作UDP數據包,結構以下所示:

UDP數據包由首部和數據兩部分組成,首部長度爲8個字節,主要包括源端口和目標端口;數據最大爲65527個字節,整個數據包的長度最大可達到65535個字節。

UDP協議比較簡單,實現容易,但它沒有確認機制, 數據包一旦發出,沒法知道對方是否收到,所以可靠性較差,爲了解決這個問題,提升網絡可靠性,TCP協議就誕生了,TCP即傳輸控制協議,是一種面向鏈接的、可靠的、基於字節流的通訊協議。簡單來講TCP就是有確認機制的UDP協議,每發出一個數據包都要求確認,若是有一個數據包丟失,就收不到確認,發送方就必須重發這個數據包。

爲了保證傳輸的可靠性,TCP 協議在 UDP 基礎之上創建了三次對話的確認機制,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。因爲創建過程較爲複雜,咱們在這裏作一個形象的描述:

主機A:我想發數據給你,能夠麼?

主機B:能夠,你何時發?

主機A:我立刻發,你接着!

通過三次對話以後,主機A纔會向主機B發送正式數據,而UDP是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發過去了。因此 TCP 可以保證數據包在傳輸過程當中不被丟失,但美好的事物必然是要付出代價的,相比 UDP,TCP 實現過程複雜,消耗鏈接資源多,傳輸速度慢。

TCP 數據包和 UDP 同樣,都是由首部和數據兩部分組成,惟一不一樣的是,TCP 數據包沒有長度限制,理論上能夠無限長,可是爲了保證網絡的效率,一般 TCP 數據包的長度不會超過IP數據包的長度,以確保單個 TCP 數據包沒必要再分割。

總結一下,傳輸層的主要工做是定義端口,標識應用程序身份,實現端口到端口的通訊,TCP協議能夠保證數據傳輸的可靠性

四、應用層

理論上講,有了以上三層協議的支持,數據已經能夠從一個主機上的應用程序傳輸到另外一臺主機的應用程序了,但此時傳過來的數據是字節流,不能很好的被程序識別,操做性差。所以,應用層定義了各類各樣的協議來規範數據格式,常見的有 HTTP、FTP、SMTP 等,HTTP 是一種比較經常使用的應用層協議,主要用於B/S架構之間的數據通訊,其報文格式以下:

在 Resquest Headers 中,Accept 表示客戶端指望接收的數據格式,而 ContentType 則表示客戶端發送的數據格式;在 Response Headers 中,ContentType 表示服務端響應的數據格式,這裏定義的格式,通常是和 Resquest Headers 中 Accept 定義的格式是一致的。

有了這個規範之後,服務端收到請求之後,就能正確的解析客戶端發來的數據,當請求處理完之後,再按照客戶端要求的格式返回,客戶端收到結果後,按照服務端返回的格式進行解析。

因此應用層的主要工做就是定義數據格式並按照對應的格式解讀數據

五、全流程 首先咱們梳理一下每層模型的職責:

  • 鏈路層:對0和1進行分組,定義數據幀,確認主機的物理地址,傳輸數據;
  • 網絡層:定義IP地址,確認主機所在的網絡位置,並經過IP進行MAC尋址,對外網數據包進行路由轉發;
  • 傳輸層:定義端口,確認主機上應用程序的身份,並將數據包交給對應的應用程序;
  • 應用層:定義數據格式,並按照對應的格式解讀數據。

而後再把每層模型的職責串聯起來,用一句通俗易懂的話講就是:

當你輸入一個網址並按下回車鍵的時候,首先,應用層協議對該請求包作了格式定義;緊接着傳輸層協議加上了雙方的端口號,確認了雙方通訊的應用程序;而後網絡協議加上了雙方的IP地址,確認了雙方的網絡位置;最後鏈路層協議加上了雙方的MAC地址,確認了雙方的物理位置,同時將數據進行分組,造成數據幀,採用廣播方式,經過傳輸介質發送給對方主機。而對於不一樣網段,該數據包首先會轉發給網關路由器,通過屢次轉發後,最終被髮送到目標主機。目標機接收到數據包後,採用對應的協議,對幀數據進行組裝,而後再經過一層一層的協議進行解析,最終被應用層的協議解析並交給服務器處理。

相關文章
相關標籤/搜索