计算机网络再次整理————UDP例子[六]
前言
简单的说,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 更快呢?
收发数据前后进行的连接设置及清除过程。也就是连接和断开。
收发数据过程中为保证可靠性而添加的流控制。
那么是不是我们需要更快的传输就使用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例子[六]的更多相关文章
- 计算机网络再次整理————tcp例子[五]
前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...
- 计算机网络再次整理————tcp例子前奏[三]
前言 简单编写一下tcp例子. 正文 我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层. 首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢? 首先要抛开有操作系统的意识 ...
- 计算机网络再次整理————tcp例子第二前奏[四]
前言 前文我们介绍了网络协议的各层,同时也介绍了一下我们在编写代码时候的服务端的accept.bind.listen.connect.send做了什么. 可以说是从宏观的角度,或者代码开发的角度来说的 ...
- 计算机网络再次整理————tcp周边[八]
前言 tcp的包的格式可以看我以前的计算机网络整理,下面这些周边只是为了开发时候我们能用到一些理论知识. 正文 首先要介绍的就是域名,为啥有域名这东西呢?单纯站在网络的角度上讲这属于应用层的东西了. ...
- 计算机网络再次整理————tcp[二]
前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...
- 计算机网络再次整理————socket[一]
前言 以前也整理过吧,写了几篇之后,感觉没啥整理的必要了然后就放弃了,最近又想整理一下. 正文 这篇对应的是:https://www.cnblogs.com/aoximin/p/12235333.ht ...
- 计算机网络再次整理————tcp的关闭[七]
前言 tcp的关闭不是简单粗暴的,相对而言是友好优雅的,好聚好散吧. 那么友好的关闭方式是这样的: 假设这里是客户端请求关闭的,服务端倒过来. 客户端:我要请求关闭 服务端:我接收到你的请求了,等我把 ...
- 【转帖】计算机网络协议(三)——UDP、TCP、Socket
计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更 ...
- 计算机网络体系结构整理-第二单元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 ...
随机推荐
- Soldier and Traveling
B. Soldier and Traveling Time Limit: 1000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...
- 如何利用Python实现Office在线预览
目前,市场对于Office在线预览功能的需求是很大的.对于我们用户本身来说,下载Office文件后再实现预览是极其不方便的,何况还有一些不能打开的专业文档.压缩文件等.此时,能提供在线预览服务的软件就 ...
- Orthogonal Convolutional Neural Networks
目录 概 主要内容 符号说明 的俩种表示 kernel orthogonal regularization orthogonal convolution Wang J, Chen Y, Chakrab ...
- CS5211替代CH7511B|设计DP转LVDS转接板|替代CH7511B
CH7511B是一款DP转lvds屏转换芯片CH7511B是一款eDP转LVDS转换芯片.CH7511B将嵌入式DisplayPort信号转换为LVDS(低压差分信号).通过CH7511B的高级解码/ ...
- SpringCloud使用汇总Config
1.Config Server对外提供的资源格式 配置中心的HTTP服务有5种资源格式: /{application}/{profile}[/{label}] /{application}-{prof ...
- 使用docker快速部署一个consul集群
作为一个开发者,有时候需要一个集群环境,之前的做法要么就是使用多个虚拟机,要么就是采用不同的端口来模拟,但是虚拟机比较占内存,而且启动慢,采用不同的端口来模拟,管理起来比较麻烦一些,程序隔离性差一些. ...
- JZOJ 3296 Luogu P3296 [SDOI2013]刺客信条
前言 做法来自:@pzrpzr ,写一下!Orz pzr! 题目大意 \(n\) 个点的无根树,每个点有两个 \(0/1\) 权值,合适地安排节点在同构树中的顺序,使得前后对应的权值不同节点个数最小, ...
- 高可用k8s集群搭建
虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...
- javascript中new url()属性,轻松解析url地址
1.首先写一个假的地址(q=URLUtils.searchParams&topic=api)相当于当前的window.location.href const urlParams = new U ...
- SYCOJ137斜线输出(1)
题目-斜线输出(1) (shiyancang.cn) 在同一斜线上的满足方程.坐标关系计算即可. #include<bits/stdc++.h> using namespace std; ...