首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

TCP 協議深度解析:可靠位元組流、虛擬連接、錯誤控制與 Java Socket 程式設計實戰

     編輯:Java 相關知識

TCP 核心特性:為何取代 UDP 成為主流?

特性TCPUDP
連線模型面向連線(虛擬電路)無連線(資料報)
可靠性保證送達、有序、無重複不保證,可能丟失/亂序/重複
資料單位位元組流 (Byte Stream)資料報
流控/擁塞控制內建滑動視窗、多演算法無,應用層自行實現
適用場景Web、郵件、資料庫、即時通訊DNS、串流媒體、遊戲、廣播

TCP 三大核心優勢機制

1. 自動化錯誤控制(檢查和 + ACK + 重傳)

發送方發送段落後啟動計時器;接收方檢查和通過後回 ACK,發送方收到 ACK 取消計時器;超時未收到 ACK 自動重傳。開發者無感知,除非網路嚴重故障(如路由不可達)拋出異常。

2. 可靠性:排序與重組

每個 TCP 段落攜帶序列號。網路傳輸可能導致亂序到達,TCP 接收端緩衝亂序段落,待前序段落到達後按序提交給應用層。應用層讀到的永遠是有序位元組流。

3. 易用性:統一 I/O 抽象

TCP Socket 以 InputStream/OutputStream 呈現,與檔案、管道、控制台 I/O 介面一致。開發者以流思維處理網路通訊,無需關心封包化/解封包細節。

端口:多路複用與服務識別

  • 範圍 1~65535,16 位元無符號整數。
  • Well-known Ports (0-1023):系統保留,需特權綁定(HTTP 80、SSH 22)。
  • Registered Ports (1024-49151):IANA 註冊服務使用。
  • Dynamic/Ephemeral Ports (49152-65535):客戶端臨時分配。

連線四元組唯一標識:{Src IP, Src Port, Dst IP, Dst Port}。同一伺服端 Port 可同時服務成千上萬客戶端,靠四元組區分。

Socket 操作分類

客戶端 Socket (java.net.Socket)

  • 建立連線:new Socket(host, port)(阻塞至三次交握完成)。
  • 資料收發:getInputStream()/getOutputStream()。
  • 關閉連線:close()(觸發四次揮手)。

伺服端 Socket (java.net.ServerSocket)

  • 綁定監聽:new ServerSocket(port) / new ServerSocket(port, backlog, bindAddr)。
  • 接受連線:accept() 返回新 Socket(每連線一個)。
  • 生命週期管理:close() 釋放端口。

Java 代碼實戰:Daytime 客戶端與伺服端

客戶端


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());
                }
            }
        }
    }
}

進階 Socket 選項調優

選項適用端建議值/策略
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 選項調優,是構建高效能網路應用的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved