TCP和UDP是两个传输层协议,普遍应用于网络中不一样主机之间传输数据。对任何程序员来讲,熟悉TCP和UDP的工做方式都是相当重要的。这就是为何TCP和UDP是一个流行的Java编程面试问题。我曾经在各类不一样的Java面试中见过这个问题,尤为是对服务器端Java开发人员的面试。因为FIX(金融信息交换)协议也是一个基于TCP协议,一些投资银行,对冲基金,和交换解决方案提供商也在寻找有良好的TCP和UDP的知识的Java开发人员。为高速电子交易平台编写FIX引擎和服务器端组件须要可以对数据结构、算法以及网络等基本知识都理解透彻的的开发人员的html
顺便说一下,使用TCP和UDP并不局限于一个领域,它处于互联网的中心位置。HTTP是基于TCP,而HTTP是整个互联网的核心部分。另外一个Java开发人员应该理解这两个协议的理由是, java普遍用于编写多线程、并行以及可伸缩的服务器程序。Java还提供了丰富的基于TCP和UDP套接字编程API。在这篇文章中,咱们将学习TCP和UDP协议之间的关键差别。首先,TCP表明传输控制协议和UDP表明用户数据报协议,二者都普遍的应用于构建互联网应用。java
我喜欢比较两事物的不一样点,这不只使他们更加容易比较,并且会更容易记住他们之间的差别。当咱们比较TCP,UDP,咱们须要了解TCP和UDP各自的工做方式,了解哪一种协议提供了可靠保证交付和而哪一个又没有。哪一种协议是快速的,他为何更加快速,最重要的是,当咱们了解了这些,在建设咱们本身的分布式应用程序时,就知道该选择TCP仍是 UDP。在这篇文章中,咱们将看到9点UDP和TCP之间的差别,例如,链接步骤,排序,速度,可靠性,开销,头大小,拥塞控制,应用以及基于TCP和UDP协议不一样,他们如何传输数据。linux
他们之间的第一点而且最重要的区别是:TCP是面向链接的协议,而UDP是无链接的协议。这意味着当一个客户端和一个服务器经过TCP发送数据以前,必须先创建链接,他们能够经过TCP发送数据。创建链接的过程也被称为TCP握手,他经过控制消息在客户端和服务器之间互换来实现。下面的图形象描述了TCP握手过程。客户端,它也是TCP链接的发起者,发送一个SYN消息给服务器,该服务器端正在监听某个TCP端口。服务器接收该消息并发送一个SYN-ACK消息,客户端接受到该消息以后会再回一个ACK消息。一旦服务器收到ACK消息,TCP链接就创建成功,准备数据传输了。另外一方面,UDP是无链接的协议,和点对点链接以前不须要发送消息。这就是为何,UDP更加适合消息的多播发布,从单个点向多个点传输消息。程序员
图1:TCP消息握手(TCP - Handshake Message)面试
TCP提供交付保证,这意味着一个使用TCP协议发送的消息是保证交付给客户端的。若是消息在传输过程当中丢失,那么它将重发,这是由TCP协议自己控制的。另外一方面,UDP是不可靠的,它不提供任何交付的保证。一个数据报包在运输途中可能会丢失。这就是为何UDP是不适合保证交付的项目。算法
除了提供交付保证,为TCP也保证了消息的有序性。该消息将以从服务器端发出的一样的顺序发送到客户端,尽管这些消息到网络的另外一端时多是无序的。TCP协议将会为你排好序。UDP不提供任何有序性或序列性的保证。数据包将以任何可能的顺序到达。这就是为何TCP是适合须要顺序交付方式的应用,尽管有基于UDP的协议经过使用序列号和重传来提供有序和可靠性的应用,如TIBCO Rendezvous,他实际上就是一个基于UDP的应用。编程
TCP不保存数据的边界,而UDP保证。在传输控制协议,数据以字节流的形式发送,并无明显的标志代表传输信号消息(段)的边界。在UDP中,数据包单独发送的,只有当他们到达时,才会再次集成。包有明确的界限来哪些包已经收到,这意味着在消息发送后,在接收器接口将会有一个读操做,来生成一个完整的消息。虽然TCP也将在收集全部字节以后生成一个完整的消息,可是这些信息在传给传输给接受端以前将储存在TCP缓冲区,以确保更好的使用网络带宽服务器
总而言之,TCP速度比较慢,而UDP速度比较快,由于TCP必须建立链接,以保证消息的可靠交付和有序性,他须要作比UDP多的多的事。这就是为何UDP更适用于对速度比较敏感的应用,例如:在线视频媒体,电视广播和多人在线游戏。网络
因为上述的开销,TCP被认为是重量级的协议,而与之相比,UDP协议则是一个轻量级的协议。由于UDP传输的信息中不承担任何间接创造链接,保证交货或秩序的的信息。这也反映在用于承载元数据的头的大小。数据结构
TCP具备比UDP更大的头。一个TCP数据包报头的大小是20字节,UDP数据报报头是8个字节。TCP报头中包含序列号,ACK号,数据偏移量,保留,控制位,窗口,紧急指针,可选项,填充项,校验位,源端口和目的端口。而UDP报头只包含长度,源端口号,目的端口,和校验和。下图是TCP和UDP头:
图2:TCP包格式(TCP Packet Format)
图3:UDP包格式(UDP Packet format)
TCP有流量控制。在任何用户数据能够被发送以前,TCP须要三数据包来设置一个套接字链接。TCP处理的可靠性和拥塞控制。另外一方面,UDP不能进行流量控制。
在互联网中,TCP和UDP都运行在哪些环境中了?在了解了TCP和UDP之间的关键差别以后,咱们能够很容易地得出结论,哪一种状况适合他们。因为TCP提供可靠交付和有序性的保证,它是最适合须要高可靠而且对传输时间要求不高的应用。UDP是更适合的应用程序须要快速,高效的传输的应用,如游戏。UDP是无状态的性质,在服务器端须要对大量客户端产生的少许请求进行应答的应用中是很是有用的。在实践中,TCP被用于金融领域,如FIX协议是一种基于TCP的协议,而UDP是大量使用在游戏和娱乐场所。
基于TCP协议的最好例子是HTTP协议和HTTPS协议,他们几乎存在于互联网的任何地方,实际上,绝大多数你所熟悉的一般协议,都是基于TCP的,例如:Telnet,FTP以及SMTP协议。UDP协议没有TCP协议那么受欢迎,可是也被普遍应用,好比DHCP以及DNS协议,其余还有一些基于UDP的协议如SNMP,TFTP,BOOTP以及NFS(早期版本)。
特别须要记住的是,TCP是面向链接的,可靠的,缓慢的,可靠交付以及保证消息顺序的,而UDP是无链接的,不可靠的,没有序列保证,可是一个快速传输的协议。TCP头开销也比UDP高得多,由于它每一个数据包中药发送更多的元数据。值得一提的是,TCP头的大小是20个字节,而UDP头大小是8个字节。若是你不想丢失任何消息,使用TCP协议,而UDP可以高速传输数据,而且丢失少许的数据包是能够接受的,如视频流或在线多玩家游戏。对于基于TCP / UDP协议,运行在Linux上的应用,须要牢记的基本网络命令,如Telnet和netstat,他们极大的帮助调试和排除任何链接问题。
9 Difference between TCP and UDP Protocol – Java Network Interview Question from our JCG partner Javin Paul at the Javarevisited blog.TCP和UDP的9个区别是什么