我把本身以往的文章彙總成爲了 Github ,歡迎各位大佬 star
https://github.com/crisxuan/bestJavaer
已提交此篇文章html
要說咱們接觸計算機網絡最多的協議,那勢必離不開 TCP/IP 協議了,TCP/IP 協議同時也是互聯網中最爲著名的協議,下面咱們就來一塊兒聊一下 TCP/IP 協議。前端
最初尚未 TCP/IP 協議的時候,也就是在 20 世紀 60 年代,許多國家和地區認識到通訊技術的重要性。美國國防部但願可以研究一種即便通訊線路被破壞也可以經過其餘路線進行通訊的技術。爲了實現這種技術,出現了分組
網絡。git
即便在兩個節點通訊的過程當中,幾個節點遭到破壞,卻依然可以經過改變線路等方式達使兩個節點之間進行通訊。程序員
這種分組網絡促進了 ARPANET(Advanced Research Projects Agency Network)
的誕生。ARPANET 是第一個具備分佈式控制的廣域包分t組交換網絡,也是最先實現 TCP/IP 協議的前身。github
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 是由 IETF
討論制定的,而 IETF 自己就是一個容許任何人加入進行討論的組織。
實用性說的是就拿框架來講,若是隻浮於理論,而沒有落地的實踐,那麼永遠成爲不了主流。
TCP/IP 的標準協議就是咱們所熟知的 RFC 文檔
,固然你能夠在網絡上看到。RFC 不只規範了協議標準,還包含了協議的實現和使用信息。
關於更多 RFC 協議,你能夠看一下官方文檔 https://www.rfc-editor.org/rfc-index.html
這裏咱們再也不詳細展開介紹了,咱們這篇文章的重點要放在對 TCP/IP 的研究上。
下面咱們就開始聊一聊 TCP/IP 協議簇。
TCP/IP 協議是咱們程序員接觸最多的協議,OSI 模型共有七層,從下到上分別是物理層、數據鏈路層、網絡層、運輸層、會話層、表示層和應用層。可是這顯然是有些複雜的,因此在 TCP/IP 協議中,它們被簡化爲了四個層次
下面咱們從通訊鏈路層開始介紹一下這些層以及與層之間的協議。
若是非要細分的話,通訊鏈路層也能夠分爲 物理層
和 數據鏈路層
。
物理層是 TCP/IP 的最底層是負責傳輸的硬件,這種硬件就至關因而以太網或電話線路等物理層的設備。
另一層是數據鏈路層,數據鏈路層位於物理層和網絡層中間,數據鏈路層定義了在單個鏈路上如何傳輸數據。
網絡層主要使用 IP
協議,IP 協議基於 IP 地址轉發分包數據。
IP 協議的主要做用就是將分組數據包發送到目標主機
TCP/IP 分層中的互聯網層與傳輸層的功能一般由操做系統提供。
IP 還隱含着數據鏈路層的功能,經過 IP 協議,相互通訊的主機之間不論通過怎樣的底層數據鏈路,都可以實現相互通訊。
雖然 IP 也是一種分組交換協議,可是 IP 卻不具有重發機制。即便數據沒有到達另外一端也不會進行重發,因此 IP 屬於非可靠性協議。
網絡層還有一種協議就是 ICMP
,由於 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
,而後點擊了發送,那麼這個 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 地址,能夠利用
ARP(Address Resolution Protocol)
地址解析協議進行查找。
通訊鏈路層的處理
經由 IP 傳過來的數據包,以太網會給數據附上以太網首部並進行發送處理。以太網首部包含接收端的 MAC 地址、發送端的 MAC 地址以及標誌以太網類型的以太網數據協議等。
下面是完整的處理過程和解析過程。
如上圖所示,左側是數據的發送處理過程,應用層的數據通過層層處理後會變爲能夠發送的數據包,通過物理介質發送至指定主機中。
數據包的接收流程是發送流程的逆序過程,數據包的解析一樣也會通過下面這幾步。
通訊鏈路的解析
目標主機收到數據包後,首先會從以太網的首部找到 MAC 地址判斷是不是發給本身的數據包,若是不是發給本身的數據包則會丟棄該數據包。
若是收到的數據包是發送給本身的,就會查找以太網類型判斷是哪一種協議,若是是 IP 協議就會扔給 IP 協議進行處理,若是是 ARP
協議就會扔給 ARP 協議進行處理。若是協議類型是一種沒法識別的協議,就會將該數據包直接丟棄。
網絡層的解析
通過以太網處理後的數據包扔給網絡層進行處理,咱們假設協議類型是 IP 協議,那麼,在 IP 收到數據包後就會解析 IP 首部,判斷 IP 首部中的 IP 地址是否和本身的 IP 地址匹配,若是匹配則接收數據並判斷上一層協議是 TCP 仍是 UDP;若是不匹配則直接丟棄。
注意:在路由轉發的過程當中,有的時候 IP 地址並非本身的,這個時候須要藉助路由表協助處理。
傳輸層的處理
在傳輸層中,咱們默認使用 TCP 協議,在 TCP 處理過程當中,首先會計算一下 校驗和
,判斷數據是否被損壞。而後檢查是否按照序號接收數據,最後檢查端口號,肯定具體是哪一個應用程序。
數據被完整的識別後,會傳遞給由端口號識別的應用程序進行處理。
應用程序的處理
接收端指定的應用程序會處理髮送方傳遞過來的數據,經過解碼等操做識別出數據的內容,而後把對應的數據存儲在磁盤上,返回一個保存成功的消息給發送方,若是保存失敗,則返回錯誤消息。
上面是一個完整的數據包收發過程,在上面的數據收發過程當中,涉及到不一樣層之間的地址、端口號、協議類型等,那麼咱們如今就來剖析一下。
數據包通過每層後,該層協議都會在數據包附上包首部,一個完整的包首部圖以下所示
在數據包的發送過程當中,各層以此對數據包添加了首部信息,每一個首部都包含發送端和接收端地址以及上一層的協議類型。以太網會使用 MAC 地址、IP 會使用 IP 地址、TCP/UDP 則會用端口號做爲識別兩端主機的地址。
此外,每一個分層中的包首部還包含一個識別位,它是用來標識上一層協議的種類信息。
這一篇文章 cxuan 仍是在和你聊一些基礎知識,這些基礎知識是爲下面文章提早預熱準備的,下一篇文章咱們會聊到數據鏈路層的相關知識,敬請期待。
你好,我是 cxuan,一枚技術人。我一共寫了六本 PDF
《Java 核心技術總結》
《HTTP 核心總結》
《程序員必知的基礎知識》
《操做系統核心總結》
《Java 核心基礎 2.0》
《Java 面試題總結》
如今我把百度連接給你們放出來了,你們能夠點擊下方的連接領取
連接: https://pan.baidu.com/s/1mYAeS9hIhdMFh2rF3FDk0A 密碼: p9rs