四 网络编程懒人入门:快速理解TCP和UDP的差异( 二 )


(关于TCP的3次握手和4次挥手文章 , 可详见《理论经典:TCP协议的3次握手与4次挥手过程详解》、《理论联系实际:抓包分析TCP 3次握手、4次挥手过程》)
5、数据发送方式的差异
关于 TCP、UDP 之间数据发送的差异 , 可以体现二者最大的不同之处:
那么每次 UDP 发送的数据报大小由哪些因素共同决定呢?
先来看第一个因素 , UDP 本身协议的报文长度为 2^16 - 1 , UDP 包头占 8 个字节 , IP 协议本身封装后包头占 20 个字节 , 所以最终长度为: 2^16 - 1 - 20 - 8 = 65507 字节 。
只看第一个因素有点理想化了 , 因为 UDP 属于不可靠协议 , 我们应该尽量避免在传输过程中 , 数据包被分割 。所以这里有一个非常重要的概念 MTU -- 也就是最大传输单元 。
在下 MTU 的值为 576 字节 , 所以在下使用 UDP 协议 , 每个数据报最大的字节数为: 576 - 20 - 8 = 548
(有关UDP协议的最大包长限制 , 详见《UDP中一个包的大小最大能多大?》)
6、数据有序性的差异
我们再来谈谈数据的有序性 。
6.1TCP
对于 TCP 来说 , 本身 TCP 有着超时重传、错误重传、还有等等一系列复杂的算法保证了 TCP 的数据是有序的 , 假设你发送了数据 1、2、3 , 则只要发送端和接收端保持连接时 , 接收端收到的数据始终都是 1、2、3 。
6.2UDP
而 UDP 协议则要奔放的多 , 无论端无论缓冲池的大小有多大 , 接收端发来的消息总是一个一个的接收 。并且由于 UDP 本身的不可靠性以及无序性 , 如果发送了 1、2、3 这三个数据报过来 ,  端接收到的可能是任意顺序、任意个数三个数据报的排列组合 。
7、可靠性的差异
其实大家都知道 TCP 本身是可靠的协议 , 而 UDP 是不可靠的协议 。
7.1 TCP
TCP 内部的很多算法机制让他保持连接的过程中是很可靠的 。比如:TCP 的超时重传、错误重传、TCP 的流量控制、阻塞控制、慢热启动算法、拥塞避免算法、快速恢复算法 等等 。所以 TCP 是一个内部原理复杂 , 但是使用起来比较简单的这么一个协议 。
7.2 UDP
UDP 是一个面向非连接的协议 , UDP 发送的每个数据报带有自己的 IP 地址和接收方的 IP 地址 , 它本身对这个数据报是否出错 , 是否到达不关心 , 只要发出去了就好了 。
所以来研究下 , 什么情况会导致 UDP 丢包:
8、使用场景总结
在文章最后的一部分 , 聊聊 TCP、UDP 使用场景 。
先来说 UDP 的吧 , 有很多人都会觉得 UDP 与 TCP 相比 , 在性能速度上是占优势的 。因为 UDP 并不用保持一个持续的连接 , 也不需要对收发包进行确认 。但事实上经过这么多年的发展 TCP 已经拥有足够多的算法和优化 , 在网络状态不错的情况下 , TCP 的整体性能是优于 UDP 的 。
那在什么时候我们非用 UDP 不可呢?
以上我们说了 UDP 的使用场景 , 在此之外的其他情况 , 使用 TCP 准没错 。
毕竟有一句话嘛:
when in doubt , use TCP 。
【四网络编程懒人入门:快速理解TCP和UDP的差异】(原文链接:点此进入 , 有改动)