TCP与UDP的区别:
TCP(TransmissionControlProtocol传输控制协议): 是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP(User Datagram Protocol): 一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。可靠性由上层应用实现,所以要实现UDP可靠性传输,必须通过应用层来实现和控制。
TCP如何实现可靠性传输?
确认机制、重传机制、滑动窗口
1. 确认机制
- 当TCP发出一个数据段后,它启动一个定时器,等待宿端收到这个报文段并确认。如果没有按时收到宿端的确认,将重发这个报文段。(TCP有延迟确认的功能)
- TCP将保持它首部和数据的校验和,目的是检测数据在传输过程中的任何变化。如果收到数据段的校验和有差错,TCP将丢掉这个报文,不确认,希望发送端超时重发。
除此:
- TCP可以对收到的数据进行重新排序。
- TCP接收端丢弃重复的数据。
2. 重传机制
TCP协议用于控制数据段是否需要重传的依据是设立重发定时器。在发送一个数据段的同时启动一个定时器,如果超时前没有收到确认,则重传该数据段。
重传机制的关键: 对定时器初始值的设定。
采用的方法: 动态的不断调整超时时间间隔。
工作原理: 对每条连接TCP都保持一个变量RTT(往返时间),用于存放当前到目的端往返所需要时间最接近的估计值。当发送一个数据段时,同时启动连接的定时器,如果在定时器超时前确认信息到达,则记录实际往返时间,并修正RTT的值;如果定时器超时前没有收到确认,则将RTT的值增加1倍。
3. 窗口确认
源主机 --- 宿主机
问题:什么是窗口?
窗口:源在收到确认消息之前可以传输的数据大小称为窗口大小,用于管理丢失数据和流量控制。
TCP通过滑动窗口进行流量控制。
问题:怎么控制呢?
TCP连接的双方都有固定大小的缓冲区,TCP的接收方只允许另一方发送接收方缓冲区所能接纳的数据。
如果接收方缓冲区满了,发送方就会定时询问滑动窗口的容量(自己可以发送数据的大小)。
这将防止较快主机致使较慢主机的缓冲区溢出。
执行的过程: 宿的TCP服务对接收到的数据进行确认,并向源发送确认信息,确认信息中带有确认号,指示接收设备期待接收到的下一字节。
问题:宿端对接收到的数据怎么进行确认呢?
使用数据报头序列号以及确认号来确认已收到包含在数据段的相关的数据字节。
UDP为什么要可靠?
有人会说:那直接用TCP不就行了?TCP是个基于公平性的可靠通信协议,在一些苛刻的网络条件下TCP要么不能提供正常的通信质量保证,要么成本过高。
为什么要在UDP之上做可靠保证,原因是: 在保证通信的时延和质量的条件下尽量降低成本。
UDP如何实现可靠性传输?
关键在于两点,从应用层角度考虑:
1. 提供超时重传,能避免数据包丢失。
2. 提供确认序列号,可以对数据包进行确认和排序。
发送:包的分片、包确认、包的重发
本端:首先在UDP数据包定义一个首部,首部包含确认序列号和时间戳,时间戳是用来计算RTT(数据包传输的往返时间),
接收:包的调序、包的序号确认
对端:
接收到一个数据包后取下该数据包首部的时间戳和确认序列号,并添加本端的确认数据包首部之后发送给对端。
根据此序列号对已收到的数据包进行排序并丢弃重复的数据包。
有如下开源程序利用UDP实现了可靠的数据传输:
1. RUDP
RUDP提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等。
2. RTP
实时传输协议(RTP) 为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。
- RTP本身没有提供按时发送机制
- RTP不提供服务质量(QoS)保证
- RTP实行有序传送,RTP中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置。例如:在视频解码中,就不需要顺序解码。
3. UDT
基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。
UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上标准数据传输协议TCP在高带宽长距离网络上性能很差。
UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制,是面向连接的双向的应用层协议,同时支持可靠的数据流传输和部分可靠的数据包传输。
应用: 点到点技术(P2P),防火墙穿透,多媒体数据传输等。