最近在回顾计算机网络的知识,以前上课没有认真学,只记得几个高大上的术语,所以趁着这次回顾,把学到的知识用博客的形式记录下来,一来加深自己的印象,二来希望让你对这些基础知识有一个更深入的了解。当然,我会尽量把 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. Kafka集群的安装和部署

    一.Kafka的下载与解压 http://kafka.apache.org/downloads.html下载kafka_2.11-1.1.1.tgz.gz并解压到/home/jun下 [jun@mas ...

  2. deepin15.5 安装tensorflow-gpu

    deepin的CUDA和cuDNN安装方法与其它系统有所不同,参考其它操作系统的方法也许不适用,特别是显卡驱动的安装,容易使系统出现问题 本次配置: 操作系统:deepin15.5桌面版 电脑品牌:联 ...

  3. 好看的原生UI

    我前端可以说是0基础,作显示页面的时候自己设置各种CSS一是麻烦,二是难看,所以找UI组件, 比较流行的组件如ELEMENT之类都需要安装或者依赖其他框架如VUE,为了省事,决定使用原生UI组件, 本 ...

  4. 运用wxs制作微信小程序左滑功能和跳转,性能更优越

    锲子 微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在js中实现,但在拖动方面,性能并不是那么的流畅.如今,官方新扩展了一套脚本语言wxs,在IOS设备上运行,性能会比JS快2~20 ...

  5. Vim 自定义补全利器 Snippet

    Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE. Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-S ...

  6. 「2019.8.9 考试」神仙的dp总让人无所适从

    T1是个容斥,我掐手指一算他为了卡容斥的正确性,绝不会把n和m出的很相近($O(n^2)$算法在nm相等的时候达到最高时间复杂度),不然就太好做了,于是开了特判+各种卡常和滚动数组优化,卡到了70分, ...

  7. CSPS模拟 68

    令人kuku的一场考试, T1 令人kuku的贪心,反工了好几次,耗费了1h之久. T2 令人kuku的数据结构,到死也没调出来,还是细节问题,要积累. T3 令人kuku的二分答案. 先二分第一个答 ...

  8. js+css3实现多行图片点击(自动)左右无缝轮播特效

    /*效果图*/ HTML:    <div class="scroll">       <div class="picbox">     ...

  9. ASCALL码对照表

    ASCALL码对照表 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Inter ...

  10. 运维自动化管理服务器 CheungSSH

    CheungSSH 是一款中国人自主研发的Linux运维自动化管理服务器软件,后端使用 Python 语言+Django 的 Web 框架,前端使用 Bootstrap+Javascript+jQue ...