摘要:由于本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。并且由于本身的不可靠性以及无序性,如果发送了这三个数据报过来,端接收到的可能是任意顺序任意个数三个数据报的排列组合。
前言
最头疼的问题莫过于到底该选TCP还是UDP作为传输层协议。通过快速对比分析 TCP 和 UDP 的区别,来帮助即时通讯初学者快速了解这些基础的知识点,从而在IM、消息推送等网络通信应用场景中能准确地选择合适的传输层协议。
建立连接方式的差异 TCP说到 TCP 建立连接,相信大多数人脑海里肯定可以浮现出一个词,没错就是--“三次握手”。TCP 通过“三次握手”来建立连接,再通过“四次挥手”断开一个连接。在每次挥手中 TCP 做了哪些操作呢?
流程如下图所示(TCP的三次握手和四次挥手):
上图就从客户端和服务端的角度,清楚的展示了 TCP 的三次握手和四次挥手。可以看到,当 TCP 试图建立连接时,三次握手指的是客户端主动触发了两次,服务端触发了一次。
我们可以先明确一下 TCP 建立连接并且初始化的目标是什么呢?
1初始化资源;
2告诉对方我的序列号。
所以三次握手的次序是这样子的:
client端首先发送一个SYN包告诉Server端我的初始序列号是X;
Server端收到SYN包后回复给client一个ACK确认包,告诉client说我收到了;
接着Server端也需要告诉client端自己的初始序列号,于是Server也发送一个SYN包告诉client我的初始序列号是Y;
Client收到后,回复Server一个ACK确认包说我知道了。
其中的 2 、3 步骤可以简化为一步,也就是说将 ACK 确认包和 SYN 序列化包一同发送给 Client 端。到此我们就比较简单的解释了 TCP 建立连接的“三次握手”。
UDP我们都知道 TCP 是面向连接的、可靠的、有序的传输层协议,而 UDP 是面向数据报的、不可靠的、无序的传输协议,所以 UDP 压根不会建立什么连接。
就好比发短信一样,UDP 只需要知道对方的 ip 地址,将数据报一份一份的发送过去就可以了,其他的作为发送方,都不需要关心。
数据发送方式的差异关于 TCP、UDP 之间数据发送的差异,可以体现二者最大的不同之处:
TCP:
由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。
UDP:
由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。
那么每次 UDP 发送的数据报大小由哪些因素共同决定呢?
UDP协议本身,UDP协议中有16位的UDP报文长度,那么UDP报文长度不能超过2^16=65536;
以太网(Ethernet)数据帧的长度,数据链路层的MTU(最大传输单元);
socket的UDP发送缓存区大小
先来看第一个因素,UDP 本身协议的报文长度为 2^16 - 1,UDP 包头占 8 个字节,IP 协议本身封装后包头占 20 个字节,所以最终长度为: 2^16 - 1 - 20 - 8 = 65507 字节。
只看第一个因素有点理想化了,因为 UDP 属于不可靠协议,我们应该尽量避免在传输过程中,数据包被分割。所以这里有一个非常重要的概念 MTU -- 也就是最大传输单元。
在 Internet 下 MTU 的值为 576 字节,所以在 internet 下使用 UDP 协议,每个数据报最大的字节数为: 576 - 20 - 8 = 548
数据有序性的差异 TCP对于 TCP 来说,本身 TCP 有着超时重传、错误重传、还有等等一系列复杂的算法保证了 TCP 的数据是有序的,假设你发送了数据 1、2、3,则只要发送端和接收端保持连接时,接收端收到的数据始终都是 1、2、3。
UDP而 UDP 协议则要奔放的多,无论 server 端无论缓冲池的大小有多大,接收 client 端发来的消息总是一个一个的接收。
并且由于 UDP 本身的不可靠性以及无序性,如果 client 发送了 1、2、3 这三个数据报过来,server 端接收到的可能是任意顺序、任意个数三个数据报的排列组合。
可靠性的差异其实大家都知道 TCP 本身是可靠的协议,而 UDP 是不可靠的协议。
TCPTCP 内部的很多算法机制让他保持连接的过程中是很可靠的。比如:TCP 的超时重传、错误重传、TCP 的流量控制、阻塞控制、慢热启动算法、拥塞避免算法、快速恢复算法 等等。
所以 TCP 是一个内部原理复杂,但是使用起来比较简单的这么一个协议。
UDPUDP 是一个面向非连接的协议,UDP 发送的每个数据报带有自己的 IP 地址和接收方的 IP 地址,它本身对这个数据报是否出错,是否到达不关心,只要发出去了就好了。
所以来研究下,什么情况会导致 UDP 丢包:
数据报分片重组丢失:在文章之前我们就说过,UDP 的每个数据报大小多少最合适,事实上 UDP 协议本身规定的大小是 64kb,但是在数据链路层有 MTU 的限制,大小大概在 5kb,所以当你发送一个很大的 UDP 包的时候,这个包会在 IP 层进行分片,然后重组。这个过程就有可能导致分片的包丢失。UDP 本身有 CRC 检测机制,会抛弃掉丢失的 UDP 包;
UDP 缓冲区填满:当 UDP 的缓冲区已经被填满的时候,接收方还没有处理这部分的 UDP 数据报,这个时候再过来的数据报就没有地方可以存了,自然就都被丢弃了。
使用场景总结在文章最后的一部分,聊聊 TCP、UDP 使用场景。
先来说 UDP 的吧,有很多人都会觉得 UDP 与 TCP 相比,在性能速度上是占优势的。
因为 UDP 并不用保持一个持续的连接,也不需要对收发包进行确认。
但事实上经过这么多年的发展 TCP 已经拥有足够多的算法和优化,在网络状态不错的情况下,TCP 的整体性能是优于 UDP 的。
那在什么时候我们非用 UDP 不可呢?
对实时性要求高:比如实时会议,实时视频这种情况下,如果使用 TCP,当网络不好发生重传时,画面肯定会有延时,甚至越堆越多。如果使用 UDP 的话,即使偶尔丢了几个包,但是也不会影响什么,这种情况下使用 UDP 比较好;
多点通信:TCP 需要保持一个长连接,那么在涉及多点通讯的时候,肯定需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,而 UDP 可以无需保持连接,直接发就可以了,所以成本会很低,而且穿透性好。这种情况下使用 UDP 也是没错的。
以上我们说了 UDP 的使用场景,在此之外的其他情况,使用 TCP 准没错。
毕竟有一句话嘛:
when in doubt,use TCP。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73088.html
摘要:无线网络基站基站控制器这方面,会给手机进行信号的分配,已完成手机连接和交互。给一个手机分配无线信道的信令又有好几个情况,比如基站跟手机,基站跟基站控制器核心网。相比之下,有线网络的状态管理如分配连接释放,都是分钟级,而状态转换则是毫秒级。 〇、引言 作为一个移动端的开发者,一直觉得各个方面有有所了解,结果前几天突然被问到这个问题,一时语塞,发现其实求知的道路还是非常漫长的。这两天针对这...
摘要:相对与上一个版本的计算机网路面试知识总结,这个版本增加了协议如何保证可靠传输包括超时重传停止等待协议滑动窗口流量控制拥塞控制等内容并且对一些已有内容做了补充。 相对与上一个版本的计算机网路面试知识总结,这个版本增加了 TCP协议如何保证可靠传输包括超时重传、停止等待协议、滑动窗口、流量控制、拥塞控制等内容并且对一些已有内容做了补充。 一 OSI与TCP/IP各层的结构与功能,都有哪些协...
摘要:在年初,直播答题呼啸而来,成为互联网行业的第一个风口。据艾媒数据显示,直播答题热度指数在月日达到峰值。尤其是直播答题类应用,一边撒着币,一边烧着带宽。秒,开始对此,马化腾的答案是,周鸿祎的答案是。目前看来,周鸿祎答对了。 在 2018 年初,直播答题呼啸而来,成为互联网行业的第一个风口。这种在直播平台上快速答题,平分巨额奖金的活动,让很多人感受到了用知识赚钱的乐趣。仅半月不到,映客直播...
摘要:网络协议五步登天路,我们一路迈过了物理层链路层,今天终于到了传输层。没有花花肠子大量的数据结构处理逻辑包头字段,秉承性善论,相信网络通路很容易到达,不容易被丢弃轻信他人。我们之前认识的就是基于协议的。 网络协议五步登天路,我们一路迈过了物理层、链路层,今天终于到了传输层。从这一层开始,很多知识应该都是服务端开发必备的知识了,今天我们就一起来梳理下。 其实,讲到 UDP,...
阅读 1412·2021-11-24 09:38
阅读 2663·2021-11-19 11:33
阅读 1578·2021-11-12 10:36
阅读 1422·2021-11-12 10:36
阅读 3329·2021-11-02 14:46
阅读 2414·2021-09-30 09:47
阅读 3549·2019-08-30 15:56
阅读 3225·2019-08-30 15:55