UDP TCP概論及案例
概述:
兩者都是通信協議, TCP、UDP 是傳輸層協議,但他們的通信機制與應用場景不同,下面來闡述兩者的區別以及它們的應用場景。
TCP 與 UDP:
TCP(Transmission Control Protocol),又叫傳輸控制協議,UDP(User Datagram Protocol),又叫用戶數據報協議,它們都是傳輸層的協議,但兩者的機制不同,它們的區別如下:
特點 | TCP | UDP |
---|---|---|
連接性 | 面向連接 | 面向非連接 |
可靠性 | 可靠 | 不可靠 |
傳輸效率 | 慢 | 快 |
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概論及案例