UDP與TCP的區別

Jsp發表於2018-06-03

TCP提供一種面向連線的、可靠的位元組流服務。其中,面向連線意味著兩個使用TCP的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個TCP連線。在一個TCP連線中,僅有兩方進行彼此通訊;而位元組流服務意味著兩個應用程式通過TCP連結交換8bit位元組構成的位元組流,TCP不在位元組流中插入記錄識別符號。

  對於可靠性,TCP通過以下方式進行保證:

  • 資料包校驗:
    目的是檢測資料在傳輸過程中的任何變化,若校驗出包有錯,則丟棄報文段並且不給出響應,這時TCP傳送資料端超時後會重發資料;

  • 對失序資料包重排序:
    既然TCP報文段作為IP資料包來傳輸,而IP資料包的到達可能會失序,因此TCP報文段的到達也可能會失序。TCP將對失序資料進行重新排序,然後才交給應用層;

  • 丟棄重複資料:
    對於重複資料,能夠丟棄重複資料;

  • 應答機制:
    當TCP收到發自TCP連線另一端的資料,它將傳送一個確認。這個確認不是立即傳送,通常將推遲幾分之一秒;

  • 超時重發:
    當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段;

  • 流量控制:
    TCP連線的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端傳送接收端緩衝區所能接納的資料,這可以防止較快主機致使較慢主機的緩衝區溢位,這就是流量控制。TCP使用的流量控制協議是可變大小的滑動視窗協議。


一、UDP與TCP

UDP(User Datagram Protocol使用者資料包協議)是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。TCP採用了流量控制、擁塞控制、連續ARQ(Automatic Repeat Request自動重傳請求)等技術來保證它的可靠性。

Redis客戶端與Redis伺服器之間使用TCP協議進行連線,極光推送內部原理也是基於TCP的長連線。

二:UDP應用場景

1、面向資料包方式;2、網路資料大多為短訊息;3、擁有大量Client;4、對資料安全性無特殊要求;5、網路負擔非常重,但對響應速度要求高。

三:TCP連線與套接字

TCP連線是一種抽象的概念,表示一條可以通訊的鏈路。每條TCP連線有且僅有兩個端點,表示通訊的雙方。且雙方在任意時刻都可以作為傳送者和接收者。

一條TCP連線的兩端就是兩個套接字。套接字=IP地址:埠號。因此,TCP連線=(套接字1,套接字2)=(IP1:埠號1,IP2:埠號2)

四:TCP與UDP的基本區別

1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的
2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向位元組流,TCP把資料看成一連串無結構的位元組流;UDP是面向報文的
4、UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等),但網路擁塞時有些報文可能會丟失(所以不可靠)
5、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊
6、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
7、要求比較高的服務一般使用TCP協議,如FTP、Telnet、HTTP、SMTP(Simple Mail Transfer Protocol簡單郵件傳輸協議)、POP3等,而UDP是面向無連線的,使用這個協議的常見服務有DNS(Domain Name System,域名系統)、SNMP(Simple Network Management Protocol,簡單網路管理協議)

TCP對應的協議:

(1) FTP:定義了檔案傳輸協議,使用21埠
(2) Telnet:一種用於遠端登陸的埠,使用23埠,使用者可以以自己的身份遠端連線到計算機上,可提供基於DOS模式下的通訊服務
(3) SMTP:郵件傳送協議,用於傳送郵件。伺服器開放的是25號埠
(4) POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110埠
(5) HTTP:是從Web伺服器傳輸超文字到本地瀏覽器的傳送協議

UDP對應的協議:

(1) DNS:用於域名(主機名)解析服務,將域名地址轉換為IP地址。DNS用的是53號埠
(2) SNMP:簡單網路管理協議,使用161號埠,是用來管理網路裝置的。由於網路裝置很多,無連線的服務就體現出其優勢

五:程式設計區別

通常我們在說到網路程式設計時預設是指TCP程式設計,即用前面提到的socket函式建立一個socket用於TCP通訊,函式引數我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個socket用於流式網路通訊。
SOCK_STREAM這種的特點是面向連線的,即每次收發資料之前必須通過connect建立連線,也是雙向的,即任何一方都可以收發資料,協議本身提供了一些保障機制保證它是可靠的、有序的,即每個包按照傳送的順序到達接收方。
而SOCK_DGRAM這種是User Datagram Protocol協議的網路通訊,它是無連線的,不可靠的,因為通訊雙方傳送資料後不知道對方是否已經收到資料,是否正常收到資料。任何一方建立一個socket以後就可以用sendto傳送資料,也可以用recvfrom接收資料。根本不關心對方是否存在,是否傳送了資料。它的特點是通訊速度比較快。大家都知道TCP是要經過三次握手的,而UDP沒有。

socket程式設計:

Socket用在哪呢,主要用在程式間,網路間通訊。所謂socket 通常也稱作”套接字“,用於描述IP地址和埠,是一個通訊鏈的控制程式碼。應用程式通常通過”套接字”向網路發出請求或者應答網路請求。一條TCP連線的兩端就是兩個套接字(套接字=IP地址:埠號)
Socket和ServerSocket類庫位於java.net包中。ServerSocket用於伺服器端,Socket是建立網路連線時使用的。在連線成功時,應用程式兩端都會產生一個Socket例項,操作這個例項,完成所需的會話。對於一個網路連線來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
Accept方法用於產生”阻塞”,直到接受到一個連線,並且返回一個客戶端的Socket物件例項。”阻塞”是一個術語,它使程式執行暫時”停留”在這個地方,直到一個會話產生,然後程式繼續;通常”阻塞”是由迴圈產生的。
getInputStream方法獲得網路連線輸入,同時返回一個InputStream物件例項。
getOutputStream方法連線的另一端將得到輸入,同時返回一個OutputStream物件例項。

注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流物件,通常都會被另一個流物件使用。

TCP:

TCP程式設計的伺服器端一般步驟是:

1、建立一個socket,用函式socket();
2、設定socket屬性,用函式setsockopt(); * 可選
3、繫結IP地址、埠等資訊到socket上,用函式bind();
4、開啟監聽,用函式listen();
5、接收客戶端上來的連線,用函式accept();
6、收發資料,用函式send()和recv(),或者read()和write();
7、關閉網路連線;
8、關閉監聽;

TCP程式設計的客戶端一般步驟是:

1、建立一個socket,用函式socket();
2、設定socket屬性,用函式setsockopt();* 可選
3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選
4、設定要連線的伺服器的IP地址和埠等屬性;
5、連線伺服器,用函式connect();
6、收發資料,用函式send()和recv(),或者read()和write();
7、關閉網路連線;

UDP:

UDP程式設計的伺服器端一般步驟是:

  1、建立一個socket,用函式socket();

  2、設定socket屬性,用函式setsockopt();* 可選

  3、繫結IP地址、埠等資訊到socket上,用函式bind();

  4、迴圈接收資料,用函式recvfrom();

  5、關閉網路連線;

UDP程式設計的客戶端一般步驟是:

  1、建立一個socket,用函式socket();

  2、設定socket屬性,用函式setsockopt();* 可選

  3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選

  4、設定對方的IP地址和埠等屬性;

  5、傳送資料,用函式sendto();

  6、關閉網路連線;




相關文章