当前位置:网站首页>UDP协议:因性善而简单,难免碰到“城会玩”
UDP协议:因性善而简单,难免碰到“城会玩”
2022-07-06 10:10:00 【富士康质检员张全蛋】
TCP 和 UDP 有哪些区别?
一般面试的时候我问这两个协议的区别,大部分人会回答,TCP 是面向连接的,UDP 是面向无连接的。
什么叫面向连接,什么叫无连接呢?在互通之前,面向连接的协议会先建立连接。例如,TCP 会三次握手,而 UDP 不会。为什么要建立连接呢?你 TCP 三次握手,我 UDP 也可以发三个包玩玩,有什么区别吗?
所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。
例如,TCP 提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。我们都知道 IP 包是没有任何可靠性保证的,一旦发出去,就像西天取经,走丢了、被妖怪吃了,都只能随它去。但是 TCP 号称能做到那个连接维护的程序做的事情,而 UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。
再如,TCP 是面向字节流的。发送的时候发的是一个流,没头没尾。IP 包可不是一个流,而是一个个的 IP 包。之所以变成了流,这也是 TCP 自己的状态维护做的事情。而 UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。
还有 TCP 是可以有拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。UDP 就不会,应用让我发,我就发,管它洪水滔天。
因而 TCP 其实是一个有状态服务,通俗地讲就是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。而 UDP 则是无状态服务。通俗地说是没脑子的,天真无邪的,发出去就发出去了。
UDP 包头是什么样的?
当我发送的 UDP 包到达目标机器后,发现 MAC 地址匹配,于是就取下来,将剩下的包传给处理 IP 层的代码。把 IP 头取下来,发现目标 IP 匹配,接下来呢?这里面的数据包是给谁呢?
发送的时候,我知道我发的是一个 UDP 的包,收到的那台机器咋知道的呢?所以在 IP 头里面有个 8 位协议,这里会存放,数据里面到底是 TCP 还是 UDP,当然这里是 UDP。于是,如果我们知道 UDP 头的格式,就能从数据里面,将它解析出来。解析出来以后呢?数据给谁处理呢?
处理完传输层的事情,内核的事情基本就干完了,里面的数据应该交给应用程序自己去处理,可是一台机器上跑着这么多的应用程序,应该给谁呢?
无论应用程序写的使用 TCP 传数据,还是 UDP 传数据,都要监听一个端口。正是这个端口,用来区分应用程序,要不说端口不能冲突呢。两个应用监听一个端口,到时候包给谁呀?所以,按理说,无论是 TCP 还是 UDP 包头里面应该有端口号,根据端口号,将数据交给相应的应用程序。
当我们看到 UDP 包头的时候,发现的确有端口号,有源端口号和目标端口号。因为是两端通信嘛,这很好理解。但是你还会发现,UDP 除了端口号,再没有其他的了。和TCP 头比起来,这个简直简单得一塌糊涂啊!
UDP 的三大特点
UDP 就像小孩子一样,有以下这些特点:
- 第一,沟通简单,不需要一肚子花花肠子(大量的数据结构、处理逻辑、包头字段)。前提是它相信网络世界是美好的,秉承性善论,相信网络通路默认就是很容易送达的,不容易被丢弃的。
- 第二,轻信他人。它不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。
- 第三,愣头青,做事不懂权变。不知道什么时候该坚持,什么时候该退让。它不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。
边栏推荐
- 第三季百度网盘AI大赛盛夏来袭,寻找热爱AI的你!
- 【.NET CORE】 请求长度过长报错解决方案
- Pytest learning ----- pytest confitest of interface automation test Py file details
- STM32 key state machine 2 - state simplification and long press function addition
- SAP UI5 框架的 manifest.json
- 高精度运算
- VR全景婚礼,帮助新人记录浪漫且美好的场景
- Jerry's watch reads the file through the file name [chapter]
- Scratch epidemic isolation and nucleic acid detection Analog Electronics Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
- Four processes of program operation
猜你喜欢
Spark accumulator and broadcast variables and beginners of sparksql
STM32 key state machine 2 - state simplification and long press function addition
2019阿里集群数据集使用总结
分布式不来点网关都说不过去
【.NET CORE】 请求长度过长报错解决方案
带你穿越古罗马,元宇宙巴士来啦 #Invisible Cities
基本磁盘与动态磁盘 RAID磁盘冗余阵列区分
node の SQLite
【Android】Kotlin代码编写规范化文档
Interview shock 62: what are the precautions for group by?
随机推荐
Wechat applet obtains mobile number
Optimization of middle alignment of loading style of device player in easycvr electronic map
Jerry's watch reads the file through the file name [chapter]
Introduction to the usage of model view delegate principal-agent mechanism in QT
HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅
C语言通过指针交换两个数
【Swoole系列2.1】先把Swoole跑起来
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用
How to solve the error "press any to exit" when deploying multiple easycvr on one server?
sql语句优化,order by desc速度优化
關於這次通信故障,我想多說幾句…
Spark accumulator and broadcast variables and beginners of sparksql
Video fusion cloud platform easycvr adds multi-level grouping, which can flexibly manage access devices
2019阿里集群数据集使用总结
RB157-ASEMI整流桥RB157
Jerry's watch deletes the existing dial file [chapter]
Jielizhi obtains the currently used dial information [chapter]
李书福为何要亲自挂帅造手机?
Interview shock 62: what are the precautions for group by?