当前位置:网站首页>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 就像小孩子一样,有以下这些特点:
- 第一,沟通简单,不需要一肚子花花肠子(大量的数据结构、处理逻辑、包头字段)。前提是它相信网络世界是美好的,秉承性善论,相信网络通路默认就是很容易送达的,不容易被丢弃的。
- 第二,轻信他人。它不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。
- 第三,愣头青,做事不懂权变。不知道什么时候该坚持,什么时候该退让。它不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。
边栏推荐
- What is the reason why the video cannot be played normally after the easycvr access device turns on the audio?
- Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
- 虚拟机VirtualBox和Vagrant安装
- scratch疫情隔离和核酸检测模拟 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月
- Getting started with pytest ----- test case pre post, firmware
- 第三季百度网盘AI大赛盛夏来袭,寻找热爱AI的你!
- 面向程序员的精品开源字体
- 递归的方式
- 1700C - Helping the Nature
- 10 advanced concepts that must be understood in learning SQL
猜你喜欢
EasyCVR平台通过接口编辑通道出现报错“ID不能为空”,是什么原因?
The solution that flutterweb browser cannot be rolled back after refreshing
在一台服务器上部署多个EasyCVR出现报错“Press any to exit”,如何解决?
STM32 key state machine 2 - state simplification and long press function addition
Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
Pytest learning ----- detailed explanation of the request for interface automation test
面向程序员的精品开源字体
Getting started with pytest ----- allow generate report
递归的方式
Getting started with pytest ----- test case pre post, firmware
随机推荐
scratch疫情隔离和核酸检测模拟 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月
FMT开源自驾仪 | FMT中间件:一种高实时的分布式日志模块Mlog
递归的方式
【Android】Kotlin代码编写规范化文档
[introduction to MySQL] the first sentence · first time in the "database" Mainland
IP, subnet mask, gateway, default gateway
趣-关于undefined的问题
面试突击62:group by 有哪些注意事项?
基本磁盘与动态磁盘 RAID磁盘冗余阵列区分
HMS core machine learning service creates a new "sound" state of simultaneous interpreting translation, and AI makes international exchanges smoother
Heavy! Ant open source trusted privacy computing framework "argot", flexible assembly of mainstream technologies, developer friendly layered design
The difference between parallelism and concurrency
[Android] kotlin code writing standardization document
Mysqlimport imports data files into the database
高精度运算
Take you through ancient Rome, the meta universe bus is coming # Invisible Cities
Pytest learning ----- pytest confitest of interface automation test Py file details
虚拟机VirtualBox和Vagrant安装
78 year old professor Huake has been chasing dreams for 40 years, and the domestic database reaches dreams to sprint for IPO
Four processes of program operation