tcp/ip協議通俗理解(tcp協議和ip協議的區別)

努力的最大意義是讓自己隨時有能力跳出自己厭惡的圈子

簡介

TCP/IP傳輸協議,即傳輸控制/網路協議,也叫作網路通訊協議。它是在網路的使用中的最基本的通訊協議。

TCP/IP傳輸協議對網際網路中各部分進行通訊的標準和方法進行了規定。並且,TCP/IP傳輸協議是保證網路資料資訊及時、完整傳輸的兩個重要的協議。

TCP/IP傳輸協議是嚴格來說是一個四層的體系結構,應用層、傳輸層、網路層和網路介面層都包含其中。

應用層

  1. 為作業系統或網路應用程式提供訪問網路服務的介面;
  2. 主要協議:FTP(檔案傳送協議)、Telnet(遠端登入協議)、DNS(域名解析協議)、SMTP(郵件傳送協議),POP3協議(郵局協議),HTTP協議(Hyper Text Transfer Protocol)。
  3. 資料傳輸基本單位為報文。

傳輸層

傳輸層最主要的功能就是讓應用層的應用程式之間完成通訊和資料交換。

在計算機內部執行著很多應用程式,每個應用程式都對應一個埠號,我們一般使用埠號來區分這些應用程式。

傳輸層的協議主要分為面向有連線的協議 TCP 和麵向無連線的協議 UDP

TCP

  • TCP 是一種可靠的協議,它能夠保證資料包的可靠性交付;
  • TCP 能夠正確處理傳輸過程中的丟包、傳輸順序錯亂等異常情況;
  • TCP 還提供擁塞控制用於緩解網路擁堵。

UDP

  • UDP 是一種不可靠的協議,它無法保證資料的可靠交付,相比 TCP ,UDP 不會檢查資料包是否到達、網路是否阻塞等情況,但是 UDP 的效率比較高;
  • UDP 常用於分組資料較少或者廣播、多播等視訊通訊和多媒體領域。

網路層

網路層的目的是實現兩個端系統之間的資料透明傳送,具體功能包括定址和路由選擇、連線的建立、保持和終止等。它提供的服務使傳輸層不需要了解網路中的資料傳輸和交換技術。

包含的主要協議:

  • IP協議(Internet Protocol,因特網互聯協議)
  • ICMP協議(Internet Control Message Protocol,因特網控制報文協議)

網路介面層

通訊鏈路層也可以分為 物理層 和 資料鏈路層

物理層:是 TCP/IP 的最底層是負責傳輸的硬體,這種硬體就相當於是乙太網或電話線路等物理層的裝置。

資料鏈路層:位於物理層和網路層中間,資料鏈路層定義了在單個鏈路上如何傳輸資料。

資料鏈路層主要協議有ARP、RARP,主要功能是提供鏈路管理錯誤檢測、對不同通訊媒介有關資訊細節問題進行有效處理等。

資料包傳送過程

來說一下網路資料包傳送的過程:就以我們QQ聊天為例

假設QQ1 和QQ2 進行通訊,QQ1 想要向QQ2 傳送一個資料包,都會經歷哪些奇特的操作?

1、應用層處理

QQ1 也就是使用者開啟了一個聊天視窗輸入了你好,然後點選了傳送,那麼這個你好就作為一個資料包遨遊在了網路中,等下還沒完呢,應用層還需要對這個資料包進行處理,包括字元編碼、格式化等等,這一層其實是 OSI 中表現層做的工作,只不過在 TCP/IP 協議中都歸為了應用層。

資料包在傳送的那一刻建立 TCP 連線,這個連線相當於通道,在這之後其他資料包也會使用通道傳輸資料。

2、傳輸層處理

TCP 會根據應用的指示,負責建立連線、傳送資料和斷開連線。

TCP 會在應用資料層的前端附加一個 TCP 首部欄位,TCP 首部包含了源埠號 和 目的埠號,這兩個埠號用於表明資料包是從哪裡發出的,需要傳送到哪個應用程式上;TCP 首部還包含序號,用以表示該包中資料是傳送端整個資料中第幾個位元組的序列號;TCP 首部還包含 校驗和,用於判斷資料是否損壞,隨後將 TCP 頭部附加在資料包的首部傳送給 IP。

3、網路層的處理

網路層主要負責處理資料包的是 IP 協議,IP 協議將 TCP 傳過來的 TCP 首部和資料結合當作自己的資料,並在 TCP 首部的前端加上自己的 IP 首部。因此,IP 資料包後面會緊跟著 TCP 資料包,後面才是資料本身。IP 首部包含目的和源地址,緊隨在 IP 首部的還有用來判斷後面是 TCP 還是 UDP 的資訊。

IP 包生成後,會由路由控制表判斷應該傳送至哪個主機,IP 修飾後的資料包繼續向下傳送給路由器或者網路介面的驅動程式,從而實現真正的資料傳輸。

4、鏈路層的處理

經由 IP 傳過來的資料包,乙太網會給資料附上乙太網首部並進行傳送處理。乙太網首部包含接收端的 MAC 地址、傳送端的 MAC 地址以及標誌乙太網型別的乙太網資料協議等。

5、鏈路層解析

QQ2收到資料包後,首先會從乙太網的首部找到 MAC 地址判斷是否是發給自己的資料包,如果不是發給自己的資料包則會丟棄該資料包。

如果收到的資料包是傳送給自己的,就會查詢乙太網型別判斷是哪種協議,如果是 IP 協議就會扔給 IP 協議進行處理,如果是 ARP 協議就會扔給 ARP 協議進行處理。如果協議型別是一種無法識別的協議,就會將該資料包直接丟棄。

6、網路層解析

經過乙太網處理後的資料包扔給網路層進行處理,我們假設協議型別是 IP 協議,那麼,在 IP 收到資料包後就會解析 IP 首部,判斷 IP 首部中的 IP 地址是否和自己的 IP 地址匹配,如果匹配則接收資料並判斷上一層協議是 TCP 還是 UDP;如果不匹配則直接丟棄。

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

7、傳輸層解析

在傳輸層中,我們預設使用 TCP 協議,在 TCP 處理過程中,首先會計算一下 校驗和,判斷資料是否被損壞。然後檢查是否按照序號接收資料,最後檢查埠號,確定具體是哪個應用程式。

資料被完整的識別後,會傳遞給由埠號識別的應用程式進行處理。

8、應用層解析

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


TCP 三次握手四次揮手

三次握手

  1. 剛開始客戶端和服務端都是處於關閉的狀態,而且伺服器 B 端一直處於監聽的狀態,時刻監聽是否有建立連線的請求;
  2. 當有客戶端需要建立連線的時候就會傳送一個確定連線的報文,此報文是同步報文SYN = 1,並且會生成一個隨機的序號 seq = x,這是第一次握手;
  3. 當服務端接收到請求連線報文的時候,會傳送一個同步報文確認報文,此報文 SYN = 1,並且 ACK = 1,同時服務端也會隨機生成一個 seq = y,並將 ack 設定成 x 1,回傳給客戶端,這是第二次握手;
  4. 當客戶端接收到服務端的 ACK 報文後,會回覆一個 ACK 確認報文,用於確認確認報文已經收到,此報文 ACK = 1,seq = x 1, ack = y 1,這是第三次握手;

說明一下:大寫的 ACK 表示報文的型別是確認報文,小寫的 ack 是報文裡面的確認號,這個確認號是上一次握手對方的 seq 值加 1 得到。

為什麼是三次握手

上面是整個三次握手的過程,現在我們分析一下為什麼三次握手可以可靠的確定客戶端和服務端都能支援的傳送和接收資料。

第一次握手:第一次握手是客戶端傳送同步報文到服務端,這個時候客戶端是知道自己具備傳送資料的能力的,但是不知道服務端是否有接收和傳送資料的能力;

第二次握手:當服務端接收到同步報文後,回覆確認同步報文,此時服務端是知道客戶端具有傳送報文的能力,並且知道自己具有接收和傳送資料的能力,但是並不知道客戶端是否有接收資料的能力;

第三次握手:當客戶端收到服務端的確認報文後,知道服務端具備接收和傳送資料的能力,但是此時服務端並不知道自己具有接收的能力,所以還需要傳送一個確認報文,告知服務端自己是具有接收能力的。

當整個三次握手結束過後,客戶端和服務端都知道自己和對方具備傳送和接收資料的能力,隨後整個連線建立就完成了,可以進行後續資料的傳輸了。

四次揮手

三次握手是為了建立可靠的資料傳輸通道,四次揮手則是為了保證等資料完成的被接收完再關閉連線。既然提到需要保證資料完整的傳輸完,那就需要保證雙方都達到關閉連線的條件才能斷開。

從上圖中我們可以看到:

  1. 客戶端發起 FIN 斷開連線的報文,攜帶隨機生成的 seq 值 u,傳送給服務端,並且自己處於 FIN-WSIT 狀態,這是第一次揮手;
  2. 服務端接收到 FIN 報文後,回覆一個確認報文,其中 ACK = 1,隨機生成一個 seq,以及 ack = u 1,這是第二次揮手;
  3. 當服務端資料傳送完了過後,再傳送一個 FIN 報文給客戶端,通知客戶端,服務端準備關閉連線了,此報文 FIN = 1,ACK = 1,ack = u 1,seq = w,這是第三次揮手;
  4. 當客戶端收到 FIN 確認報文時再傳送一個FIN 的確認報文,其中 ACK = 1,seq = u 1,ack = w 1,並進入 TIME-WAIT 狀態,當等待 2MSL 後關閉連線,這是第四次揮手。注意:這個時候 TCP 連線還沒有釋放。必須經過時間等待的設定,也就是 2MSL 後,客戶端才會進入 CLOSED 狀態,時間 MSL 叫做最長報文段壽命(Maximum Segment Lifetime)。

為什麼是四次揮手

第一次揮手:客戶端發起關閉連線的請求給服務端;

第二次揮手:服務端收到關閉請求的時候可能這個時候資料還沒傳送完,所以服務端會先回復一個確認報文,表示自己知道客戶端想要關閉連線了,但是因為資料還沒傳輸完,所以還需要等待;

第三次揮手:當資料傳輸完了,服務端會主動傳送一個 FIN 報文,告訴客戶端,表示資料已經傳送完了,服務端這邊準備關閉連線了。

第四次揮手:當客戶端收到服務端的 FIN 報文過後,會回覆一個 ACK 報文,告訴服務端自己知道了,再等待一會就關閉連線。

為什麼客戶端在第四次揮手後還會等待 2MSL?

等待 2MSL 是因為保證服務端接收到了 ACK 報文,因為網路是複雜了,很有可能 ACK 報文丟失了,如果服務端沒接收到 ACK 報文的話,會重新傳送 FIN 報文,只有當客戶端等待了 2MSL 都沒有收到重發的 FIN 報文時就表示服務端是正常收到了 ACK 報文,那麼這個時候客戶端就可以關閉了。

作者:初念初戀
       連結:
       https://juejin.cn/post/6953407482861453348