要説我們接觸計算機網絡最多的協議,那勢必離不開 TCP/IP 協議了,TCP/IP 協議同時也是互聯網中最為著名的協議,下面我們就來一起聊一下 TCP/IP 協議。
TCP/IP 的歷史背景
最初還沒有 TCP/IP 協議的時候,也就是在 20 世紀 60 年代,許多國家和地區認識到通信技術的重要性。美國國防部希望能夠研究一種即使通信線路被破壞也能夠通過其他路線進行通信的技術。為了實現這種技術,出現了網絡。
即使在兩個節點通信的過程中,幾個節點遭到破壞,卻依然能夠通過改變線路等方式使兩個節點之間進行通信。
這種分組網絡促進了 的誕生。ARPANET 是第一個具有分佈式控制的廣域包分組交換網絡,也是最早實現 TCP/IP 協議的前身。
ARPANET 其實是由 美國國防部高級研究計劃局 計劃建立。
所以,計算機網絡的出現在最一開始是因為軍事研究目的。
20 世紀 90 年代,IOS 開展了 OSI 這一國際標準化的進程,然而卻沒有取得實質性的進展,但是卻使 TCP/IP 協議得到了廣泛使用。
這種致使 TCP/IP 協議快速發展的原因可能是由於 TCP/IP 的標準化。也就是説 TCP/IP 協議中會涉及到 OSI 所沒有的標準,而這種標準將是我們接下來主要探討的內容。
這裏我們先來認識一下 TCP/IP 協議,TCP/IP 協議説的不僅僅只是 TCP 和 IP 這兩種協議,實際上,TCP/IP 指的是協議簇,協議簇是啥呢?簡單來説就是一系列協議的綜合,如果下次再問你 TCP/IP 協議有哪些的話,可以把下面這張圖甩給他
以上的協議彙總起來,就是 TCP/IP 協議簇。
TCP/IP 標準
TCP/IP 相較於其他協議的標準,更注重兩點: 和 ,即標準化能否被實際使用。
開放性説的是 TCP/IP 是由 討論制定的,而 IETF 本身就是一個允許任何人加入進行討論的組織。
實用性説的是就拿框架來説,如果只浮於理論,而沒有落地的實踐,那麼永遠成為不了主流。
TCP/IP 的標準協議就是我們所熟知的 ,當然你可以在網絡上看到。RFC 不僅規範了協議標準,還包含了協議的實現和使用信息。
關於更多 RFC 協議,你可以看一下官方文檔 https://www.rfc-editor.org/rfc-index.html
這裏我們不再詳細展開介紹了,我們這篇文章的重點要放在對 TCP/IP 的研究上。
TCP/IP 協議簇
下面我們就開始聊一聊 TCP/IP 協議簇。
TCP/IP 協議是我們程序員接觸最多的協議,OSI 模型共有七層,從下到上分別是物理層、數據鏈路層、網絡層、運輸層、會話層、表示層和應用層。但是這顯然是有些複雜的,所以在 TCP/IP 協議中,它們被簡化為了四個層次
下面我們從通信鏈路層開始介紹一下這些層以及與層之間的協議。
通信鏈路層
如果非要細分的話,通信鏈路層也可以分為 和 。
物理層
物理層是 TCP/IP 的最底層是負責傳輸的硬件,這種硬件就相當於是以太網或電話線路等物理層的設備。
數據鏈路層
另外一層是數據鏈路層,數據鏈路層位於物理層和網絡層中間,數據鏈路層定義了在單個鏈路上如何傳輸數據。
網絡層
網絡層主要使用 協議,IP 協議基於 IP 地址轉發分包數據。
IP 協議的主要作用就是將分組數據包發送到目標主機
TCP/IP 分層中的互聯網層與傳輸層的功能通常由操作系統提供。
IP 還隱含着數據鏈路層的功能,通過 IP 協議,相互通信的主機之間不論經過怎樣的底層數據鏈路,都能夠實現相互通信。
雖然 IP 也是一種分組交換協議,但是 IP 卻不具備重發機制。即使數據沒有到達另一端也不會進行重發,所以 IP 屬於非可靠性協議。
網絡層還有一種協議就是 ,因為 IP 在數據包的發送過程中可能會出現異常,當 IP 數據包因為異常而無法到達目標地址時,需要給發送端發送一個異常通知,ICMP 的主要功能就在於此了。鑑於此情況,ICMP 也可以被用來診斷網絡情況。
傳輸層
我們上面剛介紹完 TCP/IP 協議最重要的 IP 協議後,下面我們來介紹一下傳輸層協議,TCP 協議是傳輸層協議的一種。
傳輸層就好像高速公路一樣,連接兩個城市的道路。下面是互聯網的邏輯通道,你可以把它想象成為高速公路。
傳輸層最主要的功能就是讓應用層的應用程序之間完成通信和數據交換。在計算機內部運行着很多應用程序,每個應用程序都對應一個端口號,我們一般使用端口號來區分這些應用程序。
傳輸層的協議主要分為面向有連接的協議 TCP 和麪向無連接的協議 UDP
TCP
TCP 是一種可靠的協議,它能夠保證數據包的可靠性交付,TCP 能夠正確處理傳輸過程中的丟包、傳輸順序錯亂等異常情況。此外,TCP 還提供擁塞控制用於緩解網絡擁堵。
UDP
UDP 是一種不可靠的協議,它無法保證數據的可靠交付,相比 TCP ,UDP 不會檢查數據包是否到達、網絡是否阻塞等情況,但是 UDP 的效率比較高。
UDP 常用於分組數據較少或者廣播、多播等視頻通信和多媒體領域。
應用層
在 TCP/IP 協議簇中,將 OSI 標準模型中的會話層、表示層都歸為了應用層。應用層的架構大多屬於客户端/服務端模型,提供服務的程序叫做服務端、接受服務的程序叫做客户端。在這種架構中,服務端通常會提前部署到服務器上,等待客户端的連接,從而提供服務。
數據包的發送歷程
下面我們來介紹一下一個數據包是如何經過應用層、運輸層、網絡層和通信鏈路層把一個數據包發送給另外一個數據包的。
數據包結構
我們首先先來認識一下數據包的結構,這裏 cxuan 只是給你簡單介紹一下,後面的文章會更加詳細的介紹。
在上面的每個分層中,都會對所發送的數據增加一個 ,這個首部中包含了該層必要的信息。每一層都會對數據進行處理並在數據包中附上這一層的必要信息。下面我們就來聊一聊數據包的發送過程。
數據包發送歷程
假設主機 A 和主機 B 進行通信,主機 A 想要向主機 B 發送一個數據包,都會經歷哪些奇特的操作?
應用層的處理
主機 A 也就是用户點擊了某個應用或者打開了一個聊天窗口輸入了,然後點擊了發送,那麼這個 cxuan 就作為一個數據包遨遊在了網絡中,等下還沒完呢,應用層還需要對這個數據包進行處理,包括字符編碼、格式化等等,這一層其實是 OSI 中表現層做的工作,只不過在 TCP/IP 協議中都歸為了應用層。
數據包在發送的那一刻建立 TCP 連接,這個連接相當於通道,在這之後其他數據包也會使用通道傳輸數據。
傳輸層的處理
為了描述信息能準確的到達另一方,我們使用 TCP 協議來進行描述。TCP 會根據應用的指示,負責建立連接、發送數據和斷開連接。
TCP 會在應用數據層的前端附加一個 TCP 首部字段,TCP 首部包含了 和 ,這兩個端口號用於表明數據包是從哪裏發出的,需要發送到哪個應用程序上;TCP 首部還包含,用以表示該包中數據是發送端整個數據中第幾個字節的序列號;TCP 首部還包含 ,用於判斷數據是否損壞,隨後將 TCP 頭部附加在數據包的首部發送給 IP。
網絡層的處理
網絡層主要負責處理數據包的是 IP 協議,IP 協議將 TCP 傳過來的 TCP 首部和數據結合當作自己的數據,並在 TCP 首部的前端加上自己的 IP 首部。因此,IP 數據包後面會緊跟着 TCP 數據包,後面才是數據本身。IP 首部包含目的和源地址,緊隨在 IP 首部的還有用來判斷後面是 TCP 還是 UDP 的信息。
IP 包生成後,會由路由控制表判斷應該發送至哪個主機,IP 修飾後的數據包繼續向下發送給路由器或者網絡接口的驅動程序,從而實現真正的數據傳輸。
如果不知道目標主機的 IP 地址,可以利用 地址解析協議進行查找。
通信鏈路層的處理
經由 IP 傳過來的數據包,以太網會給數據附上以太網首部並進行發送處理。以太網首部包含接收端的 MAC 地址、發送端的 MAC 地址以及標誌以太網類型的以太網數據協議等。
下面是完整的處理過程和解析過程。
如上圖所示,左側是數據的發送處理過程,應用層的數據經過層層處理後會變為可以發送的數據包,經過物理介質發送至指定主機中。
數據包的接收流程是發送流程的逆序過程,數據包的解析同樣也會經過下面這幾步。
通信鏈路的解析
目標主機收到數據包後,首先會從以太網的首部找到 MAC 地址判斷是否是發給自己的數據包,如果不是發給自己的數據包則會丟棄該數據包。
如果收到的數據包是發送給自己的,就會查找以太網類型判斷是哪種協議,如果是 IP 協議就會扔給 IP 協議進行處理,如果是 協議就會扔給 ARP 協議進行處理。如果協議類型是一種無法識別的協議,就會將該數據包直接丟棄。
網絡層的解析
經過以太網處理後的數據包扔給網絡層進行處理,我們假設協議類型是 IP 協議,那麼,在 IP 收到數據包後就會解析 IP 首部,判斷 IP 首部中的 IP 地址是否和自己的 IP 地址匹配,如果匹配則接收數據並判斷上一層協議是 TCP 還是 UDP;如果不匹配則直接丟棄。
注意:在路由轉發的過程中,有的時候 IP 地址並不是自己的,這個時候需要藉助路由表協助處理。
傳輸層的處理
在傳輸層中,我們默認使用 TCP 協議,在 TCP 處理過程中,首先會計算一下 ,判斷數據是否被損壞。然後檢查是否按照序號接收數據,最後檢查端口號,確定具體是哪個應用程序。
數據被完整的識別後,會傳遞給由端口號識別的應用程序進行處理。
應用程序的處理
接收端指定的應用程序會處理發送方傳遞過來的數據,通過解碼等操作識別出數據的內容,然後把對應的數據存儲在磁盤上,返回一個保存成功的消息給發送方,如果保存失敗,則返回錯誤消息。
上面是一個完整的數據包收發過程,在上面的數據收發過程中,涉及到不同層之間的地址、端口號、協議類型等,那麼我們現在就來剖析一下。
數據包經過每層後,該層協議都會在數據包附上包首部,一個完整的包首部圖如下所示
在數據包的發送過程中,各層依次對數據包添加了首部信息,每個首部都包含發送端和接收端地址以及上一層的協議類型。以太網會使用 MAC 地址、IP 會使用 IP 地址、TCP/UDP 則會用端口號作為識別兩端主機的地址。
此外,每個分層中的包首部還包含一個識別位,它是用來標識上一層協議的種類信息。
我是敖丙,你知道的越多,你不知道的越多,我們下期見!