ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机网络再次整理————UDP例子[六]

2022-02-06 21:33:06  阅读:224  来源: 互联网

标签:UDP 那么 socket udp tcp System 计算机网络 例子


前言

简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下。

正文

秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP。

只是了解和知晓其中的用途,那么设计方案的时候有特定的场景,那么可以参考。

UDP 和 TCP 最大的不同的地方是传输方式,不然他们也不会在传输层进行分叉。

UDP 不知道对方是否存在,那么会直接发送信息出去,对方也不会告诉你是否收到了,是否需要重传。

有些人把TCP 比作是接打电话,那么UDP就像是投递邮件了。

UDP 只要将对方的地址和写信的内容进行投递,那么网络基础设施就会帮我们把信件投递出去。

那么即使信件中途丢失,我们也是不知道的。我们能知道的是,我们的信是否交到了邮件员手中。

还有和TCP 一个最大的区别,我们收邮件的时候只需要放置一个邮箱。而我们同时接打电话的时候,需要多台电话机。

是的,如果是UDP 那么服务端只需要创建一个socket的。如果是TCP,那么一个客户端,服务端就要多创建一个socket了。

我们说UDP 是无序的、不可靠的、有数据边界的。

有数据边界的是因为UDP 不是流的,每对操作系统的UDP发送信息接口调用一次,那么就会发出去一次,也就是会进行一次网络io。

无序的,这个比较好理解,因为网络中路由的选择啊,算法啊,等等因素,那么可能发送1、2、3,收到的是3、1、2,或者其他组合。

那么说其是不可靠的,这个也比较好理解了,因为不像UDP那么复杂,没有那么多保障措施。

说起来UDP更加简单了,我们知道简单的东西在计算机上,基本意味这更快。

为什么UDP 更快呢?

  1. 收发数据前后进行的连接设置及清除过程。也就是连接和断开。

  2. 收发数据过程中为保证可靠性而添加的流控制。

那么是不是我们需要更快的传输就使用udp呢?这不是的,首先我们一定是首选tcp的,当tcp不满足我们的时候那么才使用udp。

也不要认为udp跟快,那么就使用udp能提高性能。

tcp和udp的速度差距不是我们想象的那么快,而tcp带来了可靠。如果是在传输数据量大的时候,我们的tcp和udp的速度是很接近的。

一般在传输视频的时候可以使用udp,因为即使有某段丢包,那么也就是卡帧的问题。

因为udp包里面的数据可以带时间,那么其顺序就没有那么重要,应用程序可以处理。

udp的场景,那么适合不在意包的顺序,同时对丢包没有那么敏感。当然udp也可以在应用层协议中有重传等保证数据的机制,但是这样为啥不直接使用tcp呢。

实验代码:
service:

// See https://aka.ms/new-console-template for more information

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

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var ipAddress = IPAddress.Parse("127.0.0.1");
EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
socket.Bind(endPoint);
while (true)
{
    Console.WriteLine("开始接收");
    var receiveMessage = new Byte[1000];
    socket.Receive(receiveMessage);
    Console.WriteLine(System.Text.Encoding.UTF8.GetString(receiveMessage));
    Console.WriteLine("接收完毕");
}

client:


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

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var ipAddress = IPAddress.Parse("127.0.0.1");
EndPoint endPoint = new IPEndPoint(ipAddress, 8888);
socket.Connect(endPoint);
socket.Send(System.Text.Encoding.UTF8.GetBytes("hello service"));
socket.Send(System.Text.Encoding.UTF8.GetBytes("hello service2"));
Console.WriteLine("发送成功");
// 收到的包
var receive = new byte[1000];
socket.ReceiveFrom(receive,SocketFlags.OutOfBand, ref  endPoint);
Console.WriteLine(receive);
Console.ReadLine();

可以看到在客户端这里,我写了一个ReceiveFrom。

那么我做了一个这样的实验,就是我不启动服务端然后开启客户端的情况下,我使用了ReceiveFrom。

那么会抛出异常,那么这个异常是如何抛出来的呢?或者说是不是有一个试探包发送,看是否有回应呢。

这个异常抛出是因为收到了icmp包,也就是端口不可达。假如我们直接ReceiveFrom,那么是不会发送异常的,那么我们程序做的事情就是调用操作系统的api,询问是否有新的消息,操作系统没有给,那么其实处于一个阻塞状态。

这里想说明的一点就是udp和tcp这种传输层,不要和ip层弄混,ip层有的协议,udp和tcp都有。

抓包截图:

下一结介绍一些tcp的关闭。

标签:UDP,那么,socket,udp,tcp,System,计算机网络,例子
来源: https://www.cnblogs.com/aoximin/p/15864270.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有