淺談TCP/IP

通信 硬件 技術 中央處理器 啟迪雲Tuscloud 2019-05-20

今天簡要談一下通信協議。

網絡通信協議

網絡通信協議主要是對信息的傳輸速率、傳輸代碼、代碼結構、傳輸控制步驟、差錯控制等做出的規定並制訂的標準。

協議主要由以下三個部分組成:

  • 語義:需要的控制信息以及執行的動作
  • 語法:交換的數據或控制信息的格式與結構
  • 時序:雙方的應答關係,包括速度的匹配和順序

OSI參考模型

OSI不是規範,準確的來說,是一個抽象的參考模型,他沒有提供任何具體的實現標準。現有網絡大多數可以通過OSI模型來進行分析,瞭解OSI模型有助於分析和管理網絡。

OSI是一個分層結構,共有七層:

淺談TCP/IP


TCP/IP協議簇

介紹

TCP/IP協議簇先於OSI參考模型開發,因此層次無法完全和OSI模型對應起來。他將不同的通信功能集成到不同的網絡層次,形成了一個具有四層的體系結構。

淺談TCP/IP


有人也將其分為5層,將鏈路層從網絡接口層剝離出來。

各層的職責

  • 網絡接口層:主要負責向網絡物理介質發送/接收數據包。因為TCP/IP沒有對物理層和鏈路層進行定義,所以它支持各種底層的網絡技術和標準。
  • 網絡層:負責處理IP數據包的傳輸、路由選擇、流量控制和擁塞控制。ARP/RARP協議用於將IP地址與底層物理地址進行相互轉換。IP協議既是網絡層的核心協議,也是整個TCP/IP協議簇的核心協議。
  • 傳輸層:為兩臺主機提供端到端的通信。傳輸層主要包括傳輸控制協議TCP(提供可靠的面向連接的傳輸服務),用戶數據報協議UDP(簡單高效的無連接的服務)。可以根據上層應用的實際需求來選擇
  • 應用層:直接為特定的應用程序提供服務,如文件傳輸協議FTP,簡單郵件傳輸協議SMTP,超文本傳輸協議HTTP。

重要概念

面向連接與無連接:

想要通過面向連接的協議在兩臺主機之間通信,需要兩臺主機之間首先建立連接,才能通信。如何建立/斷開連接?這就涉及到三次握手和四次揮手。後續再講。

而無連接的協議在通信前不需要建立連接,就像寄信,只需要知道目的地地址就行了(請注意,這只是一個比喻,發郵件並不是使用的無連接協議,因為無連接的協議通常是不可靠的)

可靠與不可靠

可靠的協議保證數據能傳輸到目的地,而且內容不會發生變化。TCP就是一種可靠的協議。

不可靠的協議不能保證將數據傳送到目的地,但是它會盡力而為,還會檢驗送到目的地的數據是否完整。UDP就是一種不可靠的協議。

那麼有人可能會說了?既然有了可靠的協議,還需要不可靠的協議幹什麼?不是多此一舉嗎?非也,下面詳細說說TCP和UDP的優缺點。

字節流與數據報

字節流協議表示可以將發送方傳輸給接收方的數據看作是字節流。先發出的數據將會被先接收到。TCP屬於字節流協議。

數據報協議是將數據一個個傳送,沒有順序。UDP就是一種數據報協議。

套接字(Socket)

網絡層中,IP利用協議號來指定傳輸協議,傳輸層中,TCP/UDP使用端口號來區分應用程序。將一個IP地址和一個端口號結合,就形成了一個套接字(也稱為插座),套接字用來標明網絡中的唯一網絡進程。

TCP與UDP的優缺點

TCP:

  • 優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
  • 缺點:慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每臺設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬件資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。

UDP:

  • 優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊。
  • 缺點:不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網絡質量不好,就會很容易丟包。

那麼,哪些場景使用TCP,哪些場景使用UDP?

TCP:郵件,遠程登錄等等。UDP:NDS,廣播,即時通訊,視頻電話等等。

TCP的三次握手和四次揮手

三次握手建立連接

TCP建立連接在理論上似乎只要一次請求和一次響應就可以了,但是在實際情況中,請求或者響應可能會丟失,此時需要重傳來建立連接。假如只通過一次請求和一次響應,可能會出現以下問題(圖片轉自知乎用戶@大閒人柴毛毛):

淺談TCP/IP


淺談TCP/IP


針對這個問題,連接時的“三次握手”可以有效解決。(其實無論握手多少次,都不能完全保證一條信道是完全可靠的,只能說明其是可用的,三次握手是能互相明確對方,同時開銷是最小的,所以常用三次握手建立連接)

淺談TCP/IP


下面我還是畫一張圖來描述這個流程:

淺談TCP/IP


四次揮手斷開連接

淺談TCP/IP


分層分析和排查故障

之前一次電話面試的時候,面試官問我:假如在調用第三方服務時,沒有返回數據,可能是什麼問題?我當時回答說通過返回的狀態碼來判斷,他補充狀態碼也沒返回。我一時語塞,不知道面試官想要考察什麼,只好尷尬地跳過。(我比較菜)

後來,才想到通過對協議簇的分層分析可以較為有效地排查故障。

一般有兩種排查方式:

  • 從低層開始,首先檢查物理層,比如查看網絡線纜是否鬆動損壞。這一般用於剛組建網絡或者調整了網絡線纜的情況。否則效率太低了。
  • 從高層開始,首先檢查應用層,比如查看瀏覽器是否正常配置,這一般用於網絡環境比較穩定的情況下。

為了高效解決問題,在實際應用中,往往會從中間層開始檢測,這似乎也有點像二分查找思想。

淺談TCP/IP


那麼回到一開始的一個問題:

假如在調用第三方服務時,沒有返回數據,可能是什麼問題?

1、ping目標遠程計算機

若成功則說明網絡是正常的,可以去考慮更高層的事,需要去測試服務或應用程序。

若失敗,則繼續2.

2、ping同一子網的網關,確認正在使用的這臺主機是否連接到了本地網絡。

若成功,說明本地網關和遠程目標計算機之間的連通有問題,可以跟蹤測試路由。

若失敗,則繼續3.

3、ping環回地址127.0.0.1。

若成功,說明本地網關和當前計算機之間通信有問題。

若失敗,檢查IP是否有問題,若有問題,再檢查本地TCP/IP協議軟件是否有問題等等。

相關推薦

推薦中...