TCP与UDP都属于传输层协议。
TCP/IP参考模型分为四层协议:数据链路层,网络层,传输层,应用层。
现在通过分析TCP与UDP各自的特点来说明它们之间的区别;
TCP是传输控制协议,拥有以下几个特点:
- 面向连接
- 可靠传输
- 面向字节流
- 流量控制
- 拥塞控制
UDP是用户数据报协议,拥有以下几个特点:
- 无连接
- 尽最大努力交付
- 面向报文
1. TCP面向连接
TCP传输数据时首先都需要建立连接,TCP建立连接的过程称为三次握手,断开连接时需要进行四次握手,以保证双方通信的稳定性。
TCP三次握手及四次挥手步骤请移步:简单描述HTTP连接建立流程
2. TCP可靠传输
TCP通过停止等待协议来保证数据的可靠传输,停止等待协议的特点是:
- 无差错情况,保证数据的正确性
- 超时重传,保证数据不丢失
- 确认丢失,保证数据不重复
- 确认迟到,保证数据按序到达
2.1 无差错情况
TCP无差错情况到Client发送数据M1给客户端给Server端时,Server需要返回一个确认报文给Client端,Client才会继续发送M2给Server端,以此类推,来保证数据能够无差错的传给Server端。
2.2 超时重传
超时重传当Client端发送M1给Server端时,如果网络不好或者M1被劫持篡改了,Server通过差错检测判断是有有差错的报文,并不会发送确认报文给Client端,此时Client会通过定时器判断确认报文已经超时了,会重传M1给Server端。通过超时重传来保证数据不丢失传递给Server端
2.3 确认丢失
确认丢失确认丢失是Server收到M1消息之后会发送确认报文给Client端,如果网络不好等原因导致Client并没有收到Server端的确认报文,Client会通过超时重传机制再次发送M1数据给Server端,而Server端收到M1之后发现之前已经收到过M1了,Server端会丢弃之前上传的M1数据,重新发送确认报文给Client。通过确认丢失机制可以解决Client通过超时重传可能重复上传数据的异常情况问题。
2.4 确认迟到
确认迟到确认迟到跟确认丢失很类似,确认迟到指的是Server端发送M1的确认报文延迟到达了Client,而此时客户端已经通过超时重传机制又发送了M1给Server端,所以当Client收到迟到的确认报文时什么也不会做。
3 TCP面向字节流
面向字节流图解比如发送方有15个字节的数据需要发给接收方,每次数据传输的大小是由TCP协议层决定的,TCP会有一个缓存区先将需要发送的数据缓存起来,TCP通过连接通道有可能将 5、6 的字节数据组装成一个发送报文给接收方,也有可能将7、8、9的字节数据组装成一个发送报文给接收方。这种TCP将发送方的数据拆分字节拼成数据包发给接收方的方式称做为面向字节流。
4 TCP流量控制
TCP的流量控制是通过滑动窗口协议(连续ARQ协议)实现的,滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
滑动窗口协议流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。
为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。
5 TCP拥塞控制
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
拥塞控制流程TCP发送方会在拥塞窗口设定一个门限制初始值(超过这个值可能会出现网络拥塞),假设门限初始值为16,TCP发送数据时会尝试发送1个字节的报文,如果网络正常会成倍的增长发送数据的大小直到达到门限值,达到门限值之后TCP会进行加法增大的算法(比如一次增加1个字节)来进行发送数据,当发送数据大小达到一定大小时(比如24个字节时)TCP判断到网络出现拥塞,此时TCP会利用乘法减小的算法降低发送数据,同时降低门限值为12(新的门限值为网络拥塞大小的一半),然后再次进行慢开始过程来重新上传数据。
6 UDP无连接
UDP无连接与TCP的面向连接时对应的,无连接指的是接收方和发送方传输数据时不需要进行连接,也就少了TCP的三次握手步骤,所以UDP传输数据比TCP快。
7 UDP尽最大努力交付
尽最大努力交付指的是UDP不保证数据的可靠传输,因为它没有像TCP一样有一个连接通道,这样做也是为了提高数据的传输效率。
8 UDP面向报文
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加UDP首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文。
UDP面向报文发送数据流程9 UDP复用、分用
复用和分用的概念指的是同一台设备可能有多个应用程序,它们使用的端口号分别是端口1、端口2、端口3,当他们发送数据时用复用同一套UDP传输数据报传给IP层进行数据传输,反之分用则是接受方接受到数据时通过UDP分用给不同的应用程序端口。
复用、分用复用和分用概念同时也适用于TCP。
10 差错检测
UDP传输进行差错检测时会数据报前面拼接成一个12字节的伪首部,接下来才是8字节的UDP首部及需要真正的传输数据。然后将所有需要传输的数据以16位字节为一个单元按二进制反码计算出这些16位字的和,并将和的二进制反码写入到检验和位,检验和位位于8字节UDP首部的最后一位。
当接收方收到数据时以同样的算法进行检验对比字节大小,UDP是通过这种简单计算长度大小来保证数据的正确性的。
以下是UDP差错检测的数据报格式:
UDP数据报
参考资料:TCP流量控制、拥塞控制
网友评论