我把自己以往的文章彙總成為了 Github ,歡迎各位大佬 star
https://github.com/crisxuan/bestJavaer
已提交此篇文章
要說我們接觸計算機網路最多的協議,那勢必離不開 TCP/IP 協議了,TCP/IP 協議同時也是網際網路中最為著名的協議,下面我們就來一起聊一下 TCP/IP 協議。
TCP/IP 的歷史背景
最初還沒有 TCP/IP 協議的時候,也就是在 20 世紀 60 年代,許多國家和地區認識到通訊技術的重要性。美國國防部希望能夠研究一種即使通訊線路被破壞也能夠通過其他路線進行通訊的技術。為了實現這種技術,出現了分組
網路。
即使在兩個節點通訊的過程中,幾個節點遭到破壞,卻依然能夠通過改變線路等方式達使兩個節點之間進行通訊。
這種分組網路促進了 ARPANET(Advanced Research Projects Agency Network)
的誕生。ARPANET 是第一個具有分散式控制的廣域包分t組交換網路,也是最早實現 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
討論制定的,而 IETF 本身就是一個允許任何人加入進行討論的組織。
實用性說的是就拿框架來說,如果只浮於理論,而沒有落地的實踐,那麼永遠成為不了主流。
TCP/IP 的標準協議就是我們所熟知的 RFC 文件
,當然你可以在網路上看到。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 地址轉發分包資料。
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