✅ 什么是 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、邮件等 |
视频直播、语音通话、游戏等 |
✅ 总结
| 点 |
描述 |
| 是否可靠 |
✅ 是(确认 + 重传 + 编号) |
| 是否连接 |
✅ 是(通过三次握手) |
| 使用方式 |
使用 Socket 和 ServerSocket 实现 |
| 应用场景 |
文件传输、Web 通信、数据库连接等 |