自学内容网 自学内容网

传输通信协议TCP和UDP

        TCP 通信是面向连接的,提供可靠的数据传输,适用于对数据准确性和完整性要求较高的场景;而 UDP 通信是无连接的,传输速度快但不可靠,适合实时性要求高且能容忍一定数据丢失的场景。在 C# 中,TcpListener 和 TcpClient 用于 TCP 通信,UdpClient 用于 UDP 通信,分别使用 NetworkStream 和 Send/Receive 方法来完成数据的发送和接收操作。        

TCP(传输控制协议) UDP(用户数据报协议)是两种常见的传输层通信协议,在计算机网络中起着重要作用,以下是对它们的详细介绍:

一、TCP(传输控制协议)

1.1)特点

1.1.1)面向连接

        在数据传输之前,需要在发送端和接收端之间建立连接,就像打电话一样,先拨号建立其双方的连接。连接建立后,双方才能进行数据传输,传输完成后再释放连接

1.1.2)可靠传输

        TCP通过序列号、确认应答、重传机制等保证数据的可靠传输。发送方发送数据时会为每个字节分配一个序列号,接收方收到数据后会发送确认应答告诉发送方数据已成功接收。如果发送方在规定时间内没有收到确认应答,就会重传数据

1.1.3)字节流传输

        TCP将数据看作是无结构的字节流,就像水流一样,它不关心数据的具体格式和含义,只负责将数据从一端正确的传向另一端

1.1.4)流量控制和拥塞控制

        TCP具有流量控制机制,通过接收方告诉发送方自己的接收窗口大小,来控制发送方的发送速度,防止接收方缓冲区溢出。同时,TCP还能进行拥塞控制,当网络出现拥塞时,自动调整发送速度,避免网络进一步拥塞

1.2)应用场景

1.2.1)文件传输

        例如FTP(文件传输协议),需要保证文件的完整和准确传输,TCP的可靠传输特性能够确保文件在传输过程中不丢失,不损坏

1.2.2)电子邮件

        SMTP(简单邮件传输协议)、POS3(邮局协议版本3)和IMAP(互联网消息访问协议)等邮件协议通常使用TCP,以确保邮件的正确传输和接收

1.2.3)网页浏览

        HTTP(超文本传输协议)基于TCP协议,确保网页数据能够完整,有序的传输到用户浏览器

1.3 )代码示例

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class TcpServer
{
    static void Main()
    {
        // 创建 TCP 监听器
        TcpListener server = new TcpListener(IPAddress.Any, 12345);
        server.Start();
        Console.WriteLine("服务器正在监听 12345 端口...");

        // 等待客户端连接
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("客户端已连接。");

        // 获取网络流
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[1024];
        int bytesRead;

        // 接收客户端数据
        bytesRead = stream.Read(buffer, 0, buffer.Length);
        string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine($"从客户端接收数据: {data}");

        // 发送响应数据
        string response = "Hello from TCP Server!";
        byte[] responseBytes = Encoding.ASCII.GetBytes(response);
        stream.Write(responseBytes, 0, responseBytes.Length);

        // 关闭连接
        client.Close();
        server.Stop();
    }
}


class TcpClientApp
{
    static void Main()
    {
        // 创建 TCP 客户端
        TcpClient client = new TcpClient();
        client.Connect("localhost", 12345);
        NetworkStream stream = client.GetStream();

        // 发送数据
        string message = "Hello from TCP Client!";
        byte[] messageBytes = Encoding.ASCII.GetBytes(message);
        stream.Write(messageBytes, 0, messageBytes.Length);

        // 接收服务器响应
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine($"从服务器接收数据: {response}");

        // 关闭连接
        client.Close();
    }
}

/*
代码解释:
服务器端:
TcpListener server = new TcpListener(IPAddress.Any, 12345);:创建一个 TCP 监听器,监听本地所有 IP 地址的 12345 端口。
server.Start();:启动监听器。
TcpClient client = server.AcceptTcpClient();:等待客户端连接,程序会阻塞直到有客户端连接。
NetworkStream stream = client.GetStream();:获取网络流,用于和客户端通信。
bytesRead = stream.Read(buffer, 0, buffer.Length);:从网络流中读取数据到 buffer 中。
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);:将接收到的字节数组转换为字符串。
stream.Write(responseBytes, 0, responseBytes.Length);:将响应数据写入网络流发送给客户端。
client.Close(); server.Stop();:关闭客户端连接和服务器监听器。
客户端:
TcpClient client = new TcpClient(); client.Connect("localhost", 12345);:创建 TCP 客户端并连接到服务器的 12345 端口。
NetworkStream stream = client.GetStream();:获取网络流。
stream.Write(messageBytes, 0, messageBytes.Length);:将数据写入网络流发送给服务器。
bytesRead = stream.Read(buffer, 0, buffer.Length);:从网络流中读取服务器的响应。
*/

二、UDP(用户数据报协议)

2.1)特点

2.1.1)无连接

        UDP 在发送数据时不需要先建立连接,就像写信一样,直接把信投进邮箱,不需要事先与收件人联系。发送方可以随时向接收方发送数据,相对比较灵活

2.1.2)不可靠传输

        UDP 不保证数据一定能成功到达接收方,也不保证数据的顺序和完整性。它只是尽最大努力将数据发送出去,就像寄信可能会丢失一样

2.1.3)数据报传输

        UDP 以数据报为单位传输数据,每个数据报都是独立的,包含源端口、目的端口、数据等信息。数据报之间没有顺序关系,接收方可能会乱序接收

2.1.4)低延迟

        由于 UDP 不需要建立连接和进行复杂的确认机制,所以数据传输的延迟较低,能够快速地将数据发送出去

2.2)应用场景

2.2.1)实时视频和音频流

        如视频会议、在线直播、IP 电话等,这些应用对实时性要求很高,允许一定程度的数据丢失,但不能有太大的延迟。UDP 的低延迟特性使其能够满足实时数据传输的需求

2.2.2)网络游戏

        游戏中的实时数据,如玩家的位置、动作等,需要快速传输,UDP 可以在不保证数据绝对可靠的情况下,以较低的延迟将数据发送到服务器和其他玩家的客户端

2.2.3)DNS(域名系统)

        DNS 用于将域名转换为 IP 地址,通常使用 UDP 进行查询和响应,因为 DNS 查询通常数据量较小,且对速度要求较高,UDP 能够快速地完成查询和响应过程

2.3 )代码示例

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class UdpServer
{
    static void Main()
    {
        // 创建 UDP 监听器
        UdpClient server = new UdpClient(12345);
        IPEndPoint clientEndpoint = new IPEndPoint(IPAddress.Any, 0);
        Console.WriteLine("服务器正在监听 12345 端口...");

        // 接收客户端数据
        byte[] buffer = server.Receive(ref clientEndpoint);
        string data = Encoding.ASCII.GetString(buffer);
        Console.WriteLine($"从客户端接收数据: {data}");

        // 发送响应数据
        string response = "Hello from UDP Server!";
        byte[] responseBytes = Encoding.ASCII.GetBytes(response);
        server.Send(responseBytes, responseBytes.Length, clientEndpoint);

        // 关闭连接
        server.Close();
    }
}


class UdpClientApp
{
    static void Main()
    {
        // 创建 UDP 客户端
        UdpClient client = new UdpClient();
        IPEndPoint serverEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);

        // 发送数据
        string message = "Hello from UDP Client!";
        byte[] messageBytes = Encoding.ASCII.GetBytes(message);
        client.Send(messageBytes, messageBytes.Length, serverEndpoint);

        // 接收服务器响应
        byte[] buffer = client.Receive(ref serverEndpoint);
        string response = Encoding.ASCII.GetString(buffer);
        Console.WriteLine($"从服务器接收数据: {response}");

        // 关闭连接
        client.Close();
    }
}

/*
代码解释:
服务器端:
UdpClient server = new UdpClient(12345);:创建一个监听 12345 端口的 UDP 监听器。
byte[] buffer = server.Receive(ref clientEndpoint);:接收客户端发送的数据,同时获取客户端的 IPEndPoint。
string data = Encoding.ASCII.GetString(buffer);:将接收到的字节数组转换为字符串。
server.Send(responseBytes, responseBytes.Length, clientEndpoint);:将响应数据发送给客户端。
server.Close();:关闭 UDP 监听器。
客户端:
UdpClient client = new UdpClient();:创建 UDP 客户端。
client.Send(messageBytes, messageBytes.Length, serverEndpoint);:将数据发送到服务器。
byte[] buffer = client.Receive(ref serverEndpoint);:接收服务器的响应。
*/

三、TCP和UDP的区别

新对话 - 豆包https://www.doubao.com/chat/887248049284866

四、TCP和UDP的使用

选择使用 TCP 还是 UDP 协议,需要综合考虑多个因素,根据不同的实际需求来选择

4.1)可靠性要求

        1 )TCP :

        当对数据的准确性和完整性要求极高,不允许有任何数据丢失或者错误的情况出现时,应该选择TCP,例如金融交易系统,文件传输,数据库同步等场景都需要保证数据的完整和准确,TCP的可靠传输机制能确保数据在传输的过程中不丢失,不损坏,不重复。

        2 )UDP :

        如果应用能够容忍一定程度的数据丢失,更驻注重数据的实时性和连续性,那么选择UDP是更好的选择,例如视频监控系统,因为在在线游戏中,玩家的位置和动作数据的实时更新比准确性绝对的准确性更重要,少量数据丢失可能只会导致画面稍微卡顿,但不会影响游戏的整体进行

4.2)实时性要求

    1 )TCP :

        TCP 需要建立连接、进行确认应答和重传等操作,会引入一定的延迟,不太适合对实时性要求极高的场景。但在一些对实时性要求不是极其严格,且需要保证数据准确的场景中,如网页浏览、电子邮件传输等,TCP 的延迟是可以接受的

        2 )UDP :

        UDP 没有连接建立和复杂的确认机制,数据可以快速发送出去,延迟较低。在实时视频会议、语音通话等场景中,即使网络有一定延迟或丢包,UDP 也能保证音频和视频的基本流畅,提供较好的实时交互体验

4.3)数据量和传输频率

    1 )TCP :

        对于大量数据的传输,TCP 的可靠性和流量控制机制能够保证数据的稳定传输,避免网络拥塞和数据丢失。例如,下载大型软件、高清电影等,TCP 能够根据网络状况自动调整传输速度,确保数据完整下载

        2 )UDP :

        当需要频繁传输小数据量时,UDP 的无连接特性可以减少传输开销,提高传输效率。如物联网设备之间的传感器数据传输,通常数据量较小,但需要频繁发送,UDP 能够快速地将数据发送出去,满足实时性需求

4.4)网络环境

    1 )TCP :

        在网络环境相对稳定、带宽充足的情况下,TCP 能够充分发挥其优势,保证数据的可靠传输。但在网络不稳定、丢包率较高的环境中,TCP 的重传机制可能会导致传输效率下降,延迟增加

        2 )UDP :

        UDP 在网络不稳定的情况下,仍然能够以较低的延迟发送数据,不会因为丢包而进行大量的重传,适用于无线网络、移动网络等环境。例如,在 4G、5G 网络下进行视频直播,UDP 能够更好地适应网络的波动,保证直播的流畅性

4.4)应用场景特性

    1 )TCP :

        如果应用场景需要严格的顺序控制和数据完整性,如 HTTP 协议用于网页浏览,需要按照顺序准确地获取网页的所有内容;Telnet 远程登录,需要保证命令和数据的准确传输,TCP 是首选协议

        2 )UDP :

        对于具有广播或多播需求的应用,如网络电视、实时路况信息发布等,UDP 可以方便地将数据发送到多个接收端,实现一对多的通信


原文地址:https://blog.csdn.net/2401_84642440/article/details/145293994

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!