TCP 和UDP的区别以及各自的应用场景

1. UDP用户数据报协议

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

它有以下几个特点:

1. 面向无连接

UDP在发送报文前不需要建立连接,只要客户端想发送信息给服务器端就可以发送信息,并且不会对报文进行任何分组和重组操作。
UDP:我们只是报文的搬运工!

传输数据时:UDP对应用层的传下来的数据只会给数据增加一个UDP标识,表示是UDP协议。不会对报文进行分组。

接收数据时:网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何重组操作。

其中UDP在数据添加的头部开销很小只有8字节其中包括的数据有:

  1. 两个十六位的端口号,分别为源端口(可选字段)和目标端口,各两个字节
  2. 整个数据报文的长度两个字节
  3. 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误

2. 有单播,多播,广播的功能

UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

3. UDP是面向报文的

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文交给UDP

4. 不可靠性

首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

2. TCP传输控制协议

TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。

2.1 TCP连接过程三次握手

TCP建立连接的过程中解决了三个问题:
1):要使每一方都能够确认对方的存在。
2):要允许双方协商一些参数
3):能够对运输实体资源进行分配

TCP连接的建立采用客户机/服务器模式,主动发起连接建立的应用进程叫做客户机,而被动等待连接建立的应用进程叫做服务器。

TCP 和UDP的区别以及各自的应用场景ps:补充一些字段信息,小写的seq和ack表示***和确认号。

***seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;***seq就是这个报文段中的第一个字节的数据编号。

确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;***表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

以下这些都是标志位只有一位。
TCP 和UDP的区别以及各自的应用场景

第一次握手:客户端向服务器端发送请求,请求建立连接,此时SYN=1,***seq=x,客户端进入SYN-SENT(连接请求发送)状态。
第二次握手: 服务器端收到客户端发送过来的请求,确认自己可以建立连接,对连接请求进行回复,回复的报文中SYN=1,ACK=1,***seq=y;确认号ack=x+1;同时从监听状态变为SYN-RECV(请求接受)状态。
第三次握手:客户端收到服务器端的确认信息可以建立连接,这是发送一个确认报文,其中ACK=1,***seq=x+1,ack=y+1。状态变为连接建立,这时可以发送数据给服务器获得服务
服务器在接收到第三次握手发来的确认报文后进入连接建立状态,进行数据传输。

2.2 TCP断开链接

TCP 和UDP的区别以及各自的应用场景
TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

1.数据传输结束后,通信的双方都可以释放连接。此时,客户机和服务器都处于ESTABLISHED(已建立连接)状态。

2.第一次挥手:假设客户机请求完资源了,想要释放连接。首先,客户机的应用进程先向服务器发出连接释放报文段,该报文段中将首部的终止控制位FIN置为1,序号seq=u(注意:此时的u不是随机产生的,而是之前客户机传送的数据的最后一个字节的序号加1)。此时客户机进入到FIN-WAIT-1(终止等待1)状态,等待服务器的确认。

3.第二次挥手:服务器收到连接释放报文后发出确认,在发送报文中将首部中的ACK置为1(ACK置为1,表面服务器同意与客户机释放连接),并且产生序号v(注意:此时的v不是随机产生的,而是之前服务器传送的数据的最后一个字节的序号加1),并且发出确认号为u+1(确认号表明服务器渴望收到的下一个报文段的第一个数据字节的序号,因为之前发送了u,所以下一个序号为u+1)。此时服务器就进入CLOSE-WAIT(关闭等待)状态,客户机进入FIN-WAIT-2状态。

在第二次挥手结束后,客户端的数据都已经发送完毕,但是服务器端可能没有发送完所以需要等待一段时间等服务器端的数据也发送完了再第三次挥手,此时客户端处于FIN-WAIT-2状态。

4.第三次挥手:服务器发送完数据后,此时可以断开连接,还是有服务器向客户机发送报文,该报文段中将首部的终止控制位FIN置为1(只有当FIN置为1时,才能表明客户机想要和服务器断开连接),ACK也置为1,并且序号为w(重点注意,此时的w不一定等于v+1。如果在客户机释放了连接之后,服务器向客户机仍旧发送了一部分数据,那么此时w不等于v+1,但是如果期间没有再发送数据,那么w就等于v+1。总而言之,这个w等于服务器上一次发送的数据的最后一个字节加1),并且发送确认号为u+1(确认号表明服务器渴望收到的下一个报文段的第一个数据字节的序号,因为之前发送了u,所以下一个序号为u+1)。此时服务器就进入了LAST-ACK(最后确认)状态。

5.客户机收到服务器的连接释放报文后,必须对此报文进行确认。在该报文段中将ACK置为1,确认号为w+1(确认号表明服务器渴望收到的下一个报文段的第一个数据字节的序号,因为之前发送了w,所以下一个序号为w+1),产生序号为u+1(因为上一个发送的数据的序号为u)。此时服务器进入到TIME-WAIT(等待时间)状态。但是,此时TCP连接还没有被释放掉。必须经过2MSL后服务器才能进入到CLOSED状态。(注:MSL叫做最长报文段寿命,RFC建议为两分钟,也就是说,要经过四分钟才能进入到CLOSED状态)。

2.3 TCP协议的特点

面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。

由于是面向连接的所以TCP仅支持单播传输每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。

面向字节流:TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

可靠传输
对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

提供拥塞控制

当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞

TCP提供全双工通信

TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)。

TCP 和UDP的区别以及各自的应用场景
总结:

1.TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
2. 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
3.对数据准确性要求高,速度可以相对较慢的,可以选用TCP。