天天看點

[計算機網絡] TCP協定與UDP協定的差別

TCP(Transmission Control Protocol,傳輸控制協定)

是可靠的、面向連接配接的協定,也就是說,在收發資料前,必須和對方建立可靠的連接配接。一個TCP連接配接必須要經過三次“對話”才能建立起來,其中的過程非常複雜,隻簡單的描述下這三次對話的簡單過程:主機A向主機B發出連接配接請求資料包:“我想給你發資料,可以嗎?”,這是第一次對話;主機B向主機A發送同意連接配接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的資料包:“可以,你什麼時候發?”,這是第二次對話;主機A再發出一個資料包确認主機B的要求同步:“我現在就發,你接着吧!”,這是第三次對話。三次“對話”的目的是使資料包的發送和接收同步,經過三次“對話”之後,主機A才向主機B正式發送資料。

具有逾時重傳、滑動視窗協定實作流量控制、捎帶肯定累計确認機制以及擁塞控制協定。

        TCP的標頭結構

[計算機網絡] TCP協定與UDP協定的差別

源端口、目的端口:16位長。辨別出遠端和本地的端口号。

順序号:32位長。表明了發送的資料報的順序。

确認号:32位長。希望收到的下一個資料報的序列号。

TCP協定資料報頭DE 頭長:4位長。表明TCP頭中包含多少個32位字。

接下來的6位未用。

ACK:ACK位置1表明确認号是合法的。如果ACK為0,那麼資料報不包含确認資訊,确認字段被省略。

PSH:表示是帶有PUSH标志的資料。接收方是以請求資料報一到便可送往應用程式而不必等到緩沖區裝滿時才傳送。

RST:用于複位由于主機崩潰或其它原因而出現的錯誤的連接配接。還可以用于拒絕非法的資料報或拒絕連接配接請求。

SYN:用于建立連接配接。

FIN:用于釋放連接配接。

視窗大小:16位長。視窗大小字段表示在确認了位元組之後還可以發送多少個位元組。

校驗和:16位長。是為了確定高可靠性而設定的,它校驗頭部、資料和僞TCP頭部之和。

可選項:0個或多個32位字。包括最大TCP載荷,視窗比例、選擇重發資料報等選項。

最大TCP載荷:允許每台主機設定其能夠接受的最大的TCP載荷能力。在建立連接配接期間,雙方均聲明其最大載荷能力,并選取其中較小的作為标準。如果一台主機未使用該選項,那麼其載荷能力預設設定為536位元組。

視窗比例:允許發送方和接收方商定一個合适的視窗比例因子。這一因子使滑動視窗最大能夠達到232位元組。

TCP協定資料報頭選擇重發資料報:這個選項允許接收方請求發送指定的一個或多個資料報。

 TCP報頭的最小長度為20位元組。

UDP(User Data Protocol,使用者資料報協定)

UDP是不可靠的、非面向連接配接的協定,傳輸資料之前源端和終端不建立連接配接,當它想傳送時就簡單地去抓取來自應用程式的資料,并盡可能快地把它扔到網絡上。在發送端,UDP傳送資料的速度僅僅是受應用程式生成資料的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程式每次從隊列中讀一個消息段。

由于傳輸資料不建立連接配接,是以也就不需要維護連接配接狀态,包括收發狀态等,是以一台服務機可同時向多個客戶機傳輸相同的消息。這時,每個資料段的可靠性依靠上層協定來保證。在傳送資料較少、較小的情況下,UDP比TCP更加高效。

吞吐量不受擁擠控制算法的調節,隻受應用軟體生成資料的速率、傳輸帶寬、源端和終端主機性能的限制。

UDP使用盡最大努力傳遞,即不保證可靠傳遞,是以主機不需要維持複雜的連結狀态表(這裡面有許多參數)。

UDP是面向封包的。發送方的UDP對應用程式交下來的封包,在添加首部後就向下傳遞給IP層。既不拆分,也不合并,而是保留這些封包的邊界,是以,應用程式需要選擇合适的封包大小。

        UDP的標頭結構

[計算機網絡] TCP協定與UDP協定的差別

源端口 16位

目的端口 16位

長度 16位,UDP使用者資料報的總長度,以位元組為機關。

校驗和 16位,它校驗頭部、資料和僞UDP頭部之和。

UDP報頭的長度為8個位元組。

僞首部

[計算機網絡] TCP協定與UDP協定的差別

僞首部(Pseudo Header),是指在TCP的分段或UDP的資料報格式中,在資料報首部前面增加源IP位址、目的IP位址、IP分組的協定字段、TCP或UDP資料報的總長度等共12個位元組,所構成的擴充首部結構。僞首部是一個臨時的結構,它既不向上也不向下傳遞,僅僅隻是為了保證可以校驗套接字的正确性。

面向連接配接一定可靠,不面向連接配接一定不可靠?

不一定!面向連接配接隻是容易實作可靠的傳輸控制機制,不面向連接配接很難實作可靠的傳輸控制。

舉個現實生活中的例子:打電話(TCP)和投遞信件(UDP):

打電話先建立連接配接,“你好,小王在嗎?”,“我就是哦,你是小莉吧?”“是啊,blabla~~”這就是TCP的三次握手,接下來互相傳遞的資訊就具有一定的通話品質保障。但如果出現實體鍊路錯誤或是網絡大量擁塞的情況還是會造成傳輸品質的下降導緻不可靠。

對于投遞信件案例,普通信件投遞到郵筒就無法查到相關的資訊了,經常會想“怎麼這麼久都沒有收到信件,也不知道她是不是收到了我的信件?好焦急!”,隻有當收到對方回複才能确認上次投遞的信件被對方收到了!但如果是挂号信呢?雖然維護起來很麻煩,不過挂号信可以查到投遞狀态等資訊,這樣由不可靠變成相對可靠了。

二者沒有必然的聯系!隻是在實作上有個難易程度之分。

小結TCP與UDP的差別:

1.基于連接配接與無連接配接;

2.對系統資源的要求(TCP較多,UDP少);

3.UDP程式結構較簡單;

4.流模式與資料報模式 ;

5.TCP保證資料正确性,UDP可能丢包,TCP保證資料順序,UDP不保證。

程式設計時的差別:

1.socket()的參數不同

2.UDP Server不需要調用listen和accept

3.UDP收發資料用sendto/recvfrom函數

4.TCP:位址資訊在connect/accept時确定

5.UDP:在sendto/recvfrom函數中每次均 需指定位址資訊

6.UDP:shutdown函數無效

繼續閱讀