1. 程式人生 > >網路七層模型與TCP/UDP

網路七層模型與TCP/UDP

        為了使全球範圍內不同的計算機廠家能夠相互之間能夠比較協調的進行通訊,這個時候就有必要建立一種全球範圍內的通用協議,以規範各個廠家之間的通訊介面,這就是網路七層模型的由來。本文首先會對網路七層模型的功能進行介紹,然後會講解傳輸層的兩個重要協議:TCP和UDP協議,並且會著重講解TCP協議中的三次握手和四次揮手的過程。

1. 網路七層模型

        關於網路七層模型,我們首先以一個圖例來展示其功能:

  • 應用層:主要指的是應用程式部分,比如我們的Java程式,應用層所產生的資料成為應用層資料,典型的應用層協議,比如有HTTP協議,dubbo的rpc協議,這些都是由我們的應用層程式自己定義的;
  • 表示層:這一層主要是對應用層的資料進行一些格式轉換,加解密或者進行壓縮和解壓縮的功能;
  • 會話層:會話層的主要作用是負責程序與程序之間會話的建立、管理以及終止的服務;
  • 傳輸層:傳輸層提供了兩臺機器之間埠到埠的一個數據傳輸服務,因為應用層、表示層和會話層所針對的都是某個應用程序,而程序是和埠繫結的,但是同一臺伺服器上是可以有多個程序的,因而傳輸層提供的就是這種不同的埠到埠的訪問,以實現區分不同程序之間的通訊服務。在傳輸層最典型的協議有TCP和UDP協議,TCP提供的是面向連線的、可靠的資料傳輸服務,而UDP則是無連線的、不可靠的資料傳輸服務。在上面的圖中我們也可以看出,經過傳輸層之後,資料會被加上TCP或者UDP頭部,用以實現不同傳輸層協議的功能;
  • 網路層:傳輸層提供的是同一臺主機上的埠到埠的傳輸服務,而網路層則提供的是不同主機之間的連線服務,最典型的網路層協議就是IP協議,網路層會將當前的資料包加上一個IP頭部,從而實現目標機器的定址;
  • 資料鏈路層:這一層是承接軟體和硬體的一層,由於其會將當前的資料報傳送到不穩定的物理層硬體上進行傳輸,因而為了保障資料的完整性和可靠性,資料鏈路層就提供了校驗、確認和反饋等機制,用以提供可靠的資料報傳輸服務;
  • 物理層:物理層的主要作用就是將0101這種二進位制的位元流資料轉換為光訊號,用以在物理介質上進行傳輸。

        網路七層模型主要是提供的一種規範,而在這每一層上為了實現不同的功能,各個計算機廠商都會實現自己的協議,這些協議的標識就是通過一些協議頭和進行的,比如上面圖中,資料在經過每一層的封裝之後都會為其加上自己的協議頭部,當資料經過屋裡介質傳輸到目標機器上後,其就會反過來,將資料進行一層一層的解析,解析的過程其實就是根據其每一層頭部資訊來實現該層的相關功能。

        另外,網路七層模型是一種比較理想化的模型,現在應用比較廣泛的是網路五層模型,五層模型與七層模型的主要區別在於將應用層、表示層和會話層統一劃分到應用層中了,由應用程式實現其相關的功能。

2. TCP與UDP

        在我們的應用開發過程中,我們其實不需要太過於關注底層相關的功能,這些只需要相關的服務提供商提供相應的功能即可。不過在傳輸層之中,我們需要特別關注一下現在廣泛使用的兩個協議:TCP和UDP協議。這兩個協議之間的主要區別如下:

TCP UDP
面向連線 無連線
提供資料可靠保證 不提供資料可靠性保證
速度相對較慢 速度較快
佔用資源較多 佔用資源較少

        關於TCP和UDP,可以看到,這兩個協議各自分別有非常鮮明的特點:TCP雖然佔用資源較多,速度相對較慢,但是提供了可靠的資料傳輸服務,這在大多數的網際網路業務中是非常必要的;而UDP雖然不提供可靠性的資料保證,但是其速度非常快,而且佔用資源較小,這在一些對資料可靠性較低的場景中是非常有用的,比如音視訊服務,物聯網資料上報服務等等,這些情況下,資料丟失一兩幀都是可以接受的。

        TCP和UDP在資源佔用上的區別,不僅體現在資料傳輸方式上,還體現在了資料的傳輸格式上。對於資料傳輸方式,TCP每次傳送資料的方式都是按照時間視窗的方式一個數據報一個數據報的傳送,並且需要等待每個資料報都給資料傳送方響應ACK,這個時候才會傳送下一個資料視窗的資料,如果當前視窗內有任意一個數據報沒有傳送成功,那麼整個視窗內的資料都會重新發送;而UDP則沒有視窗的概念和對應的ACK機制,其獲取到每一個數據報之後,都只是簡單的為其封裝UDP協議頭,然後將其傳送出去,其不會管這個資料是否傳送成功,因而UDP傳輸比TCP是要快很多的。對於資料傳輸格式,這裡我們以TCP和UDP的資料報的格式進行講解,如下是TCP的資料報格式:

        可以看到,TCP資料報的頭部中不僅包含了源埠號和目的埠號,還包含了序號、確認序號、首部長度、標誌位等等資訊,總的來看,除去真正的資料部分,頭部資訊佔用的位元組數就達到了192位元組,當然,這麼多欄位主要的作用是為了實現TCP面向連線的可靠性傳輸的功能。如下則是UDP資料報的格式:

        可以看到,這裡UDP的資料包格式相對於TCP就非常的精簡了,其頭部主要就只有源埠號、目的埠號、長度和校驗和欄位,這些總共佔用的位元組數是8個位元組。這也就是UDP協議傳輸速率非常快的另一個原因。

2.1 三次握手和四次揮手

        TCP是一個提供可靠傳輸服務、面向連線的的傳輸層協議,其可靠性保證主要是通過每次資料報傳送時的ACK機制實現的,而其連線的建立和釋放則主要是通過三次握手和四次揮手的方式實現的。如下是其三次握手和四次揮手的過程:

        對於三次握手,其整體過程如下:

  • 首先客戶端會發送一個建立連線的請求,其標誌位中會帶上SYN=1, seq=x,這裡的SYN=1根據前面TCP頭部資訊的講解中我們知道,其表示建立連線的請求,而seq=x則只是當前請求的一個序號,不同的請求是有不同的序號的,加這個序號的原因也是為了將其與服務端的響應請求關聯起來;
  • 在服務端接收到客戶端建立連線的請求之後,其就會返回SYN=1, ACK=1, seq=y, ack_seq=x+1,這裡的SYN=1, ACK=1表示的是對客戶端建立連線的請求的同意響應,seq=y則標識了這是服務端的一次資料傳送,而ack_seq=x+1則表示其是對客戶端的seq=x的請求的一個響應;
  • 在客戶端接收到服務端的響應的時候,客戶端就能夠確認服務端是能夠正常接收和傳送資料的,而服務端在接收到客戶端的第一次請求的時候也能夠確認客戶端能夠正常的傳送請求。這個時候,客戶端就會發送一個ACK=1, seq=x+1, ack_seq=y+1給伺服器,伺服器接收到後就會完成連線的建立。

        可以看到,前兩次請求都是建立連線所必要的,而客戶端要傳送第三次請求的原因主要有兩點:

  • 可以讓伺服器確保客戶端是能夠正常傳送和接收請求的;
  • 由於連線的建立是在不穩定的網路上進行的,因而這裡有可能第一次請求是由於客戶端在某個時間點發送的,但是由於網路延遲,導致很久之後伺服器才接收到該請求,但此時伺服器並不知道這個連線建立的請求是否是正常請求,其還是會正常傳送一個同意建立連線的響應給客戶端,如果第一請求是由於網路延遲造成的,那麼客戶端是不會再發送第三次握手給伺服器的,這個時候伺服器等待超時後也就不會建立這一次的連線了。

        對於四次揮手,其是在客戶端與伺服器互動完成之後,由客戶端發起的。四次揮手的主要流程如下:

  • 客戶端首先會發送一個FIN=1, seq=u給伺服器,根據前面TCP頭部資訊的講解,我們知道FIN=1表示這是一個斷開連線的請求,而seq=u則標識了這次請求的一個序號;
  • 伺服器接收到客戶端的斷開連線的請求後,其就會向客戶端傳送一個ACK=1, seq=v, ack_seq=u+1的響應,這裡的seq=v還是表示當前請求的序號,而ack_seq=u+1則表示這是對客戶端傳送的seq=u的斷開連線的請求的響應,但是需要注意的是,這個請求並不表示伺服器同意斷開連線,此時還只是一個半關閉的狀態,因為此時伺服器可能還有資料在進行處理沒有傳送給客戶端,此時伺服器就會完成這些斷開連線的工作;
  • 待伺服器完成了斷開連線的準備工作之後,其就會給客戶端傳送一個FIN=1, ACK=1, seq=w, ack_seq=u+1的響應,注意,這個過程中客戶端一直都處於等待狀態的。這裡相對於前一次響應,多了一個FIN=1,就是表示當前是確認斷開連線的請求;
  • 客戶端在接收到伺服器的響應之後,其就會給伺服器傳送一個ACK=1, seq=u+1, ack_seq=w+1的響應,表示同意斷開連線,伺服器接收到後就會斷開連線,而客戶端則會等待一小段時間後自行斷開連線。

3. 小結

        本文首先講解了OSI網路七層模型,詳細講解了模型中每一層的作用,然後講解了傳輸層中TCP和UDP的主要區別,從傳輸方式和傳輸資料格式上對兩種協議進行了對比,最後講解了TCP協議中三次握手和四次揮手的主要過程,並且詳細講解了