TCP 与 UDP 介绍

每日微进,日积跬步,终将登上人生高峰。

TCP(传输控制协议)和 UDP(用户数据报协议)是两种不同的网络协议,它们用于在网络中传输数据。TCP 提供可靠的数据传输,而 UDP 提供不可靠的数据传输。

TCP 与 UDP 的区别与优缺点

TCP (Transmission Control Protocol)

特点:

  1. 面向连接:在传输数据前需要建立连接(三次握手)。
  2. 可靠传输:TCP保证数据包的顺序和完整性,通过确认应答、重传机制和流量控制来实现。
  3. 有序传输:保证数据包按顺序到达。
  4. 流量控制:通过滑动窗口机制控制数据流量。
  5. 拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复机制来避免网络拥塞。

优点:

  • 可靠性高,适用于需要保证数据完整性和顺序的场景,如文件传输、电子邮件、HTTP等。

缺点:

  • 由于需要建立连接和可靠传输,开销较大,传输速度相对较慢,不适用于实时性要求高的场景。
UDP (User Datagram Protocol)

特点:

  1. 无连接:不需要建立连接,直接发送数据。
  2. 不保证可靠性:不保证数据包的顺序和完整性,没有确认应答机制。
  3. 无流量控制和拥塞控制。

优点:

  • 传输速度快,开销小,适用于对实时性要求高但对数据完整性要求不高的场景,如视频直播、在线游戏、语音通话等。

缺点:

  • 可靠性低,易丢包,不保证数据顺序到达。

TCP 如何保证可靠传输

  1. 三次握手:建立连接时,通过三次握手确保双方准备就绪。
  2. 确认应答机制:每个数据包都需要确认,发送方在一定时间内未收到确认会重传。
  3. 超时重传:发送数据后等待确认,若超时未收到确认则重传。
  4. 序列号和确认号:每个数据包都有序列号,接收方通过确认号告知发送方已收到的数据。
  5. 滑动窗口:控制数据流量,确保接收方有足够的缓冲区处理数据。
  6. 拥塞控制:避免网络拥塞,通过慢启动、拥塞避免等算法调整发送速度。

Java 代码示例

TCP 示例

TCP Server:

java 复制代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            System.out.println("TCP Server started on port 8080...");
            while (true) {
                try (Socket clientSocket = serverSocket.accept();
                     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
                     
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        System.out.println("Received: " + inputLine);
                        out.println("Echo: " + inputLine);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TCP Client:

java 复制代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8080);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
             
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("Server reply: " + in.readLine());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
UDP 示例

UDP Server:

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket(8080)) {
            byte[] buf = new byte[256];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            System.out.println("UDP Server started on port 8080...");

            while (true) {
                socket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Received: " + received);

                // Send response back to the client
                String response = "Echo: " + received;
                byte[] responseBuf = response.getBytes();
                DatagramPacket responsePacket = new DatagramPacket(responseBuf, responseBuf.length, packet.getAddress(), packet.getPort());
                socket.send(responsePacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UDP Client:

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UDPClient {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket()) {
            InetAddress address = InetAddress.getByName("localhost");
            Scanner scanner = new Scanner(System.in);

            while (true) {
                System.out.print("Enter message: ");
                String msg = scanner.nextLine();

                byte[] buf = msg.getBytes();
                DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8080);
                socket.send(packet);

                // Receive response from the server
                byte[] responseBuf = new byte[256];
                DatagramPacket responsePacket = new DatagramPacket(responseBuf, responseBuf.length);
                socket.receive(responsePacket);
                String received = new String(responsePacket.getData(), 0, responsePacket.getLength());
                System.out.println("Server reply: " + received);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

说明

TCP示例:

  • TCPServer :通过ServerSocket监听8080端口,接受客户端连接并处理输入输出。
  • TCPClient :通过Socket连接到服务器,发送和接收数据。

UDP示例:

  • UDPServer :通过DatagramSocket监听8080端口,接收和发送数据包。
  • UDPClient :通过DatagramSocket发送数据包到服务器,并接收服务器的响应。

总结

  • TCP适用于需要保证数据传输可靠性和顺序的应用场景,如文件传输和网页浏览。
  • UDP适用于对实时性要求高但对数据可靠性要求不高的应用场景,如视频直播和在线游戏。
相关推荐
IpdataCloud7 分钟前
高精度IP定位服务怎么评估?从数据源、精度层级到实测验证的完整框架
服务器·网络·tcp/ip·ip
韩曙亮31 分钟前
【错误记录】网络配置问题处理 ( 获取服务器的 出口 和 入口 IP | 定位网络变化 )
服务器·网络·tcp/ip
小此方1 小时前
Linux网络(二十二):深入解析IP协议:从地址寻址、头部结构到内核机制与TTL环路控制
linux·网络·tcp/ip
惊讶的猫1 小时前
F12 Network:把“发 HTTP 请求”这件事变成看得见的东西
网络·网络协议·http
沫璃染墨1 小时前
从零入门计算机网络系列(五):UDP套接字编程实战——从核心API到客户端与服务器通信
linux·网络·c++·vscode·网络协议·udp
dadaobusi1 小时前
学习: flit vs tlp
网络·网络协议
paopaokaka_luck1 小时前
剧本杀预约管理系统(AI客服、 webSocket在线沟通、协同过滤算法推荐、Echarts多维分析、 QQ邮箱通知、 腾讯地图导航、四角色协作)
websocket·网络协议·echarts
ITxiaobing20232 小时前
自研 IP 库与 AppsFlyer 地理位置判定不一致,该如何排查?
网络·数据库·tcp/ip
ZeroNews内网穿透2 小时前
内网穿透公网暴露防护:边缘网关 IP 黑白名单运维实践
运维·网络协议·tcp/ip·内网穿透·api安全·企业网络安全·运维实践
honsor2 小时前
机房动环监控:以太网温湿度传感器选型与部署全解
运维·服务器·网络·物联网·网络协议·tcp/ip