前言

简单的说,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例子[六]的更多相关文章

  1. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...

  2. 计算机网络再次整理————tcp例子前奏[三]

    前言 简单编写一下tcp例子. 正文 我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层. 首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢? 首先要抛开有操作系统的意识 ...

  3. 计算机网络再次整理————tcp例子第二前奏[四]

    前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...

  4. 计算机网络再次整理————tcp周边[八]

    前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...

  5. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  6. 计算机网络再次整理————socket[一]

    前言 以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下. 正文 这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.ht ...

  7. 计算机网络再次整理————tcp的关闭[七]

    前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...

  8. 【转帖】计算机网络协议(三)——UDP、TCP、Socket

    计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更 ...

  9. 计算机网络体系结构整理-第二单元IP技术

    IP技术 1.IPV4 Ipv4的报头格式 Ipv4地址分为ABCDE类, 类别 IP地址范围 私有IP地址范围 A 0.0.0.0-127.255.255.255 10.0.0.0-10.255.2 ...

随机推荐

  1. 【LeetCode】583. Delete Operation for Two Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. 一站式元数据治理平台——Datahub入门宝典

    随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为新一代的元数据管理平台,Datahub在近一年的时间里发展迅猛,大有取代老牌元数据管理工具Atlas之势.国内Datahub ...

  3. <数据结构>图的最小生成树

    目录 最小生成树问题 Prim算法:点贪心 基本思想:类Dijstra 伪代码 代码实现 复杂度分析:O(VlogV + E) kruskal算法:边贪心 基本思想: 充分利用MST性质 伪代码 代码 ...

  4. 访问局域网内其他主机的VMware虚拟机上的mysql数据库和redis缓存

    上一篇写了访问局域网内其他主机的虚拟机上的项目 ,现在说说访问局域网内其他主机的虚拟机上的数据库和缓存 博主使用的linux是Ubuntu16.04: 一.安装数据库和缓存 这里连接的数据库和缓存以m ...

  5. centos6.5-rsync+inotify

    一.目的 通过监控192.168.3.10的目录,实现实时同步. 实验环境 centos1       192.168.3.10 centos2       192.168.3.11 二.配置 cen ...

  6. .NET 微服务——CI/CD(4):避坑和一点经验

    如果你看过之前几篇文章,应该已经Jenkins成功搭建了CICD环境,但是进入正式环境会有一些坑,不注意中招的话很难受,这里总结一下,避免重复消耗精力. 后门漏洞 Jenkins有后门,这是个老问题了 ...

  7. Python_关于python2的encode(编码)和decode(解码)的使用

    在使用Python2时,我们习惯于在文件开头声明编码 # coding: utf-8 不然在文件中出现中文,运行时就会报错 SyntaxError: Non-ASCII character... 之类 ...

  8. python+requests传两种参数体

    在JMeter请求参数中,我们了解到,在做接口测试时,发送请求的参数有两种格式,一种是Parameters,一种是JSON.怎么区分请看 https://www.cnblogs.com/testlea ...

  9. python的作用域、globals()-全局变量 和 locals()-局部变量

    在python中,函数会创建一个自己的作用域,也称为为命名空间.当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 我们自己定义的全局变量均在python内建的globals()函数中 ...

  10. linux中vim编辑器的翻页命令

    Linux jdk查看文件的最后一行         输入$回车 查看文件的第一行          输入0或者1回车 向前翻页                 Ctrl + f     f为forw ...