1. 程式人生 > >多路複用與多路分解;UDP報文段格式;套接字和埠號

多路複用與多路分解;UDP報文段格式;套接字和埠號

UDP套接字(目的IP地址,目的埠號),若兩個UDP報文段有不同源IP地址和/或源埠號,但有相同目的IP地址和目的埠號,則這兩個報文段將通過相同的套接字被定向到相同的目的程序。

TCP套接字(源IP地址,源埠號,目的IP地址,目的埠號),當一個TCP報文段從網路到達一臺主機時,使用全部4個值將報文段分解到相應套接字。兩個具有不同源IP地址或源埠號的TCP報文段將被定向到不同的套接字。

客戶套接字地址唯一定義了客戶程序,而伺服器套接字地址唯一地定義了伺服器程序。

TCP與UDP報文段結構中埠號都是16位元,可以有在0---65535範圍內的埠號。對於這65536個埠號有以下的使用規定:(1)埠號小於256的定義為常用埠,伺服器一般都是通過常用埠號來識別的。任何TCP/IP實現所提供的服務都用1---1023之間的埠號(周知埠號),是由ICANN來管理的;(2)客戶端只需保證該埠號在本機上是惟一的就可以了。客戶埠號因存在時間很短暫又稱臨時埠號;(3)大多數TCP/IP實現給臨時埠號分配1024---5000之間的埠號。大於5000的埠號是為其他伺服器預留的。

UDP報文段結構:

UDP有兩個欄位:資料欄位和首部欄位。

  • 首部欄位
首部欄位,由4個欄位組成,每個欄位的長度都是兩個位元組,共有8個位元組

UDP報文格式:

1)源埠號: 資料傳送方的埠號。在需要對方回信時選用。不需要時可用全0。2)目的埠號:資料接收方的埠號。這在終點交付報文時必須要使用到。3)長度: UDP使用者資料報的長度,其最小值是8(僅有首部)。4)校驗和:檢測UDP使用者資料報在傳輸中是否有錯。有錯就丟棄。傳送方的UDP對報文段中的所有16位元字的和進行反碼運算,求和時遇到的任何溢位都要被回捲(可以先加如果有必要回卷的進行回捲再進行反碼運算),得到的結果被放在UDP報文段中的檢驗和欄位。在接收方,把檢驗和與所有的16位元字進行相加,如果分組無差錯,則結果全部為1。如果出現了0,則分組中出現了差錯,丟棄受損報文段。
  • UDP首部中校驗和的計算方法有些特殊。在計算校驗和時,要在UDP使用者資料報之前增加12個位元組的偽首部。
  • 偽首部既不向下傳送也不向上遞交,而僅僅是為了計算校驗和。
  • 與IP資料報的校驗和只校驗IP資料報的首部不同,UDP的校驗和是把首部和資料部分一起都校驗。
偽首部:          

偽首部:是指在 TCP 的分段或 UDP 的資料報格式中,在報文段首部前面增加源 IP 地址、目的 IP 地址、IP 分組的協議欄位、TCP 或 UDP 報文段的總長度等共12位元組,所構成的擴充套件首部結構。此偽首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅只是為了保證可以校驗套接字的正確性。


5) 資料:UDP 的資料部分如果不為偶數需要用 0 填補,就是說,如果資料長度為奇數,資料長度加“1”。
多路複用與多路分解

一個程序(作為網路應用的一部分)有一個或多個套接字(socket),它相當於從網路向程序傳遞資料和從程序向網路傳遞資料的門戶。將運輸層報文段中的資料交付到正確的套接字的工作稱為多路分解(demultiplexing)

而在源主機中從不同套接字中收集資料塊,併為每個資料塊封裝上首部資訊從而生成報文段,然後將報文段傳遞到網路層,所有這些工作稱為多路複用(multiplexing)

主機上每個套接字都有分配一個埠號,當報文段到達主機時,運輸層檢查報文段的目的埠號,將其定向到相應的套接字。然後報文段中的資料通過套接字進入其所連線的程序。

1、無連線的多路複用和多路分解

在運輸層,無連線的網路傳輸是通過UDP來實現的。UDP報文中只有源埠號和目的埠號,一個UDP套接字是由一個含有目的IP地址和目的埠號的二元組來全面標識的。在客戶端,源埠號是客戶程序套接字的埠號,目的埠號是伺服器的埠號。而在伺服器端,源埠號是伺服器的建立的套接字的埠號,而目的埠號是客戶端的套接字的埠號。例如主機A產生了一個UDP報文段,報文段中就會包括源埠號(11111)、目的埠號(22222)、程式資料(還有兩個其他的值:長度和檢驗和)。然後,運輸層將生成的報文段交給網路層。網路層將其放到一個IP資料報中,並提供盡力而為的交付,將其傳送到主機B中。如果該資料報到達主機B,主機B運輸層就會檢查該報文段的目的埠號,並將該報文段傳遞給套接字的埠號為接收到的報文段的目的埠號(22222)的套接字。從而實現了程序間的網路通訊。而源埠號的作用是為了讓主機B能向主機A傳送資訊的,即,當主機B在接收到主機A的資料後,要向主機A傳送一個迴應時,主機B傳送的報文段的目的埠號就是11111.IP地址對應著一臺主機,而埠號對應著一臺主機上的一個程序(或套接字)。

2、面向連線的多路複用和多路分解

網路上主機間的程序間通訊,實質上是通過套接字來實現的。在運輸層中面向連線的網路傳輸多使用TCP,TCP套接字是由一個四元組(源IP地址、源埠號,目的IP地址,目的埠號)來標識的。當一個TCP報文段從網路到達一臺主機時,主機會使用全部4個值來將報文段定向,即多路分解到相應的套接字。與UDP不同的是,兩個具有不同源IP或源埠號的到達的TCP報文段將被重定向到兩個不同的套接字。儘管如此,而TCP的多路利用和多路分解的工作原理與無連線的UDP的多路複用和多路分解的原理還是大致一樣的。想想為什麼TCP的多路複用和多路分解要這樣設計呢?個人認為,這是因為TCP和UDP對待接收到的資料的處理方式不同所致的。我們以伺服器上的TCP套接字和UDP套接字為例,假定伺服器接收客戶端的資料,並把資料傳送回客戶端。當一個UDP伺服器接收到一個UDP報文段時,它會根據收到的UDP報文段的源IP和源埠號,把資料傳送回客戶端,它並不需要建立一個新的套接字來處理該報文段;而對於一個TCP伺服器,當它接受一個連線時,它會產生一個新的套接字,然後通過新的套接字來與客戶端通訊,也就是通過新的套接字來把資料傳送回給客戶端。由於每一個連線都會產生一個新的套接字,所以具有不同的源IP或源埠號的連線就是一個不同的連線,對應著產生的新的不同的套接字。試想一下,如果TCP套接字也是使用像UDP那樣的只用源埠號和目的埠號來完全標識一個套接字,那麼當客戶機A有一個Http連線時,該TCP報文的目的埠號為80,目的IP地址為TCP服務的IP地址。TCP伺服器產生一個新的套接字來處理該請求,此時,客戶機B又有一個Http連線,TCP報文的目的埠號也為80,目的IP地址也為TCP服務的IP地址。而TCP套接字也是使用像UDP那樣,兩個具有不同的源Ip或源埠號但具有相同目的IP和目的埠的報文段定位到同一個套接字中,那麼這個客戶機B的TCP報文段則會多路分解到客戶機A的套接字上,而該套接字並不應該被客戶機B的Http連線使用。