UDP与TCP的区别

   TCP (Transmission Control Protocol)---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP建立连接要进行3次握手,而断开连接要进行4次。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 

      UDP(User Data Protocol)---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

   UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效率高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况 

TCP要三次握手, 每次传输都会检查包回执有重发机制, 用于可靠性要求高, 性能要求不高的传输.
UDP会丢包, 丢包后不重发, 所以在可靠性要求低, 性能要求高的地方使用.
大多数情况下TCP已经满足需求了, 但总有对性能欲求不满的地方.
例如流媒体相关, 时延较大的卫星通讯方面, 铁路信息上报及交互系统, 城市交通信息上报及交互系统等等, UDP作用也是巨大, 而且UDP和TCP并非公用一套端口, 合理运用也能起到意想不到的作用.

udp处理数据报,tcp处理网络流。
读udp socket 一次返回一个报文
读TCP socket不一定能读到一个完整的报文
udp不保证报文到达的先后顺序,不保证是否有报文丢失
tcp保证写入流的数据按顺序被读出来
tcp可靠性高,效率低

关于TCP和UDP的区别和概念上面都有人写过了。我这里写一个UDP的应用。

在多人网络游戏中,人物的移动可以用UDP来发。因为人物一直处于移动当中,会频繁发出位置信息的包。由于发的比较频繁,而且后面的位置信息会覆盖掉前面的位置信息,所以丢不丢包不重要。就可以用UDP来发。每个UDP包的数据里面加个时间戳,那么进来的包你判断下时间,如果是已经过期的包,就可以直接丢掉。这样,即使udp包过来的顺序不一样都无所谓了

般使用tcp,可靠性传输。但用udp也可以做的很完美,比如qq就是使用udp

TCP是面向流字符的,数据流间无边界;UDP是面向分组的,分组间有明确的边界。
对于TCP,发送一串数字(1,2,3,4,5),接收时有可能变成两次(1,2)和(2,4,5),或者变成任意接收方式,协议栈只保证接收顺序正确;UDP发送一个分组,接收方或者接收完全失败,如果成功整个分组都会接收到。

1、TCP是面向连接的,UDP是无连接的。类比于打电话和发电报的关系。


UDP 的使用范围很窄,而且编程比 TCP 难多了:

  1. 你真的很在乎延迟,不能忍受重传,那么就用UDP,例如 NTP 协议。重传NTP消息纯属添乱。
  2. 你真的不在乎可靠性,丢一些包也不需要重传,那么就可以用 UDP。例子我想不出来。音频或视频流可以用UDP,不过据有些大视频网站都用HTTP协议,而HTTP是基于TCP的,实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致0.5秒以后才到,那么整个音视频就延迟了0.5
  3. 你需要NAT穿透,那么不得不用UDP。
  4. 其他情况,一旦程序要自己做重传,你都是在用UDP模拟出蹩脚的TCP,还不如直接用TCP呢。
总之:使用 UDP 需要有强大到不容置疑的理由,when in doubt, use TCP.

一些协议,出于历史原因,受当时技术和网络条件限制,选择了基于UDP实现,其选择的理由现在很可能已经不再成立了。因此“xxx协议用UDP”不是你现在写网络应用程序也该用UDP的理由,除非你本身就是在实现xxx协议。

另外,那些说TCP比UDP慢、效率低的,你拿UDP写个程序,把千兆网带宽打满(TCP等价的代码只有两行:客户端 while (true) { send(...); } 服务端 while (true) { recv(...); }。),且不说你的程序会有多复杂,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛。

从设计目的来看,udp的发送方是不知道接受方是否收到数据,而tcp是要求发送方确定的知道接受方

可以看出,UDP与TCP的主要区别在于:

1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;

5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。


你可能感兴趣的:(UDP与TCP的区别)