TCP vs UDP:核心区别、握手过程与应用场景(附对比图)

🌐 引言

在网络通信中,TCP(传输控制协议)和UDP(用户数据报协议)是两大核心传输层协议。它们各有优劣,适用于不同场景。本文将用图文对比+实战示例,帮你彻底理解两者的区别!

🔍 一、核心区别对比表

特性 TCP UDP
连接方式 面向连接(需握手) 无连接(直接发送)
可靠性 ✅ 可靠(确认重传机制) ❌ 不可靠(可能丢包)
数据顺序 ✅ 保证顺序 ❌ 不保证顺序
传输效率 ⚠️ 较低(需额外控制开销) ⚡ 极高(无控制字段)
流量控制 ✅ 滑动窗口机制 ❌ 无控制
拥塞控制 ✅ 动态调整速率 ❌ 无控制
头部大小 20-60字节 仅8字节
典型应用 HTTP/HTTPS、FTP、SSH 视频流、DNS、在线游戏

🤝 二、TCP的三次握手与四次挥手(图解)

1. 三次握手建立连接

Client Server SYN=1, seq=x (我要连接) SYN=1, ACK=1, seq=y, ack=x+1 (我准备好了,你呢?) ACK=1, seq=x+1, ack=y+1 (确认!开始通信) Client Server

目的:同步初始序列号(ISN),确保双方收发能力正常。

2. 四次挥手断开连接

Client Server FIN=1, seq=u (我要断开) ACK=1, ack=u+1 (收到请求) FIN=1, seq=v (我也要断开) ACK=1, ack=v+1 (确认断开) Client Server

为什么需要四次?

因为TCP是全双工的,两端需分别确认关闭。

🎯 三、UDP的通信流程(图解)

Sender Receiver 直接发送数据包(无握手) 可能丢失、乱序或重复 Sender Receiver

特点:

  • 像寄平信,不关心对方是否收到
  • 头部仅8字节(源端口+目标端口+长度+校验和)

💡 四、如何选择TCP还是UDP?

✅ 用TCP的场景

  • 需要可靠传输(如文件下载、网页访问)
  • 需保证数据顺序(如数据库同步)
  • 容忍一定延迟(如电子邮件)

✅ 用UDP的场景

  • 实时性优先(如视频会议、直播)
  • 高频小数据包(如DNS查询、游戏战斗数据)
  • 广播/组播(如IPTV)

☕ 五、Java实战代码示例

1. TCP客户端/服务端

TCP服务端(接收数据)

java 复制代码
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客户端(发送数据)

java 复制代码
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服务端(接收数据)

java 复制代码
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客户端(发送数据)

java 复制代码
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 = 对讲机喊话(快速但可能听不清)
  • 选择协议时,先问自己:"我更怕数据丢失,还是更怕延迟?"

❓ 互动问题

你在项目中用过UDP吗?遇到了哪些挑战?欢迎评论区讨论!

相关推荐
Escalating_xu34 分钟前
【Linux 网络编程】connect 的断线重连:用状态机写一个能恢复连接的 TCP 客户端
linux·网络·tcp/ip
SL_staff1 小时前
4G设备掉线三层归因指南:SIM卡、模组、JVS-IOT网关配置精准锁定
java·物联网·产品
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
杨杨杨大侠3 小时前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff3 小时前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n3 小时前
【算法】约瑟夫环问题
java·算法
郝亚军3 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
譕痕3 小时前
stripe 实例
java·开发语言·stripe·checksession
墨子夕3 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人3 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维