2025信息系统项目管理师视频教程
127649 人在学
很多文章都说TCP协议可靠,UDP协议不可靠。为什么前者可靠,后者不可靠呢?既然UDP协议不可靠,为什么还要使用它呢?所谓的TCP协议是面向连接的协议,面向连接是什么?既然对TCP和UDP有诸多的不了解,那么我们就一起来学习吧。
1、面向连接的TCP
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
总之,TCP要建立连接必须经过三次握手。
优点:
1)面向连接的传输
2)数据传输稳定可靠
3)端到端的通信
4)全双工方式
5)以字节为单位传输
缺点:传输速度不够快
2、面向无连接的UDP
“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!每个数据包的大小限定在64K以内!
优点:
1)传输速度快
2)效率高
缺点:数据包可能会丢失
3、TCP和UDP为什么会共存?
1)大家要知道,一种物理线路,单位时间内,能够创建的“虚拟信道”是有限的。
2)使用TCP协议传输数据,当数据从A端传到B端后,B端会发送一个确认包(ACK包)给A端,告知A端数据我已收到。UDP协议就没有这种确认机制。这就是为什么说TCP协议可靠,UDP协议不可靠。
QQ普通会员就是使用的UDP协议进行数据传输数据。既然UDP协议自身没有确认机制,这个工作可以交给应用层的进程来完成。大家使用QQ的时候,感觉出错的几率还是非常小的吧。当然把这个确认工作完全交给QQ自身来做,就直接导致了,QQ软件体积增大。、有些应用,对数据传输可靠性要求非常高,例如大家浏览网页,通过网页注册账号、转账等服务,这是不容许出错的,使用TCP协议能把出错的可能性降到最低(当然,网络自身很糟糕,TCP协议也没办法)。但是,提供这种可靠服务,会加大网络带宽的开销,因为“虚拟信道”是持续存在的,同时网络中还会出现大量的ACK和FIN包。
因此,鱼和熊掌不可兼得,需根据实际情况选择传输协议。TCP协议提供了可靠的数据传输,但是其拥塞控制、数据校验、重传机制的网络开销很大,不适合实时通信,所以选择开销很小的UDP协议来传输数据。
UDP协议是无连接的数据传输协议并且无重传机制,会发生丢包、收到重复包、乱序等情况。而对于数据精确性要求不高的状态数据以及视频数据,丢包的影响不大。因为会不断收到新的包,丢失的个别包会有新的包来覆盖,所以只需在远程控制的通信部分自行处理乱序及重复包的问题,而对于丢包的问题一般不作处理。但对于命令包这种需要精确收发的数据,可在程序的开发中加入丢包重发和超时丢弃的处理。当然,如果开发的是对于实时性要求不高的事件控制命令的传输,不希望发生指令的丢失可以直接采用TCP协议。TCP协议的重传机制正好适用这种情况。
非面向连接的传输协议在数据传输之前不建立连接,而是在每个中间节点对非面向连接的包和数据包进行路由。没有点到点的连接,非面向连接的协议,如UDP是不可靠的连接。当一个UDP数据包在网络中移动时,发送过程并不知道它是否到达了目的地,除非应用层已经确认了它已到达的事实。非面向连接的协议也不能探测重复的和乱序的包。标准的专业术语用“不可靠”来描述UDP。在现代网络中,UDP并不易于导致传输失败,但是你也不能肯定地说它是可靠的。
正因为UDP协议没有连接的过程,所以它的通信效果很高;正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发送消息,因此有时会出现收不到消息的情况。TCP协议和UDP协议各有所长、各有所短,适用不同于要求的通信环境。