淺談TCP/IP

Python之禪發表於2018-05-28

這篇文章是球友寒食君的投稿,如果你有優秀的文章也想投稿,歡迎與我聯絡。

每個人每天都在依賴網路通訊,那麼這些裝置之間究竟是如何通訊的?我在這裡寫下這篇文章,你卻能在千山萬水之外閱讀它。今天簡要談一下通訊協議。

網路通訊協議

網路通訊協議主要是對資訊的傳輸速率、傳輸程式碼、程式碼結構、傳輸控制步驟、差錯控制等做出的規定並制訂的標準。

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

  • 語義:需要的控制資訊以及執行的動作

  • 語法:交換的資料或控制資訊的格式與結構

  • 時序:雙方的應答關係,包括速度的匹配和順序

OSI參考模型

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

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

640?wx_fmt=png

TCP/IP協議簇

介紹

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

640?wx_fmt=png


有人也將其分為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建立連線在理論上似乎只要一次請求和一次響應就可以了,但是在實際情況中,請求或者響應可能會丟失,此時需要重傳來建立連線。假如只通過一次請求和一次響應,可能會出現以下問題(圖片轉自知乎使用者@大閒人柴毛毛):

640?wx_fmt=png

640?wx_fmt=png


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

640?wx_fmt=png

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

640?wx_fmt=png

四次揮手斷開連線

640?wx_fmt=png


分層分析和排查故障

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

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

一般有兩種排查方式:

  • 從低層開始,首先檢查物理層,比如檢視網路線纜是否鬆動損壞。這一般用於剛組建網路或者調整了網路線纜的情況。否則效率太低了。


  • 從高層開始,首先檢查應用層,比如檢視瀏覽器是否正常配置,這一般用於網路環境比較穩定的情況下。


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

640?wx_fmt=png

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

假如在呼叫第三方服務時,沒有返回資料,可能是什麼問題?

1、ping目標遠端計算機

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

若失敗,則繼續2.

2、ping同一子網的閘道器,確認正在使用的這臺主機是否連線到了本地網路。

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

若失敗,則繼續3.

3、ping環回地址127.0.0.1。


若成功,說明本地閘道器和當前計算機之間通訊有問題。

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

640?wx_fmt=jpeg
(作者的公眾號)

相關文章