TCP、UDP协议详解
面向连接的TCP “面向连接”就是在正式通信前必须要与对方建立起连接。比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。 TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
面向非连接的UDP协议 “面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。 UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境 UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
1.
现在Internet上流行的协议是TCP/IP协议,该协议中对低于1024的端口都有确切的定义,他们对应着Internet上一些常见的服务。这些常见的服务可以分为使用TCP端口(面向连接)和使用UDP端口(面向无连接)两种。
说到TCP和UDP,首先要明白“连接”和“无连接”的含义,他们的关系可以用一个形象地比喻来说明,就是打电话和写信。两个人如果要通话,首先要建立 连接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开连接——即挂电话。写信就比较简单了,填写好收信人的地址后将信 投入邮筒,收信人就可以收到了。从这个分析可以看出,建立连接可以在需要通信的双方建立一个传递信息的通道,在发送方发送请求连接信息接收方响应后,由于是在接受方响应后才开始传递信息,而且是在一个通道中传送,因此接受方能比较完整地收到发送方发出的信息,即信息传递的可靠性比较高。但也正因为需要建立连接,使资源开销加大(在建立连接前必须等待接受方响应,传输信息过程中必须确认信息是否传到及断开连接时发出相应的信号等),独占一个通道,在断开连接前不能建立另一个连接,即两人在通话过程中第三方不能打入电话。而无连接是一开始就发送信息(严格说来,这是没有开始、结束的),只是一次性的传递,是先不需要接受方的响应,因而在一定程度上也无法保证信息传递的可靠性了,就像写信一样,我们只是将信寄出去,却不能保证收信人一定可以收到。
TCP是面向连接的,有比较高的可靠性, 一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等,而UDP是面向无连接的,使用这个协议的常见服务有 DNS、SNMP、QQ等。对于QQ必须另外说明一下,QQ2003以前是只使用UDP协议的,其服务器使用8000端口,侦听是否有信息传来,客户端使 用4000端口,向外发送信息(这也就不难理解在一般的显IP的QQ版本中显示好友的IP地址信息中端口常为4000或其后续端口的原因了),即QQ程序 既接受服务又提供服务,在以后的QQ版本中也支持使用TCP协议了。
2.
在了解TCP和UDP之前,我们需要来了解俩个概念,面向连接的服务和无连接的服务,应用面向连接的服务时,客户和服务器在进行数据发送前,彼此向对方发送控制分组,这就是所谓的握手过程,使得客户和服务器都做好分组交换准备。这个准备是很松散的,面向连接服务与很多其他的服务捆绑在一起,包括可靠的数据传输,流量控制和拥塞控制等,依赖连接以正确的顺序无错地传递所有数据。还要使用确认和重传机制实现来可靠性。而无连接服务侧是没有握手过程的,当一方想发送数据时就直接了当地发送,因为没有握手过程也就没有什么流量控制和拥塞控制,这样数据可能传输得更快,但是,由于也没有确认过程,源端就不知道那些分组到达了目的端。因此可能在传输过程中丢失数据,不适合用在一些文件的传输,可以用在因特网电话,视频会议什么的。
TCP(传输控制协议)和UDP(用户数据报协议)是传输层的俩个传输协议,它们俩个的最大区别就是是否面向连接。
TCP包括了面向连接和可靠数据传输服务,在客户端和服务器端进行通信前,要先交换传输层控制信息,为双方的通信做好准备。在这个握手阶段后,我们就可以认为在这俩个进程间存在一个TCP连接,且是一个全双工的连接,在消息发送完后,应用程序会告诉TCP拆除这个连接。可靠的传输服务为了保障彼此通信能无差错地顺序传递所有数据。
当其中任何一个应用程序把一个字节流传如套接字时,它可以指望TCP把同样的字节流传递到对方的套接字,中间不回丢失和重传。TCP是因特网的一种公益服务,其目的是能调节数据传输过程中的一些问题,因此还要包含一个拥塞机制。TCP拥塞机制在网络变得拥塞时阻止发送进程。确切地说,TCP拥塞控制试图把每个TCP连接限定在它所公平共享的网络带宽上。对于有最小带宽需求限制的实时音频或视频应用来说,阻止其带宽那就让它们不能正常工作,此外,我们能想象一下,在网络电话通话时,偶尔的不连续是可以容忍的,可见实时应用可以容忍丢失少部分数据,不需要完全可靠服务。
说了这么多,TCP能提供的好的服务,再看一下其缺点吧,首先,TCP不保证最小传输率,通俗点说,TCP不允许发送进程以想要的速率发送数据,受到TCP拥塞控制的调节,发送进程有可能被迫以一个较低的平均速率发送。其次,TCP不提供任何延时保障,具体点说,发送进程把数据传入自己的TCP套接字后,这个数据将最终到达其接受套接字,但是中间所经历的时间就不能保证了 ,花几秒或则几分钟都不一定。
UDP是一个非面向连接的轻量级传输协议,具有一个最简单的服务模型。UDP是无连接的,因此两个进程彼此通信之前没有握手过程。UDP提供不可靠的数据传输服务,也就是说当一个进程往自己套接字发送一个消息时,UDP不能保障这个消息回最终到达接受套接字。另外,就确实到达接收套节字的消息而言,他们的到达顺序也可能不是有序的。
UDP不含拥塞控制机制,因此发送进程能够以任意速率往UDP套接字发送数据,尽管不能保证所有数据都到达接收套接字,但是会有相当比列的数据到达。实时应用程序的开发人员往往选择在UDP上运行他们的应用。与TCP类似,UDP也不提供任何延迟保证。
说了这么多,我们可以通过下表来体会一下上面说的真正含义。
应 用 | 应用层协议 | 用来支撑的传输协议 |
电子邮件 | SMTP(RFC82) | TCP |
远程终端访问 | Telenet | TCP |
WEB | HTTP | TCP |
文件传送 | FTP | TCP |
远程文件服务器 | NFS | TCP或UDP |
流多媒体 | 专属 | UDP或TCP |
因特网电话 | 专属 | 一般为UDP |
在表中我们看到,电子邮件,远程终端访问,WEB和文件传送都使用TCP协议,这些应用选择TCP的主要原因是在于TCP提供了可靠的数据传输服务,能够保证所有数据最终到达其目的地。我们还看到,因特网电话一般运行在UDP协议上面,一个因特网电话应用的俩端都得以某个最小速率跨越网络发送数据;另外,因特网电话可以容忍数据丢失,从这个俩个条件来看,都适合UDP,不需要可靠的TCP传输服务。
总的来说,TCP能保证传递全部数据,而UDP不能,且他们都不提供延迟保证。他们不提供延迟保证,并不意味着时间敏感的应用不能运行在现在的因特网上,而是应用是通过一些其他的方法来保证这些需要。