1. 程式人生 > >UDP TCP概論及案例

UDP TCP概論及案例

body new 角度 實時 根據 案例 通信協議 面向 csdn

概述:

  兩者都是通信協議, TCP、UDP 是傳輸層協議,但他們的通信機制與應用場景不同,下面來闡述兩者的區別以及它們的應用場景。

TCP 與 UDP:

 TCP(Transmission Control Protocol),又叫傳輸控制協議,UDP(User Datagram Protocol),又叫用戶數據報協議,它們都是傳輸層的協議,但兩者的機制不同,它們的區別如下:

特點TCPUDP
連接性 面向連接 面向非連接
可靠性 可靠 不可靠
傳輸效率

TCP/UDP編程模型:

從程序實現的角度來看,可以用下圖來進行描述。
技術分享圖片


TCP:  

  從如上表格看到,TCP 是面向連接的,並且是一種可靠的協議,在基於 TCP 進行通信時,通信雙方需要先建立一個 TCP 連接,建立連接需要經過三次握手,握手成功才可以進行通信,關於 TCP 三次握手、四次揮手的過程請看該文章。
  另外 TCP 協議是一種可靠的傳輸協議,那麽它是如何保證可靠性的呢?

UDP:

  UDP 是一種面向無連接,且不可靠的協議,在通信過程中,它並不像 TCP 那樣需要先建立一個連接,只要(目的地址,端口號,源地址,端口號)確定了,就可以直接發送信息報文,並且不需要確保服務端一定能收到或收到完整的數據。它僅僅提供了校驗和機制來保障一個報文是否完整,若校驗失敗,則直接丟棄報文,不做任何處理。

可靠性:

  在講解 TCP 如何保證可靠性前,首先得理解什麽是可靠。在通信的角度來看,可靠即要確保通信雙方的通信信息不會丟失,若丟失了保證能夠對其進行恢復,並且收到的信息內容與原發送內容一樣。
  在 TCP 中,傳輸報文都是通過建立的虛擬連接來進行傳輸,發送端傳輸的每一個 TCP 報文,都會對其進行編號(編號是由於網絡傳輸的原因,發送的報文可能會亂序到達,因此需要根據編號對報文進行重排),並且開啟一個計時器;當接收端收到報文後,並且通過校驗和對收到的報文數據進行校驗,若校驗成功則會返回一個確認報文,告知發送端我已經成功收到該報文了;若發送端在計時器結束前仍未收到確認報文,則認為接收端接收失敗,則會重傳該報文;服務端若收到重復報文(根據編號發現已經是收到了),則會將該報文丟棄。
  因此,從上面的機制可以知道,TCP 是通過重傳、確認和校驗和的方式來確保可靠。
註:校驗和並不能檢驗數據是否被篡改過,想要保證數據的完整性可以了解一下數字簽名

TCP 與 UDP 的應用場景:

  從特點上我們已經知道,TCP 是可靠的但傳輸速度慢 ,UDP 是不可靠的但傳輸速度快。因此在選用具體協議通信時,應該根據通信數據的要求而決定。
  若通信數據完整性需讓位與通信實時性,則應該選用 TCP 協議(如文件傳輸、重要狀態的更新等);反之,則使用 UDP 協議(如視頻傳輸、實時通信等)。

案例代碼及實現效果:

TCP:

客戶端:

 1 package cn.TCP;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
6 import java.io.OutputStream; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 public class TCP_Clicent { 11 public static void main(String[] args) throws Exception { 12 //1.創建對象 13 ServerSocket sk=new ServerSocket(1122111); 14 //2.監聽 15 Socket s=sk.accept(); 16 //打包數據 17 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 18 BufferedReader bw=new BufferedReader(new InputStreamReader(System.in)); 19 OutputStream os=s.getOutputStream(); 20 String line=null; 21 while((line=br.readLine())!=null){ 22 System.out.println("Client \t"+line); 23 os.write(bw.readLine().getBytes()); 24 } 25 //釋放資源 26 s.close(); 27 //sk.close(); 28 } 29 }

服務器:

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStreamWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 public class TCP_Service {
11 public static void main(String[] args) throws Exception {
12     Socket sk=new Socket("192.168.60.127",1122111);
13     BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
14     BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
15     String line=null;
16     while((line=br.readLine())!=null){            
17         bw.write(line);
18         bw.newLine();
19         bw.flush();
20         
21         InputStream is=sk.getInputStream();            
22         byte [] by=new byte[1024];
23         int num=is.read(by);
24         String h=new String(by, 0, num);
25         System.out.println("Service:\t"+h);
26     }                    
27         //br.close();
28         //bw.close();
29         sk.close();
30 
31 
32 }
33 }

UDP:

客戶端:

 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 import java.net.InetAddress;
 6 import java.net.SocketException;
 7 
 8 public class UDP_Clicent {
 9 public static void main(String[] args) throws Exception  {
10     DatagramSocket l=new DatagramSocket();
11     DatagramSocket ds=new DatagramSocket();
12     BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
13     String line=null;
14     byte [] bys=line.getBytes();
15     int num=bys.length;
16     InetAddress address=InetAddress.getByName("192.168.60.127");
17     int port=101236;
18     DatagramPacket dp=new DatagramPacket(bys,num, address,port);
19     ds.send(dp);        
20     ds.close();
21 }
22 }

服務器:

 1 import java.net.DatagramPacket;
 2 import java.net.DatagramSocket;
 3 import java.net.InetAddress;
 4 import java.net.SocketException;
 5 
 6 public class UDP_Service {
 7 
 8     public static void main(String[] args) throws Exception {
 9         DatagramSocket ds=new DatagramSocket(101236);
10         byte[] bys = new byte[1024];
11         int len = bys.length;
12         DatagramPacket dp = new DatagramPacket(bys, len);
13         ds.receive(dp);
14         byte[] by = dp.getData();
15         int length = dp.getLength();
16         InetAddress address = dp.getAddress();
17         String ip = address.getHostAddress();
18         String s = new String(by, 0, length);
19         System.out.println(ip + "---" + s);
20     ds.close();
21 
22     }
23 
24 }

UDP TCP概論及案例