TCP和UDP是两种不同的传输层协议,用于在计算机网络中传输数据,下面详解4大TCP和UDP的区别@mikechen
连接性的区别
TCP
TCP是面向连接的协议,它在数据传输之前建立了一个双向连接,这个连接包括握手过程,确保了数据的可靠传输。
TCP 建立连接需要经过三次握手,同时 TCP 断开连接需要经过四次挥手,这也表示 TCP 是一种面向连接的协议。
TCP 的三次握手流程,如下图所示:
第一次握手 :客户端发送SYN
客户端首先向服务器发送一个TCP报文段,其中包含一个SYN(同步)标志位,以请求建立连接。
客户端选择一个随机的初始序列号(ISN),该序列号用于标识数据包的顺序,以及后续数据包的可靠性传输。
第二次握手 :服务器发送SYN-ACK
服务器收到客户端的SYN报文后,知道客户端希望建立连接,于是生成一个新的序列号用于回复。
服务器向客户端发送一个TCP报文段,其中包含SYN和ACK(确认)标志位,表示接受客户端的连接请求,并将自己的序列号和确认号设定为自己的ISN加一。
服务器还分配缓冲区等资源以准备接收来自客户端的数据。
第三次握手 : 客户端发送ACK
客户端收到服务器的SYN-ACK报文后,确认了服务器的连接请求。
客户端向服务器发送一个TCP报文段,其中包含一个ACK标志位,表示接受了服务器的响应。
客户端的确认号设定为服务器的ISN加一,表明它准备好发送数据。
此时,连接已建立,双方可以开始安全地交换数据。
而 UDP 是面向数据报的协议,所以 UDP 压根不会有连接的概念,也就不会有三次握手建立连接的过程。
所以,每个UDP数据包都是独立的,不与其他数据包相关联。
因此,UDP通常比TCP更快,但不保证数据的可靠性。
可靠性的区别
TCP提供可靠的数据传输,它使用序列号、确认和重传机制来确保数据的完整性和可靠性。
如下图所示:
TCP 就是通过 ACK 来实现可靠的数据传输。
也就是说,发送方在发出请求之后会等待目标主机的响应,如果没有收到响应,发送方在经过一段时间后就会重传请求。
所以,即使在发送过程中产生丢包,TCP 仍然能够通过重传来实现可靠性。
而UDP不提供可靠性保障,数据包可能会丢失、乱序或重复。
这使得UDP适用于一些实时应用,如音频和视频流,因为它更快,但不适合对数据完整性有严格要求的应用。
报文段的区别
UDP报头相对较小,只包含源端口、目标端口、数据长度和校验和字段。
UDP 报文段结构,如下图所示:

- 源端口号(Source Port) :这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。
- 目标端口号(Destination Port): 表示接收端端口,字段长为 16 位。
- 长度(Length): 该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。
- 校验和(Checksum):UDP 的校验和也提供了差错检测功能,差错检测用于校验报文段从源到目标主机的过程中,数据的完整性是否发生了改变。
TCP报头相对较大,包含了大量控制信息,如序列号、确认号、窗口大小、选项等。
TCP 报文段结构,如下图所示:

TCP 报文段结构相比 UDP 报文结构多了很多内容:
- TCP 相比 UDP 多了许多 Flags;
- 序号;
- 确认号等
这些都属于 TCP 的连接控制,除此之外还有接收窗口,这些属于拥塞控制和流量控制的内容。
所以,TCP报头相对较大,包含了大量控制信息,这增加了每个TCP报文段的开销。
UDP报头相对较小,只包含源端口、目标端口、数据长度和校验和字段,这使得UDP报文段开销较小,适用于传输小量数据或实时通信。
使用场景的区别
TCP通常用于需要可靠数据传输、数据完整性和数据顺序性的应用。
比如:网页浏览、电子邮件、文件传输和数据库交互等。
UDP通常用于实时应用,比如:音频和视频流、在线游戏、VoIP通话以及广播通信等,其中速度和实时性更为重要。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》