iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >udp编程的示例分析
  • 707
分享到

udp编程的示例分析

2023-06-27 16:06:06 707人浏览 八月长安
摘要

小编给大家分享一下udp编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是UDP?UDP是User Datagram Protocol(用户数据报

小编给大家分享一下udp编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

什么是UDP?

UDP是User Datagram Protocol(用户数据报协议)的缩写,它是一个简单的协议,简单到UDP规范RFC0768只有区区3页。

UDP是工作在IP层之上的传输层协议,UDP对IP主要有两个扩展:

扩展出端口号使得IP数据报可以多路分发到用户进程。扩展出校验和提供网络传输过程中数据差错的检验。IP提供了一种尽力而为、无连接的数据报交付服务。IP基于IP地址实现路由和分组转发,可以将一个IP数据报从网络的一台主机传送到另一台主机,IP地址决定IP数据报将被送往哪个主机。所以,IP提供主机到主机的数据报传输服务。

IP数据报到达目的主机后,内核层实现的IP模块,会负责接收网卡上的IP数据报,但主机上通常会同时运行多个进程,IP数据报应该交给哪个进程去处理呢?IP搞不定。

端口号(位于UDP首部)决定数据报交给主机上的哪个进程处理。所以,UDP为端主机上运行的应用程序提供了端到端服务。

UDP的特征

UDP是无连接的,通信之前无须建连便可直接发送数据报,而tcp是面向连接的。UDP不提供差错纠正,但UDP提供差错检测(端到端校验和)。UDP不做重复消除。UDP不做流量控制。UDP不做拥塞控制,没有协议机制防止高速UDP流量对其他网络用户的消极影响。UDP不保证顺序,数据报递交应用的顺序。UDP不可靠,UDP只负责把应用程序传给IP层的数据发送出去,并不能保证数据报到达目的地,可靠传递需要应用程序去实现。UDP支持组播交付。UDP是一种保留消息边界的传输层协议。

消息边界

应用程序每请求一次UDP输出将产生一个UDP数据报,从而发送一个IP数据报,而接收端每请求一次UDP接收都将接收一个完整的UDP报(如果有),这跟面向数据流的TCP不一样。

假设主机A给主机B发送2次数据,第一次4字节“abcd”,第二次3字节“xyz”,而主机B接收2次,分别返回“abcd”、“xyz”两个消息,也可以返回“xyz”,“abcd”两个消息(顺序不重要),那么这就是保留消息边界。

UDP是保留消息边界的传输层协议,利用UDP通信的应用程序每次发送操作会产生一个IP数据报(不考虑分片),这就约束每次发送的数据量不能大于MTU(最大传输单元),接收端每次接收都会返回一个个UDP数据报的完整负载,不会出现返回半个数据报负载的情况。

而TCP是不保留消息边界的流协议,发送端调用发送的次数和每次发送的数据量,跟接收端调用接收的次数和每次接收的数据量,没有任何对应关系,所以使用TCP的应用程序需要去处理消息边界。

UDP数据报封装格式

IPv4协议(Protocol)字段用值17来标识UDP,UDP数据报头部通常是8字节,IPv4头部之后紧接着是UDP头部,然后是UDP数据Payload(如有)。udp编程的示例分析IPv4封装包对应的UDP头部由源端口号、目的端口号、长度、校验和组成,每个字段都是2字节。1、端口号,纯抽象的标识,它不跟任何物理实体相关端口号用于帮助协议分辨发送和接收进程。接收端的内核层从网卡接收到IP数据报之后,识别出UDP数据报(IP数据报头部协议字段值=17)之后,会根据UDP头部的目的端口号,映射到对应进程,把UDP数据报交给对应的进程去处理,这个映射关系由系统内核管理维护。udp编程的示例分析目的端口号是必须的,但源端口号是可选的,如果数据报发送者不需要对方回复的话,则源端口号可被设置为0。

因为IP层根据IP头部的协议类型字段,将进入的IP数据报,分发到特定的传输协议(TCP或UDP等),到了传输协议层,再根据端口号将协议数据分发到不同进程。所以,端口号是协议独立的,不同协议的相同端口号并不会引起分发混乱。

比如,一台机器上的两个网络服务进程使用相同的IP地址和端口号,但一个使用TCP协议,另一个使用UDP协议,这样是没有问题。

长度字段,是以字节为单位的UDP头部和UDP数据的总长度,因为UDP头部长度为8,且空数据的UDP数据报是允许的,这意味着该长度字段值最小为8。UDP长度值是冗余的,因为可以通过IP数据报的总长度减去IP首部的长度推导出来。

校验和,覆盖了UDP首部、UDP数据和一个伪首部,由初始发送方计算,由最终目的方校验,用于判断数据报在网络传输过程中是否出错,比如某一位从1变成了0。

使用UDP的应用程序如何实现可靠传输

众所周知,UDP不可靠、不保证顺序。

什么叫不可靠?A给B发送一个UDP数据报,该UDP数据报不一定被正确交付给接收端B,但因为网络质量等各种原因,可能丢包,IP数据报是尽力而为的交付,一切随缘。

有没有办法保证,发送的UDP一定到达目的端?Sorry,保证不了,做不到。

那TCP提供的可靠传输是什么意思?TCP提供的可靠传输并不是指不丢包,因为TCP也依赖IP(IP不可靠)实现数据报交付,TCP的可靠性是指丢掉的包会被重传,直到被正确投递,才会继续传输下一个数据报。

那TCP是怎么做到可靠传输的呢?很简单,收报确认(ack)+丢包重传。所以UDP如果要提供可靠传输,也可以参考TCP的实现机制,只是TCP是实现在内核层,而基于UDP的应用程序,可以把可靠传输做到应用层。要做收报确认+丢包重传,需要一些额外的信息,比如包序列号之类,可以放到Payload,约定好这些额外信息在Payload中的结构布局即可。

什么叫不保证顺序?A给B发送两个UDP数据报,两个UDP数据报会被封装为两个IP数据报,通过IP协议传输,因为两个IP数据报独立路由,所以哪个先到?不一定,看心情。

有没有办法保证,UDP数据报按照发送端发送的时间顺序到达目的端?也Sorry,办不到。

所以,TCP提供的顺序性,其实只是在接收端对IP数据报根据发送顺序重新排序,很显然,UDP要支持重排序,也需要一些额外信息,也只能通过payload携带,而不能像TCP一样(TCP首部的一些字段用于接收端重排序)。

综上,UDP只提供最简单端主机上应用程序的端到端服务,其他的特性,如果要提供,那请参考TCP的思路去实现吧。

这是有好处的:因为简单,所以开销很小。而某些应用场景,可以容忍丢包、乱序,UDP就是很适合的。保时捷是很好,但拉砖还是用拖拉机吧。

UDP Socket网络编程api不多,socket()用于创建套接字,close()用于关闭套接字,sendto()用于发送数据,recvfrom()用于接收数据。

bind()顾名思义是绑定,TCP可以绑定,UDP也可以,bind用于UDP等于告诉内核:这个套接字跟网络远端的一个

而没有bind之前,只能通过sendto()接口(通过参数指定目的地)。UDP套接字recv()返回的是UDP数据报的数据部分(Payload),不包括UDP数据报首部,这是因为UDP首部的字段用于分发或者校验,不需要透传给应用程序。

使用UDP套接字开发的网络应用Server/Client,网络io相关操作和流程如下图所示:

udp编程的示例分析

以上是“udp编程的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: udp编程的示例分析

本文链接: https://www.lsjlt.com/news/311881.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • udp编程的示例分析
    小编给大家分享一下udp编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是UDPUDP是User Datagram Protocol(用户数据报协...
    99+
    2023-06-27
  • UDP服务器客户端编程流程的示例分析
    这篇文章给大家分享的是有关UDP服务器客户端编程流程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。UDP编程流程UDP提供的是无连接、不可靠的、数据报服务UDP是尽最大能力进行传输,但是并不能保证可靠性...
    99+
    2023-06-21
  • java线程编程的示例分析
    这篇文章给大家分享的是有关java线程编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。线程基础◆线程(thread)其实是控制线程(thread of control)的缩写.每一个线程都是独立的,因...
    99+
    2023-06-03
  • VB.NET Socket编程的示例分析
    小编给大家分享一下VB.NET Socket编程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!下面通过例子来学习VB.NET Socket编程类的应用,下面的程序分别分服务器和客户端两部分:ImportsSyst...
    99+
    2023-06-17
  • java多线程编程的示例分析
    这篇文章将为大家详细讲解有关java多线程编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.相关知识:Java多线程程序设计到的知识:(一)对同一个数量进行操作(二)对同一个对象进行操作(三...
    99+
    2023-05-30
    java
  • PHP中SOCKET编程的示例分析
    这篇文章主要介绍了PHP中SOCKET编程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 预备知识一直以来很少看到有多少人使用php的socket模块来做一些事...
    99+
    2023-06-15
  • Go并发编程的示例分析
    这篇文章给大家分享的是有关Go并发编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、goroutine定义给函数前加上go即可不需要在定义是区分是否是异步函数调度器在合适的点进行切换,这个点是有很多...
    99+
    2023-06-20
  • C++模板编程的示例分析
    这篇文章主要为大家展示了“C++模板编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++模板编程的示例分析”这篇文章吧。模板初阶泛型编程在计算机程序设计领域,为了避免因数据类型的不...
    99+
    2023-06-25
  • js异步编程的示例分析
    这篇文章主要为大家展示了“js异步编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js异步编程的示例分析”这篇文章吧。异步回调是js的一大特性,理解...
    99+
    2024-04-02
  • WMI_Vbs脚本编程的示例分析
    这篇文章主要介绍WMI_Vbs脚本编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!WMI就是Microsoft Windows Management Instrumentation 。中文名字叫Windo...
    99+
    2023-06-08
  • Shell脚本编程的示例分析
    这篇文章给大家分享的是有关Shell脚本编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Shell脚本Shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电...
    99+
    2023-06-09
  • Java函数编程的示例分析
    小编给大家分享一下Java函数编程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、函数编程Lambda我们可以将lambda表达式视为一个匿名函数,可以将其分配给变量并传递给方法,该方法接受函数接口作为参数。L...
    99+
    2023-06-25
  • Java网络编程的示例分析
    小编给大家分享一下Java网络编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、网络编程1.1、概述计算机网络是通过传输介质、通信设施和网络通信协议...
    99+
    2023-06-15
  • C#异步编程的示例分析
    小编给大家分享一下C#异步编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步编程在处理并发方面被使用的越来越多,之所以说上面一句话,是为了区分多线程...
    99+
    2023-06-17
  • ZooKeeper Java API编程的示例分析
    这篇文章主要为大家展示了“ZooKeeper Java API编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ZooKeeper Java API编程的示例分析”这篇文章吧。开发应用...
    99+
    2023-05-30
    zookeeper java
  • CSS中的层分离编程示例分析
    本篇文章为大家展示了CSS中的层分离编程示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。随着CSS的发展,使用CSS有语义化的命名约定和CSS层的分离,将有助...
    99+
    2024-04-02
  • Linux程序编译过程的示例分析
    小编给大家分享一下Linux程序编译过程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执...
    99+
    2023-06-15
  • JavaScript中异步编程的示例分析
    这篇文章给大家分享的是有关JavaScript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n...
    99+
    2023-06-15
  • Go1.18中泛型编程的示例分析
    小编给大家分享一下Go1.18中泛型编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型...
    99+
    2023-06-22
  • Promise中异步编程的示例分析
    这篇文章主要介绍Promise中异步编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下所示://1.解决异步回调问题 //1.1 如何同步异步请求 //如...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作