传输通信协议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)!