TCP、UDP区别详解及TCP协议中的细节

712 阅读6分钟

TCP和UDP的区别

1、TCP能够保证可靠的数据传输,而UDP不能保证

2、TCP拥有流量控制,UDP没有流量控制

3、TCP拥有拥塞控制,UDP没有拥塞控制

4、TCP面向连接,UDP面向无连接

5、UDP支持一对一、一对多、多对多,TCP支持一对一

6、UDP直接将应用层的报文添加首部后就向下传输,没有分解合并,TCP面向字节流,如果应用层的报文字节太大,可以拆分开发送,如果应用层报文字节太小,也可以等待有足够多的字节之后再构成报文段发出。

7、TCP报头最小20字节,UDP报头只有8字节。

TCP如何保证可靠的数据传输

TCP通过超时重传机制和快速重传机制来保证可靠的数据传输。

发送方发送的数据在规定的时间内没有收到确认,则重新发送该数据,这就是超时重传机制。其中的重点就是如何确定规定的时间,如果这个时间定的太短了,那么发送方会经常进行重传,很可能同样的数据发了多次,造成网络资源的浪费,如果太长了,接收方一直收不到数据,会造成通信效率的下降。对于超时时间我们一般通过预估往返时间加上四倍的偏差值

预估往返时间是通过指数加权移动平均计算的,即现在的预估往返时间是由上一次的EstimatedRTT(预估往返时间)乘上(1-α)再加上α乘上当前的SampleRTT(样本往返时间),建议α取值为0.125。

EstimatedRTT=(1α)EstimatedRTT+αSampleRTTEstimatedRTT = (1-α)·EstimatedRTT + α·SampleRTT

偏差值是通过测量RTT(往返时延)的差值来计算的,估算SampleRTT偏移EstimatedRTT的程度。

DevRTT=(1β)DevRTT+βSampleRTTEstimatedRTTDevRTT = (1-β)·DevRTT+β·|SampleRTT-EstimatedRTT|

得到的超时时间间隔就是下面的公式。

TimeoutInterval=EstimatedRTT+4DevRTTTimeoutInterval = EstimatedRTT+4·DevRTT

那么快速重传机制又是什么呢?TCP是一种pipeline(流水线)协议,即可以同时发送多个请求,发送的请求被接收方收到,接收方就会回复一个当前接受窗口前沿值的ACK,如果同时发送了三个相同的ACK,那么发送方直接对ACK的数据进行重传,不用等到超时重传机制触发。

前面说到TCP是一种pipeline协议,pipeline协议有两种实现机制,分别是Go back N 和 SR,Go back N用于发送窗口大于1,接受窗口等于1的情况,SR用于接受窗口和发送窗口都大于1的情况。我们的TCP综合了两者,比如说TCP中只有一个超时重传定时器,设置于已发送但未被确认的最靠前报文段,这点类似于Go back N,接收方接收到报文段后返回的ACK是顺序到达最大的ACK,这点类似于Go back N,但是如果触发重传,则只重新发送一个报文段,这点类似于SR。

TCP流量控制

TCP协议中双方互相发送报文段,会考虑对方的接受能力,如果对方不能接受了还一直继续发,那么会造成数据溢出,所以需要在发送阶段告诉对方自己的接受缓存区还有多大。TCP在TCP头中有接受窗口字段,表示接收方能够接受的数据大小。

TCP拥塞控制

在讨论拥塞控制之前,我们先来看看拥塞控制有什么意义。如果没有拥塞控制的话,通信的双方都会以最大的速度发送报文段,造成通信链路拥塞,拥塞会导致延迟增加和分组丢失率增加,这样TCP重传机制就很有可能触发,会将之前已经发送过的报文段再重新发送,这样整个通信链路中有效信息的占比就会越来越少,之前已经发送信息的重复会越来越多。所以我们需要拥塞控制来解决这样的问题。

拥塞控制分为两种,端到端的拥塞控制和网络辅助的拥塞控制。端到端的拥塞控制由发送方和接收方自行进行发送速率的控制,网络辅助的拥塞控制由路由器告诉发送方自己能够接收的最大发送速率,ATM体系结构用的就是网络辅助的拥塞控制。TCP IP用的是端到端的拥塞控制。

拥塞控制是为了避免拥塞,而通信过程又是为了信息的以最快的速度传输,这两者是矛盾的,所以TCP拥塞控制分为两个阶段,一个阶段是慢启动阶段,一个阶段是拥塞避免阶段。慢启动阶段为了快速把发送速率提升到阈值,每收到一个ACK,就讲拥塞窗口的值扩大两倍。拥塞避免阶段,每收到一个ACK,拥塞窗口的值扩大一个。

拥塞窗口的增长是以上面两种方式,那么它的减小呢?拥塞窗口的减小由超时重传和快速重传触发,每当触发超时重传时,当前拥塞窗口变为1MSS,阈值(由慢启动变为拥塞避免阶段的值)变为之前拥塞窗口的一半,再次进入慢启动阶段,一旦达到阈值,进入拥塞避免阶段,开始线性增长。如果由快速重传触发的话,阈值变为当前窗口值的二分之一,拥塞窗口为阈值加三(收到的3个冗余ACK)。

TCP的拥塞控制使得TCP具有了公平性,在一条链路上传送的多个TCP连接将平均分享带宽,因为它们是线性增长,乘性减少的。

TCP面向连接,UDP面向无连接

TCP面向连接,经历三次握手、四次挥手阶段,这一部分我总结在了另外一篇文章中。

UDP面向无连接,所以UDP相对TCP没有建立连接的时延,能够更快的传输数据,适用于一些对于完整性要求不高,对于延迟要求高的应用,如IP电话、视频会议等等。

TCP支持1对1,UDP支持1对1,1对多,多对多

这是因为UDP传输数据不建立连接,因此不需要维护连接状态,就可以向多个接收方发送信息。

UDP速度比TCP快

1、UDP没有拥塞控制、流量控制。

2、UDP报文头小。

3、UDP不需要建立连接。

参考文献: 《计算机网络 自顶向下方法》