面向報文(UDP)和面向位元組流(TCP)的區別

2021-07-23 14:46:17 字數 3732 閱讀 9260

文章目錄

* 1,tcp是面向連線(connection oriented)的協議,udp是無連線(connection less)協議;

* 2,tcp無界,udp有界;

* 3,tcp可靠,udp不可靠;

* 4,tcp有序,udp無序;

* 5,tcp有流量控制(擁塞控制),udp沒有;

* 6,tcp的頭部比udp大;

1,tcp是面向連線(connection oriented)的協議,udp是無連線(connection less)協議;

以下舉例進行說明:

對於面向連線的: 兩個人打**時,雙方確認並建立連線後才能進行通訊。

對於面向無連線的:在郵局寄信時,你只需要將信放在郵筒裡,不需要給收件人通知,收件人也不知道你給他寄信了。

2,tcp無界,udp有界;

tcp通過位元組流傳輸,即tcp將應用程式看成是一連串的無結構的位元組流。每個tcp套介面有乙個傳送緩衝區,如果位元組流太長時,tcp會將其拆分進行傳送。當位元組流太短時,tcp會等待緩衝區中的位元組流達到一定程度時再構成報文傳送出去,tcp發給對方的資料,對方在收到資料時必須給矛確認,只有在收到對方的確認時,本方tcp才會把tcp傳送緩衝區中的資料刪除。

而udp傳輸報文的方式是由應用程式控制的,應用層交給udp多長的報文,udp照樣傳送,既不拆分,也不合併,而是保留這些報文的邊界,即一次傳送乙個報文。

有界與無界之分是根據接收報文來劃分的,對於tcp協議,客戶端連續傳送資料,只要服務端的這個函式的緩衝區足夠大,會一次性接收過來,即客戶端是分好幾次發過來,是有邊界的,而服務端卻一次性接收過來,所以證明是無邊界的;

而對於udp協議,客戶端連續傳送資料,即使服務端的這個函式的緩衝區足夠大,也只會一次一次的接收,傳送多少次接收多少次,即客戶端分幾次傳送過來,服務端就必須按幾次接收,從而證明,這種udp的通訊模式是有邊界的。

3,tcp可靠,udp不可靠;由於tcp要保證所有的資料報都可以到達,所以,需要有重傳機制(快重傳,快恢復,超時重傳),udp不會進行重傳。當出現以下情況時會進行重傳:

1,資料報傳輸中途丟失

2,接收端的ack確認報文在傳輸中途丟失

3,接收端異常未響應ack或被接收端丟棄

tcp重傳機制:

1,超時重傳機制;

2,快速重傳機制;

3,sack 方法;

4,duplicate sack – 重複收到資料的問題

4,tcp有序,udp無序;訊息在傳輸過程中可能會亂序,後傳送的訊息可能會先到達,tcp會對其進行重排序,udp不會。

5,tcp有流量控制(擁塞控制),udp沒有;流量控制:tcp利用滑動視窗機制在tcp連線上實現對傳送方的流量控制, 如果傳送方把資料傳送得過快,接收方可能會來不及接收,這就會造成資料的丟失。所謂流量控制就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收。

擁塞控制:防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制所要做的都有乙個前提:網路能夠承受現有的網路負荷。擁塞控制是乙個全域性性的過程,涉及到所有的主機、路由器,以及與降低網路傳輸效能有關的所有因素。

當出現網路抖動時,tcp會自覺降低傳送速度,他會努力維護次序,但udp依然保持速度不變

6,tcp的頭部比udp大;tcp頭部20 bytes

補充:

tcp位元組流和udp資料報區別

兩者的區別在於tcp接收的是一堆資料,而每次取多少由主機決定;而udp發的是資料報,客戶傳送多少就接收多少。

擁有這些區別的原因是由於tcp和udp的特性不同而決定的。tcp是面向連線的,也就是說,在連線持續的過程中,socket中收到的資料都是由同一臺主機發出的,因此,知道保證資料是有序的到達就行了,至於每次讀取多少資料自己看著辦。 而udp是無連線的協議,也就是說,只要知道接收端的ip和埠,且網路是可達的,任何主機都可以向接收端傳送資料。這時候,如果一次能讀取超過乙個報文的資料,則會亂套。比如,主機a向傳送了報文p1,主機b傳送了報文p2,如果能夠讀取超過乙個報文的資料,那麼就會將p1和p2的資料合併在了一起,這樣的資料是沒有意義的。

tcp應用場景:效率要求相對低,但對準確性要求相對高的場景。因為傳輸中需要對資料確認、重發、排序等操作,相比之下效率沒有udp高。舉幾個例子:檔案傳輸(準確高要求高、但是速度可以相對慢)、接受郵件、遠端登入。

傳輸通訊:兩個協議是程序間通訊,也就是說應用間的通訊,那麼如何在眾多程式中找到自己的目的應用呢?在傳輸層,使用埠號來識別同一臺計算機中進行通訊的不同應用程式。

一般情況下可以根據「源ip位址」、「目標ip位址」、「源埠號」、「目標埠號」來進行識別乙個通訊,但是有些特殊情況,比如ip位址和埠號都一樣,只是使用的傳輸協議不一樣,怎麼進行區分?資料到達ip層(網路層)之後,會先檢查ip頭部的協議號,然後再傳給相應協議的模組。

因此,tcp/ip或udp/ip通訊中通常使用5個資訊來識別乙個通訊:「源ip位址」、「目標ip位址」、「源埠號」、「目標埠號」以及「協議號」。(知名埠號與傳輸層協議沒有關係,例如53埠在tcp、udp中都用於dns服務)

埠號如何確定:標準既定的埠號,0-1023為知名埠號,其他已正式註冊的埠號是1024-49151;動態分配埠號,作業系統來為應用程式分配互不衝突的埠號,下乙個埠號是在前乙個分配號上加1,動態分配埠號範圍49152-65535.

tcp首部格式

各個段位說明:

* 源埠和目的埠:  各佔 2 位元組.埠是傳輸層與應用層的服務介面.傳輸層的復用和分用功能都要通過埠才能實現

* 序號:   seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

* 確認號:   ack序號,佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack=seq+1。

* 資料偏移/首部長度:  佔 4 位,它指出 tcp 報文段的資料起始處距離 tcp 報文段的起始處有多遠.「資料偏移」的單位是 32 位字(以 4 位元組為計算單位)

* 保留:  佔 6 位,保留為今後使用,但目前應置為 0

* 緊急urg:  當 urg=1 時,表明緊急指標字段有效.它告訴系統此報文段中有緊急資料,應盡快傳送(相當於高優先順序的資料)

* 確認ack:  只有當 ack=1 時確認號字段才有效.當 ack=0 時,確認號無效。 不要將確認序號ack與標誌位中的ack搞混了。

* psh(push):  接收 tcp 收到 psh = 1 的報文段,就盡快地交付接收應用程序,而不再等到整個快取都填滿了後再向上交付

* rst (reset):  當 rst=1 時,表明 tcp 連線中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連線,然後再重新建立運輸連線

* 同步 syn:  同步 syn = 1 表示這是乙個連線請求或連線接受報文

* 終止 fin:  用來釋放乙個連線.fin=1 表明此報文段的傳送端的資料已傳送完畢,並要求釋放運輸連線

* 檢驗和:  佔 2 位元組.檢驗和字段檢驗的範圍包括首部和資料這兩部分.在計算檢驗和時,要在 tcp 報文段的前面加上 12 位元組的偽首部

* 緊急指標:  佔 16 位,指出在本報文段中緊急資料共有多少個位元組(緊急資料放在本報文段資料的最前面)

* 選項:  長度可變.tcp 最初只規定了一種選項,即最大報文段長度 mss.mss 告訴對方 tcp:「我的快取所能接收的報文段的資料字段的最大長度是 mss 個位元組.」 [mss(maximum segment size)是 tcp 報文段中的資料字段的最大長度.資料字段加上 tcp 首部才等於整個的 tcp 報文段]

* 填充:  這是為了使整個首部長度是 4 位元組的整數倍

面向報文(UDP)和面向位元組流(TCP)的區別

面向報文 udp 和面向位元組流 tcp 的區別 面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文...

面向報文(UDP)和面向位元組流(TCP)的區別

面向報文 udp 和面向位元組流 tcp 的區別 面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文...

面向報文(UDP)和面向位元組流(TCP)的區別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!面向報文 udp 和面向位元組流 tcp 的區別 面向報文的傳輸方式是應用層交給udp多長的報文,udp就照樣傳送,即一次傳送乙個報文。因此,應用程式必須選擇合適大小的報文。若報文太長,則ip層需要分片,降低效率。若太短,會是ip太小。udp對應用...