文章目錄
* 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對應用...