✅ 什么是 TCP 协议?

TCP(传输控制协议) 是一种面向连接、可靠传输、基于字节流的通信协议。

📦 简单理解:打电话前要先拨号(建立连接),通话中对方要回应(确认),最后挂电话(断开连接),这就是 TCP 的行为风格!


✅ TCP 的特点

特点 说明
面向连接 通信前必须建立连接(三次握手)
可靠传输 保证数据正确、无误、无重复地到达
有序传输 按照发送顺序到达(使用序号)
双向通信 全双工,双方都可以发送/接收
基于字节流 传输是连续的字节流,而非分包发送

✅ TCP 工作流程

1️⃣ 建立连接(三次握手)

1
2
3
4
客户端       服务端
| ---SYN---> | 第一次握手:客户端发起连接请求
| <---SYN+ACK | 第二次握手:服务端响应连接请求
| ---ACK----> | 第三次握手:客户端确认,连接建立成功

✅ 建立完连接后,客户端和服务端就可以开始数据传输了。


2️⃣ 数据传输

  • 使用 序列号(Sequence Number)确认号(ACK) 来保证数据可靠和有序。
  • 如果数据丢失或出错,会自动 重传
  • 每次发送的数据都有编号,接收方必须回 ACK。

3️⃣ 断开连接(四次挥手)

1
2
3
4
5
客户端       服务端
| ---FIN----> | 第一次挥手:客户端请求断开连接
| <---ACK----- | 第二次挥手:服务端确认
| <---FIN----- | 第三次挥手:服务端也请求断开
| ---ACK----> | 第四次挥手:客户端确认,断开成功

✅ Java 中使用 TCP 通信(Socket)

☑️ 服务端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
import java.net.*;

public class TCPServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动,等待连接...");

Socket socket = serverSocket.accept(); // 等待客户端连接
System.out.println("客户端已连接!");

InputStream is = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String msg = reader.readLine();
System.out.println("收到客户端消息:" + msg);

socket.close();
serverSocket.close();
}
}

☑️ 客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.*;
import java.net.*;

public class TCPClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 8888);

OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.println("Hello, TCP Server!");
writer.flush();

socket.close();
}
}

✅ TCP vs UDP 对比

特性 TCP UDP
连接方式 面向连接(三次握手) 无连接
可靠性 可靠(丢包会重传) 不可靠(可能丢包)
传输顺序 保证顺序 不保证顺序
速度 慢(需要握手确认) 快(无需连接)
使用场景 文件传输、HTTP、邮件等 视频直播、语音通话、游戏等

✅ 总结

描述
是否可靠 ✅ 是(确认 + 重传 + 编号)
是否连接 ✅ 是(通过三次握手)
使用方式 使用 SocketServerSocket 实现
应用场景 文件传输、Web 通信、数据库连接等