什么是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(如有)。

IPv4封装包对应的UDP头部由源端口号、目的端口号、长度、校验和组成,每个字段都是2字节。

1、端口号,纯抽象的标识,它不跟任何物理实体相关

端口号用于帮助协议分辨发送和接收进程。接收端的内核层从网卡接收到IP数据报之后,识别出UDP数据报(IP数据报头部协议字段值=17)之后,会根据UDP头部的目的端口号,映射到对应进程,把UDP数据报交给对应的进程去处理,这个映射关系由系统内核管理维护。

目的端口号是必须的,但源端口号是可选的,如果数据报发送者不需要对方回复的话,则源端口号可被设置为0。

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

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

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

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

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

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

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

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

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

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

2、什么叫不保证顺序?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编程相关推荐

  1. 分析udp数据报_开发需知!!!TCP和UDP的特点和区别

    对于学过计算机网络的人来说,不得不提到TCP和UDP相关的概念以及知识.本节,我们简单介绍下TCP和UDP的特点. 传输控制协议TCP(Transmission Control Protocol) T ...

  2. python udp 直播_[Python] socket发送UDP广播实现聊天室功能

    原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...

  3. java udp 缓冲区_为什么特定的UDP消息总是低于特定的缓冲区大小?

    3个不同的消息以不同的速率发送到同一个端口: 消息大小(字节)每个传输速度发送 High23210 ms100Hz Medium14820ms50Hz 低2060 ms16.6Hz 我每 ~ 6 ms ...

  4. java udp 协议_网络协议 - UDP 协议详解

    ¶ 网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛,所以也有必要对UDP协议进行详解.@pdai ¶ UDP概述 UDP(User Datagram Protocol)即用户数据报协 ...

  5. 分析udp数据报_Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  6. 基于zynq的千兆网udp项目_基于FPGA的千兆网UDP通信分析

    千兆网UDP通信 以太网帧格式 图8‑12 以太网帧格式 表8‑5 以太网帧格式说明 UDP协议分析 为什么UDP协议在FPGA实现时很受欢迎,最主要一个原因就是简单,简答到什么地步呢?UDP协议只是 ...

  7. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  8. python udp数据报

    每个语言都有自己的udp数据报传输和接收方式,但是python的代码很短,类似如下 # sender.pyfrom socket import * # import the module for so ...

  9. 网络基础3(IP段格式,UDP数据报格式,TCP数据报格式)

    IP段格式 IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍. 对于IPv4,4位版本字段是4.4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节 ...

最新文章

  1. 计算机考研择校分析,上海地区计算机考研择校分析
  2. Bech32编码 (2)原理
  3. numpy基础——对数组切片操作
  4. 主机动手系列 — 怎么管理Suse Linux
  5. 51nod百度之星2016练习赛
  6. CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》
  7. Unity3D-光照系统
  8. c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库
  9. MX记录有什么用?为什么今天的电子邮件系统是这样的?
  10. 安卓下使用TTS语音包:小爱
  11. day17-25序列化、python操作CSV/EXCEL/PDF/WORD/PPT文件、爬虫、正则表达式
  12. python计算2019年新个税
  13. php语音机器人,php运营版语音机器人接单源代码带完美教程
  14. Pthon画皮卡丘源码
  15. 华为OD机试真题2023(JAVA)
  16. HERCULE:通过在相关日志图上进行社区发现来重建攻击故事
  17. echarts之静态与动态地图
  18. 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
  19. 友华光猫设置虚拟服务器,中兴光猫sendcmd常用命令
  20. Java个人日记_个人的JAVA学习小日记

热门文章

  1. php 获取当前页面url_PHP获取URL –如何获取当前页面的完整URL
  2. git 原理详解及实用指南_如何编写良好的提交消息:实用的Git指南
  3. lynda ux_UX编排原理
  4. vim 删除多行_Vim神器的五个高效插件,新老司机别错过!
  5. android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享
  6. Django表单form
  7. C++ 使用A*算法解决八数码问题
  8. Python爬虫番外篇之Cookie和Session
  9. Flask的状态保持和上下文管理
  10. Spark SQL 简介