当前位置:网站首页>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的你!
- Interview shock 62: what are the precautions for group by?
- SAP UI5 框架的 manifest.json
- 在一台服务器上部署多个EasyCVR出现报错“Press any to exit”,如何解决?
- [introduction to MySQL] the first sentence · first time in the "database" Mainland
- Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
- Optimization of middle alignment of loading style of device player in easycvr electronic map
- JMeter interface test response data garbled
- Summary of Android interview questions of Dachang in 2022 (I) (including answers)
- 模板于泛型编程之declval
猜你喜欢

Pytorch extract middle layer features?

C语言通过指针交换两个数

scratch疫情隔离和核酸检测模拟 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月

2022年大厂Android面试题汇总(二)(含答案)

EasyCVR平台通过接口编辑通道出现报错“ID不能为空”,是什么原因?

F200——搭载基于模型设计的国产开源飞控系统无人机

队列的实现

Pytest learning ----- detailed explanation of the request for interface automation test

2019阿里集群数据集使用总结

历史上的今天:Google 之母出生;同一天诞生的两位图灵奖先驱
随机推荐
Shell input a string of numbers to determine whether it is a mobile phone number
Pytest learning ----- pytest operation mode and pre post packaging of interface automation testing
30 分钟看懂 PCA 主成分分析
最新财报发布+天猫618双榜第一,耐克蓄力领跑下个50年
scratch疫情隔离和核酸检测模拟 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月
adb常用命令
李书福为何要亲自挂帅造手机?
Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
The easycvr authorization expiration page cannot be logged in. How to solve it?
Flet教程之 13 ListView最常用的滚动控件 基础入门(教程含源码)
容器里用systemctl运行服务报错:Failed to get D-Bus connection: Operation not permitted(解决方法)
8位MCU跑RTOS有没有意义?
關於這次通信故障,我想多說幾句…
MSF横向之MSF端口转发+路由表+SOCKS5+proxychains
Establishment of graphical monitoring grafana
Interview assault 63: how to remove duplication in MySQL?
[introduction to MySQL] the first sentence · first time in the "database" Mainland
The easycvr platform reports an error "ID cannot be empty" through the interface editing channel. What is the reason?
在一台服务器上部署多个EasyCVR出现报错“Press any to exit”,如何解决?
Running the service with systemctl in the container reports an error: failed to get D-Bus connection: operation not permitted (solution)