天天看點

TCP/IP 基礎知識總結歡迎大家通路我的 Github

歡迎大家通路我的 Github

https://github.com/crisxuan/bestJavaer

TCP/IP 基礎知識總結歡迎大家通路我的 Github

要說我們接觸計算機網絡最多的協定,那勢必離不開 TCP/IP 協定了,TCP/IP 協定同時也是網際網路中最為著名的協定,下面我們就來一起聊一下 TCP/IP 協定。

TCP/IP 的曆史背景

最初還沒有 TCP/IP 協定的時候,也就是在 20 世紀 60 年代,許多國家和地區認識到通信技術的重要性。美國國防部希望能夠研究一種即使通信線路被破壞也能夠通過其他路線進行通信的技術。為了實作這種技術,出現了

分組

網絡。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

即使在兩個節點通信的過程中,幾個節點遭到破壞,卻依然能夠通過改變線路等方式使兩個節點之間進行通信。

這種分組網絡促進了

ARPANET(Advanced Research Projects Agency Network)

的誕生。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 基礎知識總結歡迎大家通路我的 Github

以上的協定彙總起來,就是 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 基礎知識總結歡迎大家通路我的 Github

下面我們從通信鍊路層開始介紹一下這些層以及與層之間的協定。

通信鍊路層

如果非要細分的話,通信鍊路層也可以分為

實體層

資料鍊路層

實體層

實體層是 TCP/IP 的最底層是負責傳輸的硬體,這種硬體就相當于是以太網或電話線路等實體層的裝置。

資料鍊路層

另外一層是資料鍊路層,資料鍊路層位于實體層和網絡層中間,資料鍊路層定義了在單個鍊路上如何傳輸資料。

網絡層

網絡層主要使用

IP

協定,IP 協定基于 IP 位址轉發分包資料。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

IP 協定的主要作用就是将分組資料包發送到目标主機

TCP/IP 分層中的網際網路層與傳輸層的功能通常由作業系統提供。

IP 還隐含着資料鍊路層的功能,通過 IP 協定,互相通信的主機之間不論經過怎樣的底層資料鍊路,都能夠實作互相通信。

雖然 IP 也是一種分組交換協定,但是 IP 卻不具備重發機制。即使資料沒有到達另一端也不會進行重發,是以 IP 屬于非可靠性協定。

網絡層還有一種協定就是

ICMP

,因為 IP 在資料包的發送過程中可能會出現異常,當 IP 資料包因為異常而無法到達目标位址時,需要給發送端發送一個異常通知,ICMP 的主要功能就在于此了。鑒于此情況,ICMP 也可以被用來診斷網絡情況。

傳輸層

我們上面剛介紹完 TCP/IP 協定最重要的 IP 協定後,下面我們來介紹一下傳輸層協定,TCP 協定是傳輸層協定的一種。

傳輸層就好像高速公路一樣,連接配接兩個城市的道路。下面是網際網路的邏輯通道,你可以把它想象成為高速公路。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

傳輸層最主要的功能就是讓應用層的應用程式之間完成通信和資料交換。在計算機内部運作着很多應用程式,每個應用程式都對應一個端口号,我們一般使用端口号來區分這些應用程式。

傳輸層的協定主要分為面向有連接配接的協定 TCP 和面向無連接配接的協定 UDP

TCP

TCP 是一種可靠的協定,它能夠保證資料包的可靠性傳遞,TCP 能夠正确處理傳輸過程中的丢包、傳輸順序錯亂等異常情況。此外,TCP 還提供擁塞控制用于緩解網絡擁堵。

UDP

UDP 是一種不可靠的協定,它無法保證資料的可靠傳遞,相比 TCP ,UDP 不會檢查資料包是否到達、網絡是否阻塞等情況,但是 UDP 的效率比較高。

UDP 常用于分組資料較少或者廣播、多點傳播等視訊通信和多媒體領域。

應用層

在 TCP/IP 協定簇中,将 OSI 标準模型中的會話層、表示層都歸為了應用層。應用層的架構大多屬于用戶端/服務端模型,提供服務的程式叫做服務端、接受服務的程式叫做用戶端。在這種架構中,服務端通常會提前部署到伺服器上,等待用戶端的連接配接,進而提供服務。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

資料包的發送曆程

下面我們來介紹一下一個資料包是如何經過應用層、運輸層、網絡層和通信鍊路層把一個資料包發送給另外一個資料包的。

資料包結構

我們首先先來認識一下資料包的結構,這裡 cxuan 隻是給你簡單介紹一下,後面的文章會更加詳細的介紹。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

在上面的每個分層中,都會對所發送的資料增加一個

首部

,這個首部中包含了該層必要的資訊。每一層都會對資料進行處理并在資料包中附上這一層的必要資訊。下面我們就來聊一聊資料包的發送過程。

資料包發送曆程

假設主機 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 位址以及标志以太網類型的以太網資料協定等。

下面是完整的處理過程和解析過程。

TCP/IP 基礎知識總結歡迎大家通路我的 Github

如上圖所示,左側是資料的發送處理過程,應用層的資料經過層層處理後會變為可以發送的資料包,經過實體媒體發送至指定主機中。

資料包的接收流程是發送流程的逆序過程,資料包的解析同樣也會經過下面這幾步。

通信鍊路的解析

目标主機收到資料包後,首先會從以太網的首部找到 MAC 位址判斷是否是發給自己的資料包,如果不是發給自己的資料包則會丢棄該資料包。

如果收到的資料包是發送給自己的,就會查找以太網類型判斷是哪種協定,如果是 IP 協定就會扔給 IP 協定進行處理,如果是

ARP

協定就會扔給 ARP 協定進行處理。如果協定類型是一種無法識别的協定,就會将該資料包直接丢棄。

網絡層的解析

經過以太網處理後的資料包扔給網絡層進行處理,我們假設協定類型是 IP 協定,那麼,在 IP 收到資料包後就會解析 IP 首部,判斷 IP 首部中的 IP 位址是否和自己的 IP 位址比對,如果比對則接收資料并判斷上一層協定是 TCP 還是 UDP;如果不比對則直接丢棄。

注意:在路由轉發的過程中,有的時候 IP 位址并不是自己的,這個時候需要借助路由表協助處理。

傳輸層的處理

在傳輸層中,我們預設使用 TCP 協定,在 TCP 處理過程中,首先會計算一下

校驗和

,判斷資料是否被損壞。然後檢查是否按照序号接收資料,最後檢查端口号,确定具體是哪個應用程式。

資料被完整的識别後,會傳遞給由端口号識别的應用程式進行處理。

應用程式的處理

接收端指定的應用程式會處理發送方傳遞過來的資料,通過解碼等操作識别出資料的内容,然後把對應的資料存儲在磁盤上,傳回一個儲存成功的消息給發送方,如果儲存失敗,則傳回錯誤消息。

上面是一個完整的資料包收發過程,在上面的資料收發過程中,涉及到不同層之間的位址、端口号、協定類型等,那麼我們現在就來剖析一下。

資料包經過每層後,該層協定都會在資料包附上包首部,一個完整的包首部圖如下所示

TCP/IP 基礎知識總結歡迎大家通路我的 Github

在資料包的發送過程中,各層依次對資料包添加了首部資訊,每個首部都包含發送端和接收端位址以及上一層的協定類型。以太網會使用 MAC 位址、IP 會使用 IP 位址、TCP/UDP 則會用端口号作為識别兩端主機的位址。

此外,每個分層中的包首部還包含一個識别位,它是用來辨別上一層協定的種類資訊。

總結

這一篇文章 cxuan 還是在和你聊一些基礎知識,這些基礎知識是為下面文章提前預熱準備的,下一篇文章我們會聊到資料鍊路層的相關知識,敬請期待。

如果這篇文章還不錯的話,希望各位小夥伴們點贊、留言、在看、分享,cxuan 謝謝大家。