1、TCP面向连接,UDP面向无连接;
2、TCP传输基于流,UDP传输基于报文;
3、TCP协议传输具有可靠性,UDP传输则不保证可靠数据交付
4、TCP占用系统资源多,效率低,速度慢,UDP占用系统资源较少,效率高,速度相对TCP快
1、为什么说TCP是面向连接的?
因为TCP协议传输数据是端到端的,即传输数据的前提需要搭建好客户端和服务端连接的管道(socket管道),而这些都是也都保证了TCP传输的可靠安全。TCP建立连接管道的前提需要经历”三次握手”,三次握手的目的也是为客户端和服务端建立可靠的通信管道,结束数据传输后,客户端和服务端断开连接也需要四次挥手的过程,保证数据完整传输到客户端。而UDP传输数据不止是一对一的,还有一对多,多对多式的传输数据,UDP把数据包装给IP层,通过定位目标IP从而完成传输。
2、TCP基于流,而UDP基于报文传输
TCP基于流传输以字节为传输单位,应用层和传输层之间的数据交互在TCP看来是没有边界的,看成是一连串的字节流,而TCP收到这些数据流会根据数据的大小会进行拆分和储存操作,先把数据放到缓存区,如果数据比较大会先把数据进行分片即进行数据拆分放到TCP缓存区,在合适的时间发送这些数据包,如果数据太小则会先放到TCP缓存区,等到数据包足够大,则会在合适的时间传输这包数据。
这也看出TCP对于数据的处理是没有边界的,可以对数据包进行操作,而应用层和UDP交互的数据,UDP不会对数据进行任何操作,应用层发给UDP一坨数据,他就会发一坨,并不会拖延和放进缓存区,看出UDP保留了报文边界,其实也不用担心应用程序给UDP的数据会超级大,应用层在给UDP数据前会先拆分成合适的数据包给UDP,即便UDP收到的数据包还是会比较大,UDP把数据封装给IP的时候IP也会帮他拆分,从而完成数据传输。
3、TCP数据传输具有可靠性;
这也得益于TCP具有滑动窗口机制,今天下午吃饭时候猛然看到某大牛的在字节的面经,其中一面中面试官的提问就让解释滑动窗口的机制和流量控制,这些专业名词都没听说过。解释一下滑动窗口吧:
滑动窗口原理:
接受端和发送端建立通道后双方都准备完毕,并规定发送数据的大小及发送数据分片的数量
(保证数据传输的安全性),此时窗口建立,发送端的叫做发送窗口,接收端的叫接收窗口。
此时的状态为发送端已经把数据传输给接收端,接收端还未给发送端传达ACK确认 ,接收窗口和滑动窗口都固定在这,发送端会设置一个定时器,如果发送的数据包因为某种原因丢包了接收端没收到,或者接收端给发送端发出的ACK确认因为某种原因丢了,发送端没收到,此时当发送端设置的定时器时间超时,则会重新发送没有收到确认的数据包(如图,比如数据包为0、1、2 接收端收到了0号数据包也成功发送的确认消息,发送端也收到了0号数据包的确认收到消息,发送端的0号会变成红色已确认状态,而1、2号数据包则会根据定时器判断是否超时重新发送)。接收端0号数据包发送确认消息后会移动窗口,即新的窗口为1、2、3,发送端在接收到确认消息后也会移动窗口新的窗口为1、2、3。
此时发送端也会根据定时器判断是否重发1、2号数据包。
接收端发送确认收到消息后会移动窗口(窗口新位置:3、4、5),发送端在接收到确认收到的消息后也会移动窗口,注意接收端会先移动窗口,因为他在发送ACK确认后就立即移动,而确认消息传输到发送端需要时间,接收窗口必须有空闲位置才能接收数据,如果没有空闲位置则会丢弃(接收端接收数据还是比较严格的)这其中也有失序重排和重复数据的处理。
UDP传输数据具有不可靠性:
原因是TCP所执行的一系列操作UDP都没有,包括TCP的滑动窗口机制和流量控制(流量控制后期补充),且传输数据的方式也不是一对一的,UDP只管数据的发送,并不管你接收端数据是否接收到。目前网络通信发展迅速,UDP也不是那么不安全了,传输速度完全取决于网速的快慢。
4、TCP占用系统资源多,效率低,速度慢。
由于TCP要保证数据传输的安全性,会调用滑动窗口机制等一系列操作,需要调用的系统资源较多,所以他的效率就会低,速度也就变慢,而UDP没有TCP保证数据安全的操作,占用系统的资源就少,效率高,传输速度也就快了。