TCP与UDP差异对比分析

作者: MeloDev | 来源:发表于2017-09-15 15:55 被阅读808次

TCP与UDP差异对比分析

本文原创,转载请注明出处。
欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文。

写在前面:

公司在做智能硬件方向,所以使用了 TCP、UDP 协议来做通信。过几天我会整理一下两种协议在 Android 上的使用,不过在此之前,还是想先了解一下这两种协议有哪些异同,又有哪些值得注意的地方。本文通过对比分析 TCP 和 UDP 有哪些区别,来帮助这些比较基础的知识点,遇到相应的问题,便可以快速地解决。

建立连接方式

TCP:
说到 TCP 建立连接,相信大多数人脑海里肯定可以浮现出一个词,没错就是--“三次握手”。TCP 通过“三次握手”来建立连接,再通过“四次挥手”断开一个连接。在每次挥手中 TCP 做了哪些操作呢?继续往下看:

TCP的三次握手和四次挥手

上图就从客户端和服务端的角度,清楚的展示了 TCP 的三次握手和四次挥手。

可以看到,当 TCP 试图建立连接时,三次握手指的是客户端主动触发了两次,服务端触发了一次。

我们可以先明确一下 TCP 建立连接并且初始化的目标是什么呢?1. 初始化资源 2. 告诉对方我的序列号。
所以三次握手的次序是这样子的:

1)client端首先发送一个SYN包告诉Server端我的初始序列号是X。

2)Server端收到SYN包后回复给client一个ACK确认包,告诉client说我收到了。

3)接着Server端也需要告诉client端自己的初始序列号,于是Server也发送一个SYN包告诉client我的初始序列号是Y。

4)Client收到后,回复Server一个ACK确认包说我知道了。

其中的 2 、3 步骤可以简化为一步,也就是说将 ACK 确认包和 SYN 序列化包一同发送给 Client 端。到此我们就比较简单的解释了 TCP 建立连接的“三次握手”。

UDP:
我们都知道 TCP 是面向连接的、可靠的、有序的传输层协议,而 UDP 是面向数据报的、不可靠的、无序的传输协议,所以 UDP 压根不会建立什么连接。

就好比发短信一样,UDP 只需要知道对方的 ip 地址,将数据报一份一份的发送过去就可以了,其他的作为发送方,都不需要关心。

数据发送

关于 TCP、UDP 之间数据发送的差异,可以体现二者最大的不同之处:

TCP:
由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。

UDP:
由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小,这个每次 UDP 发送的数据报大小由哪些因素共同决定呢?

  1. UDP协议本身,UDP协议中有16位的UDP报文长度,那么UDP报文长度不能超过2^16=65536。

  2. 以太网(Ethernet)数据帧的长度,数据链路层的MTU(最大传输单元)。

  3. 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 是不可靠的协议。

TCP:

TCP 内部的很多算法机制让他保持连接的过程中是很可靠的。比如:TCP 的超时重传、错误重传、TCP 的流量控制、阻塞控制、慢热启动算法、拥塞避免算法、快速恢复算法 等等。

所以 TCP 是一个内部原理复杂,但是使用起来比较简单的这么一个协议。

UDP:
UDP 是一个面向非连接的协议,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.

写在后面:
本文主要是介绍概念,未来会从 Android 的角度来总结 TCP 和 UDP 的使用。

相关文章

  • TCP与UDP差异对比分析

    TCP与UDP差异对比分析 本文原创,转载请注明出处。欢迎关注我的 简书 ,关注我的专题 Android Clas...

  • 查漏补缺->04网络协议

    目标 一、TCP与UDP 1.1 TCP与UDP的对比 1.3 TCP四次挥手 三、HTTP1.0、HTTP1.1...

  • 网络协议:传输层之UDP与TCP

    目录一,UDP与TCP的对比二,UDP三,TCP四,TCP之可靠传输五,TCP之序号和确认号六,TCP之流量控制七...

  • 计算机网络

    TCP与UDP的对比(1)连接方面,TCP需要三次握手而UDP并不需要(2)TCP有完善的拥塞控制机制,UDP没有...

  • TCP协议知识盘点

    首先需要回顾:TCP与UDP的区别、差异、以及应用场景 TCP对应的协议和UDP对应的协议 TCP对应的协议:(1...

  • 网络 Conclusion

    1. TCP和UDP TCP/UDP详细分析TCP是点对点的通信,UDP是广播TCP控制了数据包的发送序列的产生,...

  • iOS 网络相关面试题

    问题:TCP、UDP TCP/UDP 传输层协议 ||—— UDP:用户数据报协议 TCP与UDP的区别: 问题...

  • 2018-09-19

    网络面试集 一、TCP/UDP 1、UDP与TCP的区别 TCP(TransmissionControl ...

  • TCP 与 UDP

    TCP 与 UDP(主要说TCP)TCP/UDP端口号TCP/UDP端口号TCP连接的建立TCP连接的建立发送se...

  • TCP和UDP的最完整的区别

    TCP UDP TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少; 3.UDP...

网友评论

  • 小码儿:我是做iOS的,安卓不懂,但是感觉你写的挺好.
    MeloDev:啊哈哈 都是一样的知识

本文标题:TCP与UDP差异对比分析

本文链接:https://www.haomeiwen.com/subject/owassxtx.html