前言
日常在网上浏览一些文章时都会看到一些介绍TCP和UDP的文章,每次都是草草浏览,而没有深入的去研究,这几天在做日志采集工具的时候恰好遇到一个问题,就是采集端将采集到的内容发送到服务端时这里采用的通信协议应该如何考量?
首先来回顾一下网络模型
TCP/IP协议是Internet的核心协议,TCP/IP协议主要分为四层,从高到低依次为:应用层、传输层、网际层和网络接口层。 而上面提到的TCP和UDP就是处于传输层的通信协议。
TCP、UDP相比于日常最常使用的HTTP协议处于的系统的更下层,因此TCP和UDP比HTTP更具有可定制性,因此也诞生了很多基于TCP和UDP的通信协议,比如:用于传输文件的FTP协议,远程登录的Telnet协议,等等。当然也有使用TCP实现的HTTP协议,但是切记HTTP协议是处于应用层的协议,它的传输协议可以使用tcp协议,也可以使用其他协议,比如sctp协议。
UDP和TCP的区别
图片来源于网络。
1、从可靠性层面来讲:
TCP采用了重发技术来实现了数据传输的可靠性,具体来说就是在TCP传输过程中,发送方启动一个定时器,然后将数据包发出,当接收方收到了这个消息后就给发送方发送一个确认信息,如果发送方在定时器到点之前没有收到接收方的确认信息,则重新发送一次数据包。
TCP为了保证可靠,当发送方主机和接收方主机建立通信时,必须要经过三次握手来保证TCP连接的建立。
UDP相比于TCP减少了重发功能,并且也不需要三次握手来保证连接成功,它是面向无连接且不可靠的传输协议。
2、从网络利用率来讲:
UDP由于缺少错误重试、确认等机制,所以网络带宽利用率更高。
3、从传输效率上来讲:
UPD不需要重试、确认等机制,所以传输更快,但是不保证消息可靠,因此UDP的使用要根据实际情况来决断。
综上,TCP较UDP可靠,但是传输效率上却比UDP差了一大截.
实际使用
下面就分析下前言中所提到的日志采集客户端和服务端要使用什么协议来进行传输。
1、日志传输时如果使用TCP传输显然更安全并且可以保证服务端接收的顺序。如果采用UDP则不可能会出现日志块丢失的情况。但是日志块丢失一般出现在网络环境不好的情况下,如果网络环境出现问题即使使用TCP也会因为Tcp的超时重传机制,出现传输拥堵的问题,最终可能导致进程异常结束。
2、如果使用UDP来传输,传输效率上会很快,如果是单线程也不太可能出现日志块顺序错乱。
3、作为日志本身也允许少量的日志丢失。
因此最终使用UDP来做为日志采集工具的通信协议。