🌐 引言
在網絡通信中,TCP(傳輸控制協議)和UDP(用戶數據報協議)是兩大核心傳輸層協議。它們各有優劣,適用于不同場景。本文將用圖文對比+實戰示例,幫你徹底理解兩者的區別!
🔍 一、核心區別對比表
特性 | TCP | UDP |
---|---|---|
連接方式 | 面向連接(需握手) | 無連接(直接發送) |
可靠性 | ? 可靠(確認重傳機制) | ? 不可靠(可能丟包) |
數據順序 | ? 保證順序 | ? 不保證順序 |
傳輸效率 | ?? 較低(需額外控制開銷) | ? 極高(無控制字段) |
流量控制 | ? 滑動窗口機制 | ? 無控制 |
擁塞控制 | ? 動態調整速率 | ? 無控制 |
頭部大小 | 20-60字節 | 僅8字節 |
典型應用 | HTTP/HTTPS、FTP、SSH | 視頻流、DNS、在線游戲 |
🤝 二、TCP的三次握手與四次揮手(圖解)
1. 三次握手建立連接
目的:同步初始序列號(ISN),確保雙方收發能力正常。
2. 四次揮手斷開連接
為什么需要四次?
因為TCP是全雙工的,兩端需分別確認關閉。
🎯 三、UDP的通信流程(圖解)
特點:
- 像寄平信,不關心對方是否收到
- 頭部僅8字節(源端口+目標端口+長度+校驗和)
💡 四、如何選擇TCP還是UDP?
? 用TCP的場景
- 需要可靠傳輸(如文件下載、網頁訪問)
- 需保證數據順序(如數據庫同步)
- 容忍一定延遲(如電子郵件)
? 用UDP的場景
- 實時性優先(如視頻會議、直播)
- 高頻小數據包(如DNS查詢、游戲戰斗數據)
- 廣播/組播(如IPTV)
? 五、Java實戰代碼示例
1. TCP客戶端/服務端
TCP服務端(接收數據)
import java.io.*;
import java.net.*;
public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8888);System.out.println("TCP Server啟動,監聽端口 8888...");Socket clientSocket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("收到TCP消息: " + inputLine);}}
}
TCP客戶端(發送數據)
import java.io.*;
import java.net.*;
public class TCPClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 8888);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println("Hello TCP!");System.out.println("TCP消息已發送");socket.close();}
}
2. UDP客戶端/服務端
UDP服務端(接收數據)
import java.net.*;
public class UDPServer {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(9999);byte[] buffer = new byte[1024];System.out.println("UDP Server啟動,監聽端口 9999...");DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("收到UDP消息: " + message);}
}
UDP客戶端(發送數據)
import java.net.*;
public class UDPClient {public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket();InetAddress address = InetAddress.getByName("localhost");String message = "Hello UDP!";byte[] buffer = message.getBytes();DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9999);socket.send(packet);System.out.println("UDP消息已發送");}
}
📌 六、總結
- TCP = 電話通話(可靠但慢)
- UDP = 對講機喊話(快速但可能聽不清)
- 選擇協議時,先問自己:“我更怕數據丟失,還是更怕延遲?”