协议特点:面向连接的可靠传输,报头20字节,存在流量控制机制(超时重发,丢弃重复数据,检验数据,分段排序,拥塞处理,滑动窗口机制,保证数据能从一端传到另一端。)
TCP的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。
为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它。
协议特点:无连接、报头8个字节,无法保证对端接收到数据的完整性。通过UDP协议传输到达目的地的时间和内容的完整性都不能保证。
UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它 们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
TCP适合实时性要求不高,但要求内容要完整传输的应用。相比而言,UDP由于无连接、无重传确认,所以传输效率高、延时小,适合实时性要求高的应用,如游戏服务器,音频,视频等;另外,由于不用维持大的并发量,所以适合巨量服务的server,加上合适的时间控制,可以用来设计更大的并发服务器;再者就是,UDP可以更高效的利用网络带宽。
举个例子:
视频流用UDP:若是链路中途丢包了导致丢了一两个帧,不影响到观影体验。视频传输不需要那么高的准确性,偶尔丢个包也没什么问题。
可以在应用层面去解决UDP丢包乱序的问题:重传也由上层协议来控制。
1. jitterbuffer
2. RTP
3. MTU
UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。ICQ 短消息使用 UDP 协议发送消息。
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。
国人几乎都是用的QQ,在建立连接阶段,使用的是面向连接的TCP协议,通过三次握手来完成;然后,在文字数据传输阶段,使用的是UDP协议,但需要中间服务器转发(估计是使用了connect()的UDP,QQ离线发送/接收数据的基础)。而音视频数据的发送一定要使用UDP协议,因为一般的客户可以容忍稍微模糊(略有缺失的数据块)的声音或视频,但估计不会接受一会断开,一会连接(因为TCP容易断线)的音视频;而文件传输则使用了P2P的协议,当前大多P2P使用的UTP协议也是基于UDP的,因为使用TCP的话会浪费大量的带宽。