前言:以后我博客的主要内容可能是对一些他人的文章用自己的话讲述与信息的提炼。
当然我的博客会记录些我没有很熟悉的内容,如果你希望我写些什么,欢迎评论区留言。
推荐一个很好用的记录软件幕布,这里附上幕布链接:https://mubu.com/inv/1813497。有幸看到此文并感兴趣的可以选择使用。注:链接是我的推荐链接。
转自即时通讯网:http://www.52im.net/
原作者:MeloDev,本文由即时通讯网重新修订发布,感谢原作者的无私分享。
总说:
TCP 是面向连接的、可靠的、有序的、数据流协议
UDP 是无连接的、不可靠的、无序的、数据报协议
细说:
1、数据发送方式不同:TCP、UDP分装的报头文件就不同。
TCP是数据流协议。理论上数据流不存在大小的限制。但是由于缓冲区有大小限制,所以用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。所以可能存在粘包的问题。
UDP是数据报协议。再报头里有16位的UDP报文长度。所以最大报文长度也就不能超过 2^16 = 65535。虽然理论上是这么多,但是再因特网下,还有一个最大传输单元MTU的概念。MTU = 576字节。同时减去20字节的IP包头,8字节的UDP包头。最后也就是548字节。
2、数据接收顺序
TCP因为有着超时重传、错误重传等机制,所以保证了TCP接收的数据是有序的。
UDP只管一个一个发,接收方可能会以任意顺序接收。
3、可靠性
TCP由于超时重传、错误重传、流量控制、阻塞控制、慢启动算法、拥塞避免算法、快速恢复算法等保证了TCP的可靠性。
UDP无连接协议,只管发,对方收没收到不管。
分析一下UDP什么情况下会丢包:
- 数据报分片重组丢失:上述体到MTU概念,也就是说在根据MTU分包的时候可能丢失数据。UDP 本身有 CRC 检测机制,会抛弃掉丢失的 UDP 包。
- UDP 缓冲区填满:当 UDP 的缓冲区已经被填满的时候,接收方还没有处理这部分的 UDP 数据报,这个时候再过来的数据报就没有地方可以存了,自然就都被丢弃了。
那在什么时候我们非用 UDP 不可呢?
- 对实时性要求高:比如实时视频这种情况下,如果使用 TCP,当网络不好发生重传时,画面肯定会有延时,甚至越堆越多。如果使用 UDP 的话,即使偶尔丢了几个包,但是也不会影响什么,这种情况下使用 UDP 比较好;
- 多点通信:TCP 需要保持一个长连接,那么在涉及多点通讯的时候,肯定需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,而 UDP 可以无需保持连接,直接发就可以了,所以成本会很低,而且穿透性好。这种情况下使用 UDP 也是没错的。
UDP不可靠,为什么要用UDP?上述问题其实也可以解释该问题。
- 由于时代进步,科技发展,网速快了,网络环境变好,网络的延迟性,稳定性都不错,UDP的丢包概率也没有想象中的夸张。并且UDP性能本身就优于TCP(TCP为了可靠使用了很复杂的算法,速度难以进一步提升)所以UDP的使用或许会占到主导地位。