iOS高级理论:UDP的介绍和使用

一、Socket简介

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

二、UDP的特点

UDP是是面向非连接的协议,传送数据不需要和服务器连接,只需要知道ip和监听端口,不需要链接没有目的的socket,只是将数据报投递出去,不管接收方是否成功接收到,是一种不可靠的传输。
既然UDP是不可靠数据传输协议,那为什么那么多应用去选择UDP呢?

1、关于何时、发送什么数据的应用层控制更加精细

只要应用将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立刻将其传递给网络层。
而TCP则是有个拥塞控制机制,以确保数据能够安全传输,而不管可靠传输成功需要用多少时间。
所以有些实时应用,比如微信视频、语音都是更希望数据能够及时发送,为此可以容忍一部分数据丢失,比较适合用UDP。

2、无需连接建立

众所周知,TCP在数据传输前需要经过三次握手,UDP却不需要做任何的准备即可进行数据传输,因此UDP不会引入建立连接的时延。
这也是DNS运行在UDP而不是TCP上的主要原因。
而HTTP协议之所以使用TCP,是因为对于HTTP协议来说,可靠性是至关重要的。

3、无连接状态

TCP需要维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。(后面如果有时间,会详细说下TCP的拥塞控制方案,对该方案来说,这些状态信息都是必要的)
而UDP不需要维护连接状态,也不用跟踪这些参数。

4、分组首部开销小
每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销
所以,如非必要,比如电子邮件,远程终端服务,web,以及文件传输,需要可靠地数据传输,会去采用TCP。其余的尤其是对实时性要求高的应用,比如实时视频会议,网络电话,一般都会选用UDP。

三、TCP和UDP的区别

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

区别

关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

四、UDP分片发送数据的实现过程

UDP(User Datagram Protocol)是一种无连接的传输协议,它不提供分片和重组的功能。UDP将应用层传递给它的数据报直接封装成UDP数据报,然后通过网络传输。因此,UDP的分片发送数据的实现过程与TCP有所不同。

在UDP中,如果应用层的数据报长度超过了网络的最大传输单元(MTU),UDP将无法自动进行分片。在这种情况下,应用程序需要手动将数据进行分片,并将分片后的数据报发送出去。

UDP分片发送数据的实现过程如下:

  1. 应用程序将要发送的数据报分为适当大小的片段。片段的大小通常要小于MTU,以确保能够在网络上正确传输。

  2. 对每个片段进行封装,即在每个片段前添加UDP头部,包括源端口号和目标端口号等信息。

  3. 将封装后的片段通过网络发送出去。可以使用网络套接字API(如socket)发送UDP数据报。

  4. 接收方收到UDP数据报后,根据UDP头部的信息进行解封装,获取原始的片段数据。

  5. 接收方根据片段的顺序和标识信息进行重组,将所有片段按顺序组合成完整的数据报。

需要注意的是,UDP的分片发送是在应用层进行的,而不是在传输层或网络层。因此,UDP分片发送的可靠性和顺序性需要应用程序自己来保证,UDP本身不提供这些功能。

此外,UDP的分片发送可能会导致数据报的丢失或乱序,因为UDP是无连接的,不保证数据的可靠传输。因此,在使用UDP进行分片发送数据时,应用程序需要考虑网络的可靠性和丢包重传等问题,并根据具体的需求选择合适的应用层协议或机制来保证数据的正确传输。

iOS UDP的使用

一、UDP的使用

1.1 引入相关头文件,定义变量
#import "GCDAsyncUdpSocket.h"@interface UdpManager ()<GCDAsyncUdpSocketDelegate>{GCDAsyncUdpSocket *_receiveSocket;NSString * _destHost;NSInteger _destPort;}
1.2 初始化socket,发送数据

初始化 UDP socket ,并绑定端口号和主机IP地址:

- (void)initGCDSocket
{_destHost = @"127.0.0.1";_destPort = @"8888";_receiveSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:selfdelegateQueue:dispatch_get_global_queue(0, 0)];NSError *error;// 绑定一个端口(可选),如果不绑定端口, 那么就会随机产生一个随机的唯一的端口// 端口数字范围(1024,2^16-1)[_receiveSocket bindToPort:_destPort error:&error];if (error) {NSLog(@"服务器绑定失败");}// 开始接收对方发来的消息[_receiveSocket beginReceiving:nil];
}
1.2 调用socket,发送数据
 - (void)sendMessage:(NSString *)message
{NSData *sendData = [message dataUsingEncoding:NSUTF8StringEncoding];// 该函数只是启动一次发送 它本身不进行数据的发送, 而是让后台的线程慢慢的发送 也就是说这个函数调用完成后,数据并没有立刻发送,异步发送[_receiveSocket sendData:sendData toHost:_destHost port:_destPort withTimeout:60 tag:500];
}
1.3 收到消息
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext {NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];_destPort = [GCDAsyncUdpSocket portFromAddress:address];_destHost = [GCDAsyncUdpSocket hostFromAddress:address];NSLog(@"来自%@---%zd:%@",_destHost,_destPort,message);
}

二、GCDAsyncUdpSocketDelegate 其他的代理方法

//连接成功
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address;//连接失败
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error;//发送数据
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag;//发送数据报时发生错误(超时或者发送数据太大等)
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error;//接受数据
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)datafromAddress:(NSData *)addresswithFilterContext:(nullable id)filterContext;//关闭连接
- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError  * _Nullable)error;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络防御保护3

一、双击热备 1&#xff0c;根据网段划分配置IP地址和安全区域 2&#xff0c;配置双机热备场景 主备场景配置 抢占延时仅对主设备生效。 hello报文周期时间--- 默认为1S&#xff0c;可以修改&#xff0c;但是&#xff0c;主备设备需要同时修改为相同值。 同步配置 双机热备的…

LLM概览:从起源至LangChain的资源整合,及对NLP领域的深远影响(LLM系列01)

文章目录 LLM概览&#xff1a;从起源至LangChain的资源整合&#xff0c;及对NLP领域的深远影响&#xff08;LLM系列01&#xff09;引言早期统计语言模型的奠基Transformer架构带来的革命技术里程碑&#xff1a;预训练、微调与模型演进大型LLM时代的来临与挑战 LangChain&#x…

【C++】手把手教你手搓模拟实现string类

前言 string类一直都是C的经典问题&#xff0c;之前的文章已经对string类做了一个基本的介绍&#xff08;string类的基本常用接口&#xff09;&#xff0c;为了更好理解string类的功能&#xff0c;此篇文章将手把手教你带你手搓模拟实现string类&#xff0c;快来一起学习吧&am…

预训练大模型LLM的PEFT之—— Prefix Tuning

简介 Prefix Tuning是2021.01提出来的&#xff0c;在它之前&#xff0c;我们使用prompt主要是人工设计模板或者自动化搜索模板&#xff0c;也就是prompt范式的第一阶段&#xff0c;就是在输入上加上prompt文本&#xff0c;再对输出进行映射。这种离散模板对模型的鲁棒性很差。…

向爬虫而生---Redis 探究篇2<redis集群(1)>

前言: 经常会遇到这样的事,redis运行一段时间以后,就会出现迟钝和卡壳! 这时候,说明已经到了瓶颈期了,需要用到redis集群了! 那么,弄明白集群的几个概念是必要的,我用案例来讲,,, 正文: 当需要处理大量数据或提供高可用性和性能时&#xff0c;Redis集群是一种常见的解决方案。…

SpringBoot接收参数的几种形式

SpringBoot接收参数的几种形式 在SpringBoot中获取参数基本方式有5种,需要都掌握. 这里需要记住一个技术术语或概念 API接口: 你写好的那个URL地址,就被称为API接口 1. 接收常规参数 给/param/demo1这个URL接口发送id, name两个参数 以上是以GET请求类型进行发送,实际发送…

Kubernetes IoTDB系列 | IoTDB数据库同步|IoTDB数据库高可用 | v1.3.0

目录 一、介绍二、应用场景三、IoTDB 数据库搭建四、数据同步一、介绍 IoTDB 数据同步功能可以将 IoTDB 的数据传输到另一个数据平台,我们将一个数据同步任务称为 Pipe。 一个 Pipe 包含三个子任务(插件): 抽取(Extract)处理(Process)发送(Connect)Pipe 允许用户自…

周鸿祎免费课演示AI新品,瞬时流量暴增现场增加服务器

2月29日&#xff0c;360创始人周鸿祎首堂AI免费课开讲&#xff0c;吸引千万网友围观。演讲现场周鸿祎演示了两款AI驱动的新产品。在演示测试版360AI搜索时&#xff0c;由于用户体验火爆&#xff0c;瞬时流量暴增44倍&#xff0c;为满足用户和全网用户需求临时增加了服务器。产品…

springboot+vue网站开发-渲染前端列表页面-缩略图信息

springbootvue网站开发-渲染前端列表页面-缩略图信息&#xff01;内容比较多。这是第一篇&#xff0c;先给大家展示的是&#xff0c;基础的代码封装&#xff0c;vue前端网站模块的代码展示。 我们使用到了pinia-存储我们请求过来的数据&#xff0c;它是一个状态管理&#xff0c…

android开发平台,Java+性能优化+APP开发+NDK+跨平台技术

开头 通常作为一个Android APP开发者&#xff0c;我们并不关心Android的源代码实现&#xff0c;不过随着Android开发者越来越多&#xff0c;企业在筛选Android程序员时越来越看中一个程序员对于Android底层的理解和思考&#xff0c;这里的底层主要就是Android Framewok中各个组…

linux 安装node20

由于Node.js 的官方仓库中可能不会包含所有历史版本&#xff0c;特别是较新的版本&#xff0c;您可以采用以下步骤来安装&#xff1a; 使用 nvm (Node Version Manager) 安装 nvm 是一个方便的工具&#xff0c;可以让你在单个系统上管理多个 Node.js 版本。首先安装 nvm&…

老卫带你学---leetcode刷题(191. 位1的个数)

191. 位1的个数 问题 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&…

linux文件及文件内容查找命令总结

在linux环境下&#xff0c;我们经常要查找一个文件或者文件的内容&#xff0c;但搜索的命令有很多&#xff0c;这些命令都有什么区别&#xff0c;应该怎么选择和使用呢&#xff1f; 下面总结了一些常见的文件查找、内容查找的命令&#xff0c;收藏起来备用吧。 文件查找 where…

二叉树——二叉树所有路径

二叉树所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","1-…

华为云项目部署

前端部署 将dist文件夹下的内容拷贝到/usr/local/nginx/html下 #启动脚本是在 # /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #停止 /usr/local/nginx/sbin/nginx -s stop #重载 /usr/local/nginx/sbin/nginx -s rel…

LeetCode 第45天 | 57. 爬楼梯 322. 零钱兑换 518. 零钱兑换II 279. 完全平方数 动态规划

57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述 输入共一行&…

Go语言必知必会100问题-10 小心类型嵌入导致的问题

小心类型嵌入导致的问题 在定义结构体时&#xff0c;Go语言支持通过类型嵌入的形式定义结构体字段。但是&#xff0c;如果我们没有真正理解类型嵌入的意义&#xff0c;有时可能会导致意想不到的行为。本文将主要分析如何嵌入类型&#xff0c;类型嵌入的作用以及可能出现的问题…

TypeScript 中,接口(interface)可以描述几种不同类型的属性和结构

在 TypeScript 中&#xff0c;接口&#xff08;interface&#xff09;可以描述几种不同类型的属性和结构。以下是你可以在接口中定义的一些常见属性和结构&#xff1a; 属性签名 - 描述对象属性的名称和类型。 interface Person {name: string;age: number; }方法签名 - 描述函…

Linux之定时任务02

一、什么是crond Linux 中 crond 就是定时任务&#xff0c;即根据 crond 指定的时间&#xff0c;由系统按指定的时间&#xff0c;周期性&#xff0c;自动触发的事件。 crond 服务在默认的情况下会每分钟检查系统中是否有定时任务&#xff0c;如果有且符合触发条件&#xff0c;…

sql中如何实现递归

在SQL中&#xff0c;递归通常是通过使用公用表表达式&#xff08;Common Table Expressions&#xff0c;CTE&#xff09;来实现的。CTE允许你定义一个临时的结果集&#xff0c;该结果集可以在一个SELECT、INSERT、UPDATE或DELETE语句的主体中被引用。 递归CTE有两个关键部分&a…