TCP、UDP是什么?它们的区别?

647 阅读8分钟

前言

在了解TCP和UDP之前,我们要知道的是OSI模型。OSI模型将计算机网络体系结构划分为七层,如下图所示。TCP和UDP是属于传输层的协议。

image.png

UDP

UDP协议即用户数据报协议(User Datagram Protocol)。它是一个无连接的传输协议,它为应用程序提供了一种无需连接就可以发送封装的IP数据包的方法。

UDP提供面向事务的简单的不可靠的信息传输服务。UDP不提供数据包分组、组装、不能对数据包进行排序。也就是说,在数据发送之后是无法确认数据是否安全完整地到达。

UDP的特点

1. 面向无连接

UDP不需要像TCP一样在发送数据前先建立连接。不建立连接就不需要维护连接状态,这让它不需要给每一个数据报编号和发送确认号,因此它的延迟更少实时性更好

UDP想发送数据时可以直接开始发送。且它传输数据报时,不会对数据报文进行任何拆分和拼接操作。也就是说发送方的应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP头部标识,然后就向下交付传递给网络层。

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

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

3. 不可靠性

UDP对于差错的控制是不可靠的。

  1. 没有确认机制。每当接收端接收到数据报之后,进行差错校验,不论是都有误都不会给发送端进行反馈,如有错误就丢弃。这样发送端就不知道这个数据段的传输情况。
  2. 不对报文排序。即使数据报的顺序不对,接收端也不会返回错误或重新排序。
  3. 没有反馈机制进行流量控制,没有超市机制,丢包了也不会重发。

4. 报头开销小

UDP的头部只有8字节长,相比于TCP的20字节来说小了很多,结构更简单,提升了数据传输的效率。

TCP

TCP协议的全称是传输控制协议(Transmission Control Protocol)。它是一种面向连接的可靠的、基于字节流的传输层通信协议。TCP充分实现了数据传输时的各种控制功能实现可靠传输,如:可进行丢包重发控制,还可以对次序乱掉的数据包进行顺序控制,还能控制传输流量等。

TCP的特点

1. 可靠传输

TCP的可靠传输,判断丢包、重复靠的是段编号确认号。TCP在发送数据的时候,会为每个字节编号,接收端收到数据,校验无误后,发回确认号,确认号为接收端等待接收的下一个字节的序号。并且TCP会缓存到达的乱序数据,经过统一排序后传递给上层。这样就解决了丢包,重复和乱序的问题。

2. 仅支持单播传输

每次TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播、广播的传输方式。

3. 提供拥堵控制

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

4. 提供全双工通信

TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来存放双向通信的数据。TCP可以立即发送一个数据段,也可以缓存一段时间一遍一次发送更多的数据段。

5. 面向连接

面向连接是指在发送数据之前必须建立连接。建立连接和断开连接就是我们知道的TCP三次握手和四次挥手了。

TCP三次握手

三次握手的过程如下图所示:

image.png

第一次握手: 客户端给服务器发送一个SYN报文,该报文段中包含自身的数据通讯初始序号ISN,此时客户端处于SYN_SEND状态。

第二次握手: 服务器收到SYN报文后,会以自己的SYN报文作为应答,并且也指定了自己的初始化序列号ISN,同时会把客户端的 ISN+1 作为ACK的值发送给客户端,表示自己已经收到了客户端的SYN,此时服务器处于SYN_REVD的状态。

第三次握手: 客户端收到SYN报文后,会回应一个ACK报文,也是一样的把服务器的 ISN+1 作为ACK值,表示已经收到服务端的SYN报文,此时客户端处于established状态,当服务器收到客户端发来的ACK报文之后,服务器也处于established状态。

为什么需要三次握手?两次不行吗?

不行,之所以要三次握手是为了确保可靠传输。

第一次握手时,客户端发送数据包,服务器收到了,这样服务器端得出结论:客户端发送能力、服务器端接受能力正常。

第二次握手时,服务器向客户端发送数据包,客户端收到,客户端得出结论:服务器端发送能力、客户端接受能力正常。

第三次握手时,客户端向服务器端发送数据包,服务器收到,服务器端得出结论:客户端接收能力及发送能力正常,服务器端自己的接收能力及发送能力正常。

如果只是两次握手的话,服务器端没办法确认客户端的发送能力及接收能力是否正常,也没办法确认自己的发送能力是否正常。

TCP四次挥手

image.png 刚开始时,双方都处于established状态,若是客户端先发起断开连接请求,则:

第一次挥手: 客户端向服务器端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT_1状态。

第二次挥手: 服务器端收到FIN报文后,会向客户端发送ACK报文,且把客户端的序列号值+1作为ACK报文的值,表示已经接收到客户端的报文,此时服务器端处于CLOSE_WAIT状态。

第三次挥手: 如果此时服务器也相互断开连接,那么它会和客户端第一次挥手一样,向客户端发送FIN报文,并指定一个序列号,此时服务器端处于LAST_ACK状态。

第四次挥手: 客户端收到服务器端发送过来的FIN后,一样会向服务器端发送一个ACK报文,并把服务器端的序列号值+1作为ACK的值,此时客户端处于TIME_WAIT状态。该状态会持续2MSL(报文最大生命周期,指报文段在网络中生存的时间,超时会被抛弃)时间,若该时间段内没有收到服务器端重发的请求的话,就进入CLOSED状态。而服务器端在接收到客户端发来的ACK报文之后,也关闭连接,处于CLOSED状态。

为什么需要四次,三次不行吗?

不行,如果没有第四次挥手的话,服务器没办法确认客户端是否收到服务器端发送的断开请求。而等待2MSL时间是为了保证若报文丢失时,可以在这个时间段内接收到重发的FIN请求。超过这个时间客户端可以认为在两个传输方向上都没有接受到重发的报文,服务器端已接收到客户端发送的ACK报文并断开连接。

TCP和UDP的比较

1. 对比

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

2. 总结

  • TCP提供面向连接的可靠服务,UDP供无连接不可靠服务。
  • 虽然UDP没有TCP传输来的准确,但是因为传输速度快,能够引用在很多实时性要求高的地方。
  • 对数据准确性要求高,速度可以相对较慢的可以选用TCP。

参考文章:

一文搞懂TCP和UDP的区别

面试官,请不在在问三次握手了