对于TCP协议和UDP协议,大家应该都再熟悉不过了。我们常用的网络通讯(如下图),都是通过这两种协议进行数据传输的。
如何工作
TCP/UDP协议工作在传输层,它们的目标都是在程序之间传输数据,数据可以是文本文件,视频或者图片,对于这这两种协议来说,都是一堆二进制数,并没有多大区别。那TCP和UDP之间的区别是什么?想必大家都知道,没错,就是一个基于连接,一个基于非连接,具体是什么意思,我们来举个简单的例子。
如果把人与人之间的通信比喻为进程与进程的通信,我们基本有两种方式:写信和打电话。如果不考虑速度因素,这两种方式之间最大的区别是什么?对于写信方式,
- 信寄出去后对方能否接收到。
- 收到的信内容是否完整。
- 先后寄两封信过去是否按顺序接收。
这些都变成了未知数,甚至你填写的收件地址和收件人,你都无法确认。而打电话则不同,从拨打电话到电话接通,互相通话,再到结束通话后挂断电话,这一系列的流程都能得到及时的反馈,并且能确认对方准确的接收到。所以我们可以这样说,打电话就是基于连接的;而写信就是基于非连接的。
TCP如何保证以上过程
三个关键步骤(三次握手、传输确认、四次挥手)
三次握手
建立连接的过程,主要解决在不可靠信道进行可靠传输。
为什么不是两次握手?(即在服务端回复完SYN+ACK后就建立连接)
这是因为防止已失效的请求报文突然又传到服务器引起错误。
传输确认
进入数据传输状态,面临的几个问题:一包数据有可能会被拆成多包发送,如何处理丢包问题;这些包到达的先后顺序不同,如何处理乱序问题。
以上过程不区分客户端和服务端,tcp连接是全双工的,对于两端来说均采用上述机制。
四次挥手
为了在不可靠的网络链路中进行可靠的链路断开。
UDP协议
其实就是将数据简单地包装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系。正因为udp这种简单的处理方式,导致它的性能损耗非常少,对于CPU,内存资源的占用也远小于tcp,但对网络传输过程中产生的丢包,udp协议并不能保证,所以udp在传输稳定性上要弱于tcp。
总结
协议 | 特点 | 应用场景 |
TCP | 传输数据稳定可靠 | 网络通讯质量较高,需要准确无误(传输文件、发送邮件、浏览网页) |
UDP | 速度快 | 实时性要求较高,少量丢包不影响(域名查询、语音通话、视频直播) |
除此之外,udp还有一个非常重要的应用场景——隧道网络 ,比如VPN,VXLAN。