TCP服务的特点
(1)面向连接:使用TCP协议通讯的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP链接是全双工的,即双方的数据读写可以通过一个连接完成。完成数据交换之后,双方必须断开连接以释放系统资源。
这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。而无连接的UDP则非常适合。
(2)字节流:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系。当发送端应用程序连续多次执行多次写操作时,TCP模块先将数据放入TCP缓冲区中,当TCP模块真正开始发送数据时,发送缓冲区中这些被接受到的数据可能被封装成一个或多个TCP报文段发出。下面会用图片表示出字节流服务和数据报服务的不同。
(3)可靠传输:首先TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接受方的应答,才认为这个TCP报文段传输成功。其次,TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。最后,因为TCP报文段最终是以IP数据报发送的,而IP数据包到达接收端可能会乱序,重复,所以TCP协议还会对接收到的TCP报文段重排、整理,再交给应用层。
UDP服务的特点
(1)无连接:即通信双方不会保持一个长久的联系,因此应用程序每次发送数据都要明确指出接收端的地址。
(2)基于数据报服务:是相对于字节流服务而言,每个UDP数据包都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。
(3)不可靠:这意味着UDP协议无法保证数据从发送端正确的传送到目的端。如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则UDP协议只是简单地给应用程序通知发送失败。
字节流与数据报
TCP为了实现可靠传输,是以浪费部分带宽,牺牲实时性为代价 。UDP则报头小,效率高,代价小,可以在应用层自己实现与应答确认、快速重传等类似的功能来提高自己的可靠性。那么既然TCP是可靠的,为什么不直接用它就好还要提高UDP的可靠性呢?
UDP实现的可靠协议,基本都会对TCP的某一部分进行加强,另外一部分进行削弱。因为:”实时性+可靠性+公平性“ 三者不能同时保证,因此可以牺牲TCP的局部公平性来换取更好的实时性、或者浪费点带宽来实现更低的延迟。
目前已经有一些实现UDP可靠传输的机制,比如UDT(UDP-based Data Transfer Protocol)
UDT:是一个高性能的基于UDP协议的数据传输协议,它是为支持高速广域网上海量数据传输设计的,为解决TCP的效率和公平问题,同时提供可靠的数据流和报文传输。主要目的是针对“TCP在高带宽长距离网络上的传输性能差”的问题,尽可能全面支持BDP网络上的海量数据传输。UDT是建立与UDP之上的面向双向的应用层协议,引入了新的拥塞控制算法和数据可靠性控制机制。它不仅可以支持可靠的数据流传输(STREAM 类型TCP)和部分可靠的数据报(DGRAM类似网络上发广播消息)传输,也可以应用在点对点技术,防火墙穿透,多媒体数据传输等领域。
引入UDT的原因
互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差,且无法充分的利用带宽。其原因主要有一下几点:
1)现行的tcp拥塞窗口机制在高带宽长距离的环境下无法很好的工作,拥塞窗口太小,而且增加过于缓慢直接导致吞吐
率不高,无法充分利用带宽。
此外TCP的AIMD拥塞控制算法过激地降低拥塞窗口的大小,但是不能快速回复到高位充分利用带宽。
2)目前的tcp拥塞控制算法在BDP网络下具有较差的RTT公平性,rtt会影响拥塞窗口的增长,越不容易达的链接的拥塞
窗口增加得越慢,其发送速度越慢,因此会导致越远的链接发送速率越慢。