最近在回顾计算机网络的知识,以前上课没有认真学,只记得几个高大上的术语,所以趁着这次回顾,把学到的知识用博客的形式记录下来,一来加深自己的印象,二来希望让你对这些基础知识有一个更深入的了解。当然,我会尽量把 UDP 协议讲清楚,讲明白,让你“不虚此行”。


UDP( User Datagram Protocol )协议,翻译过来就是用户数据报协议 ,跟 TCP 协议一样,都是位于 OSI 模型的传输层。不过比起 TCP 协议,UDP 协议就显得简单多了,因为它没有「流量控制」、「拥塞控制」等复杂的处理机制。它甚至没有重传机制,也就是说,如果你的数据包半路走丢了,那就是真找不回来了,所以说 UDP 协议是不可靠的。当然了,这个重传机制是针对传输层而言的,你完全可以在应用层写一个协议来进行丢包处理,比如说像 TCP 一样,增加 ACK 和序列号机制。

那你可能会疑惑了,为什么放着可靠的 TCP 协议不用,而选择 UDP 协议?

UDP 报文段结构

这当然要根据应用的需求来,不过在说这个话题之前,我们先来详细了解一下 UDP 协议。

说实话,UDP 的报文段结构比 TCP 报文段简洁多了(见下图),毕竟 UDP 协议就没有什么多余的机制。

言归正传,报文段里的「源端口号」和「目的端口号」是为了告诉传输层,我这个报文是从哪儿(哪个进程)来的,要到哪儿(哪个进程)去。但要注意一点:一个 UDP 套接字是由一个二元组标识的,这个二元组指的是目的 IP 地址和目的端口号,也就是说,服务器上对应的进程,不在乎你是从哪个客户端来的,我都放进一个套接字处理,处理完了再根据源端口号和源 IP 地址,把应答信息发送给客户端。相较而言,TCP 套接字需要一个四元组来标识:源 IP 地址,源端口号,目的 IP 地址和目的端口号。这一点在讲 TCP 协议的时候还会细讲,所以这里就不赘述了。

PS:你可能会问,这报文段里怎么没有 IP 地址啊?这是因为IP 地址保存在网络层的 IP 协议段里,传输层的报文段里当然就没有了。

无连接

每次提到 TCP 协议,我们最先想到的就是三次握手和四次挥手,对 UDP 协议来说,这都是没有的事儿~ 使用 UDP 协议的时候,如果客户端要发送报文段给服务端,不用握手,直接就发出去了,也正因为这样,UDP 协议被称为是无连接的。

很容易想到,不需要握手这一过程的话,就没有因为建立连接而造成的时延,一个字,快!这也是 DNS(域名系统)运行在 UDP 协议之上的很大一部分原因。

但是 UDP 协议不可靠啊,传输过程中丢包了怎么办?最简单的做法就是——忽略它!(否则就得像文章开头说的那样,在应用层实现重传机制)就拿 DNS 来说吧,如果数据包丢失,客户端重发就是了(有超时机制),而且在正常情况下,丢包的概率很低。但如果使用 TCP 协议的话,因为要建立连接,域名查询就会慢很多,除此之外,使用 UDP 协议的网络开销更小——UDP 报文段有 8 个字节的首部开销,而 TCP 协议有 20 字节的开销(看前面的关于报文段的两张图)。 网络开销小,意味着 DNS 服务器能接受更多客户端的请求。

还有一个方面,TCP 协议有拥塞控制机制,它会在网络拥塞时遏制 TCP 发送方,以至于延迟报文段的传送,所以对于一些要求传输延迟小,且能够容忍一些数据丢失的实时程序来说,UDP 协议可能是一个更好的选择。路由选择协议(RIP)、 网络管理协议(SNMP) 也都选择了 UDP 来作为底层的传输协议。

最后,这是一张客户端与服务端利用 UDP 协议通信的流程图:

UDP 协议要讲的内容不多,下次要讲的 TCP 协议,就比较烧脑了,做好准备吧!

UDP 协议的那点事儿的更多相关文章

  1. 基于TCP与UDP协议的socket通信

    基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...

  2. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  3. 闲来无事,写个基于UDP协议的Socket通讯Demo

    项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...

  4. UDP协议开发

    UDP是用户数据报协议(User Datagram Protocol,UDP)的简称,其主要作用是将网络数据流量压缩成数据报形式,提供面向事务的简单信息传送服务.与TCP协议不同,UDP协议直接利用I ...

  5. 基于UDP协议模拟的一个TCP协议传输系统

    TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...

  6. TCP协议与UDP协议的区别

    TCP协议与UDP协议的区别(转) 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  7. 采用UDP协议的PIC32MZ ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 经过千辛万苦,今天终于 ...

  8. 采用UDP协议实现PIC18F97J60 ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...

  9. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

随机推荐

  1. 疯狂Java:突破程序员基本功的16课-李刚编著 学习笔记(未完待续)

    突破程序员基本功(16课) 数组 静态语言: 在编译的时候就能确定数据类型的语言,大多静态语言要求在使用变量之前必须声明数据类型(少数具有强推导能力的现代语言不用) 动态语言: 在程序运行时确定数据类 ...

  2. 手写一个简单的ElasticSearch SQL转换器(一)

    一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...

  3. Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube

    目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...

  4. Yii ActiveRecord用法记录备忘

    ActiveRecord 使用方法 Example1 in查询 $criteria = new CDbCriteria(); $criteria->select = $select; $crit ...

  5. SQlserver高效分页,还在使用row_number(),top之类的?

    row_number() ,还是top 这些分页的方法比较老了,效率不是很高效的, Sqlserve2012就有了,效率对比比较明显,尤其是数据比较大的情况下(我们可以观看查询执行计划) Offset ...

  6. 如何判断float值有效

    // 一个浮点数是否有效,首先要看其是否是一个数字(_isnan为0),其次还要看其是否超出了表示范围(_finite为0) // 注意_finite是有限的意思 #include <float ...

  7. 学习笔记之javascript编写简单计算器

      感觉自己的的实力真的是有待提高,在编写计算器的过程中,出现了各种各样的问题,暴露了自己的基础不扎实,逻辑思维能力不够,学得知识不能运用到自己的demo中区.先介绍一些这个这个计算器的整体思路.大致 ...

  8. C语言1博客作业04

    问题 答案 这个作业属于那个课程 C语言程序设计1 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9770 我在这 ...

  9. Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

    ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...

  10. Python 命令行之旅:深入 click 之参数篇

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...