| 特性 | TCP | UDP |
|---|---|---|
| 連線模型 | 面向連線(虛擬電路) | 無連線(資料報) |
| 可靠性 | 保證送達、有序、無重複 | 不保證,可能丟失/亂序/重複 |
| 資料單位 | 位元組流 (Byte Stream) | 資料報 |
| 流控/擁塞控制 | 內建滑動視窗、多演算法 | 無,應用層自行實現 |
| 適用場景 | Web、郵件、資料庫、即時通訊 | DNS、串流媒體、遊戲、廣播 |
發送方發送段落後啟動計時器;接收方檢查和通過後回 ACK,發送方收到 ACK 取消計時器;超時未收到 ACK 自動重傳。開發者無感知,除非網路嚴重故障(如路由不可達)拋出異常。
每個 TCP 段落攜帶序列號。網路傳輸可能導致亂序到達,TCP 接收端緩衝亂序段落,待前序段落到達後按序提交給應用層。應用層讀到的永遠是有序位元組流。
TCP Socket 以 InputStream/OutputStream 呈現,與檔案、管道、控制台 I/O 介面一致。開發者以流思維處理網路通訊,無需關心封包化/解封包細節。
連線四元組唯一標識:{Src IP, Src Port, Dst IP, Dst Port}。同一伺服端 Port 可同時服務成千上萬客戶端,靠四元組區分。
new Socket(host, port)(阻塞至三次交握完成)。getInputStream()/getOutputStream()。close()(觸發四次揮手)。new ServerSocket(port) / new ServerSocket(port, backlog, bindAddr)。accept() 返回新 Socket(每連線一個)。close() 釋放端口。
public class DaytimeClient {
private static final int PORT = 13;
public static void main(String[] args) {
if (args.length != 1) { System.err.println("Usage: DaytimeClient "); return; }
try (Socket socket = new Socket(args[0], PORT)) {
socket.setSoTimeout(2000); // 防止伺服端無回應永久阻塞
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream(), StandardCharsets.ISO_8859_1))) {
System.out.println("Time: " + in.readLine());
}
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
public class DaytimeServer {
private static final int PORT = 13;
public static void main(String[] args) throws IOException {
try (ServerSocket server = new ServerSocket(PORT)) {
System.out.println("Daytime Server listening on " + PORT);
while (true) {
try (Socket client = server.accept()) {
String time = new java.util.Date().toString();
client.getOutputStream().write((time + "\r\n").getBytes(StandardCharsets.ISO_8859_1));
} catch (IOException e) {
System.err.println("Client error: " + e.getMessage());
}
}
}
}
}
| 選項 | 適用端 | 建議值/策略 |
|---|---|---|
| SO_TIMEOUT | 客戶端/伺服端 | 5-30秒,防止讀取永久阻塞 |
| TCP_NODELAY | 低延遲場景 | true(關閉 Nagle),適合即時互動、遊戲 |
| SO_KEEPALIVE | 長連線 | true,依賴 OS 核心參數 (tcp_keepalive_time 等) |
| SO_RCVBUF/SO_SNDBUF | 高吞吐 | 256KB-2MB,配合 BDP (Bandwidth-Delay Product) 設定 |
| SO_LINGER | 優雅關閉 | true, 0-10秒,避免 TIME_WAIT 積壓或資料丟失 |
TCP 以虛擬連接、位元組流、自動化可靠傳輸三大特性,成為互聯網核心傳輸協議。Java Socket API 將其封裝為流式介面,讓開發者專注業務邏輯。掌握 TCP 狀態機、滑動視窗、擁塞控制原理,配合 Socket 選項調優,是構建高效能網路應用的關鍵。