写在开篇:
话说上次郭靖用了镖局押镖(TCP),信是送到了,蓉儿也回了,但来回一趟半个月,郭靖等到头发都白了几根。
黄蓉在回信里写:"靖哥哥,你这效率,等你信到了,我孩子都生一窝了。------哦不对,我还没嫁给你呢。"
郭靖脸红了大半天。
为了快点倾诉对蓉儿的相思之苦,这次他准备试试飞鸽传书(UDP)。
鸽子腿上绑上信,放飞。三天就能到。快是快,但万一鸽子被鹰叼了、被雨淋了、迷路了------信就丢了,没人管。
郭靖咬了咬牙:赌一把!
一、UDP是啥?------飞鸽传书
总镖头这次没出面,换了个养鸽子的老头。
老头说:"郭大侠,您要是急,就用我的鸽子。鸽子飞出去就不管了,不签收、不确认、丢了不补。快,但不可靠。"
郭靖问:"那蓉儿收没收到,我怎么知道?"
老头摊摊手:"不知道。您只能再发一封问问。"
郭靖嘀咕:"那蓉儿要是没收到,还以为我不想她了......"
老头翻个白眼:"那您就用镖局啊,慢点但保险。"
郭靖想了想:"慢?我等不了!发!"
这就是UDP------User Datagram Protocol,用户数据报协议。
-
没有握手:不打招呼,直接发
-
不确认:发了不管,丢了不补
-
不重传:丢了就丢了,没人帮你重发
二、UDP头长什么样?(极简,8字节)
老头掏出一张便条:"您看,这就是鸽子的'便条'------UDP头。8个字节,一行排开。"
| 源端口 | 目标端口 | 长度 | 校验和 |
|---|---|---|---|
| 16位 | 16位 | 16位 | 16位 |
"比镖局的押镖单(TCP头20字节)短多了。鸽子腿细,驮不了太重的东西。"
TCP头20字节,UDP头8字节------省了12字节。这对摄像头图像这种大流量来说,省出来的带宽可观。
郭靖问:"就这么点?镖局那单子可是一大串。"
老头说:"简单才快。您要那么多花里胡哨的干啥?"
三、UDP的四个特点(飞鸽传书的规矩)
| 特点 | 含义 | 郭靖版理解 |
|---|---|---|
| 无连接 | 不握手,直接发 | 鸽子直接飞,不打招呼 |
| 不可靠 | 不确认,不重传 | 丢了不管,不知道 |
| 无顺序 | 先发的可能后到 | 鸽子飞得快慢不一,信可能乱序 |
| 轻量 | 头小,开销低 | 鸽子驮得轻,飞得快 |
郭靖问:"那乱序了怎么办?"
老头说:"不管。您自己看着办。"
郭靖急了:"那蓉儿收到'想你'和'靖哥哥'前后颠倒,还以为我脑子坏掉了!"
老头:"那您就只能赌鸽子飞得够快了。"
这就是UDP------快,但什么活都不干。重传、排序、可靠性,全交给上层(应用层)自己处理。
四、UDP和TCP的对比(一张表说清楚)
| 对比项 | TCP(镖局押镖) | UDP(飞鸽传书) |
|---|---|---|
| 连接 | 三次握手,先确认再发 | 无连接,直接发 |
| 可靠性 | 确认、重传、保证送到 | 不确认、不重传、丢了不管 |
| 顺序 | 保证不乱 | 可能乱序 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 头大小 | 20字节 | 8字节 |
| 速度 | 慢 | 快 |
| 车上场景 | 诊断升级、OTA | 摄像头图像、实时路况 |
五、车上哪里用UDP?(飞鸽传书的用武之地)
1. 摄像头图像传输
摄像头一帧图像数据量大,对实时性要求高,但对丢包不敏感------偶尔丢一帧,画面可能卡一下,忍了。
如果用TCP,丢了要重传,反而会卡更久。
所以摄像头用UDP,不确认、不重传,快就完了。
郭靖问:"那摄像头丢了帧,蓉儿不会骂我吗?"
老头说:"她骂的是图像卡一下,不是骂你。你用TCP,卡得更厉害。"
2. 导航实时路况
路况信息过时了就没用。丢了几条数据没关系,下一帧马上就来。
3. SOME/IP(服务发现)
车上有些服务发现协议也用UDP,因为快。
什么时候不用UDP?
-
4S店升级ECU:丢一个比特车可能变砖,必须用TCP
-
OTA升级:必须完整、可靠,用TCP
郭靖感叹:"原来不是啥都能用鸽子送。机密军情还得镖局。"
六、UDP的"校验和"是干啥的?(检查鸽子腿上的信有没有被雨淋花)
UDP头里也有一个校验和,但它比TCP的简单。
作用:检查UDP头和数据有没有在传输过程中损坏。
怎么算的 :和IP头校验和类似,但UDP校验和会把IP头里的源IP、目标IP也一起算进去(这叫"伪首部"),防止数据被送到错误的应用程序。
车上例子:摄像头发UDP包,校验和算出来是0x8A3F。域控制器收到后重新算,对不上就丢包,不处理。
郭靖问:"那校验和不通过怎么办?"
老头说:"丢。不丢的话,蓉儿可能收到一堆乱码,还以为你会写外星文。"
七、为什么摄像头不用TCP?(镖局太慢)
郭靖问:"为什么摄像头不用镖局押镖(TCP)?可靠不是更好吗?"
老头说:"您想啊,摄像头一秒钟传30帧图像。用TCP的话,每帧都要签收确认,丢了还要重传------万一重传卡住,后面的帧都得等。"
"屏幕上就会卡一下、卡一下。开车的时候,图像卡了,您敢信吗?"
"UDP不一样。丢了就丢了,下一帧马上来。偶尔卡一下,总比一直卡强。"
郭靖想了想:"所以镖局适合送军情(诊断升级),鸽子适合送情书(摄像头图像)?"
老头点头:"您终于开窍了。"
一句话:UDP快,适合对延迟敏感、对丢包不敏感的业务。TCP可靠,适合不容有失的业务。
八、这些坑,靖哥哥替你先踩了
-
坑1 :以为"UDP比TCP快是因为它不用握手"。后来才搞明白,UDP没有重传、没有确认、没有顺序保证、没有流量控制、没有拥塞控制------把TCP所有保证可靠性、有序性的机制全砍了,所以快。
-
坑2 :以为"UDP校验和可有可无"。后来才搞明白,IPv6下UDP校验和是必选,不能填0。即使是IPv4,不校验也可能导致数据损坏不被发现。
-
坑3 :以为"UDP不适合车载"。后来才搞明白,摄像头图像、实时导航这些对丢包不敏感的场景,UDP反而是最优解。
-
坑4 :以为"UDP和TCP是二选一"。后来才搞明白,很多应用会同时用:控制信令走TCP(可靠),大数据传输走UDP(快)。
想通的那一刻:原来UDP不是"不靠谱",是"把靠谱的责任交给了上层"。卸磨不杀驴,但驴不干活了。
九、下步目标
UDP搞清楚了。下期搞SOME/IP------东邪级别的狠角色,车载服务通信的"黄药师"。
下期预告:SOME/IP------车载服务的"东邪",自成一派,专搞服务发现和远程调用。
十、写在最后
这一篇最大的收获:UDP是飞鸽传书------快,但不可靠。适合摄像头图像、实时路况。
后来,郭靖的鸽子飞到了桃花岛。蓉儿收到信,回了一句:"靖哥哥,鸽子挺快,就是字被雨淋花了几个。下次能不能用镖局?"
郭靖回:"蓉儿,你不能既要快又要可靠啊。"
蓉儿:"那就两样都用!重要的用镖局,不重要的用鸽子。"
郭靖一拍大腿:"这不就是TCP和UDP一起用吗?控制信令走TCP,数据走UDP!"
蓉儿,我看以后谁再敢说我笨。
慢即是快,快即是慢。
打完收工,886。
