tcp和udp概念和区别

题图来自Unsplash,基于CC0协议
导读
在计算机网络中,传输层提供了端到端的通信服务,其中最核心的两种协议是TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。它们就像网络世界中的两种不同信使,负责将应用程序的数据从一台主机可靠地(TCP)或不可靠但快速地(UDP)发送到另一台主机。
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在数据传输之前,发送方和接收方之间需要先建立一个连接(使用三次握手过程)。这个连接会保持整个通信过程,并在应用层数据发送前进行分段,并为每个字节赋予一个序列号。接收方收到数据段后会进行确认(ACK),如果发送方没有收到确认,它会重新发送未被确认的数据段,确保数据完整无误地按顺序到达。此外,TCP还提供流量控制和拥塞控制机制,以避免网络过载,并且通过校验机制来检测数据在传输过程中可能发生的错误。TCP通常用于要求高可靠性的场景,如网页浏览(HTTP/HTTPS)、文件传输(FTP、SFTP)、电子邮件(SMTP、POP3、IMAP)、远程登录(SSH、Telnet)等。
相比之下,UDP则是无连接的、不可靠的、基于数据报的传输层协议。它不会在发送数据之前建立连接,也不保证数据包的顺序到达、完整性或不重复。发送方会把应用层的数据包装成一个UDP数据报,加上源端口、目的端口、长度和校验和(可选)字段后直接发送出去。由于没有确认机制,发送方不会知道接收方是否成功收到了数据。接收方收到的UDP数据报可能会丢失、重复、乱序或者损坏。不过,由于其头部长、逻辑简单、无需建立连接等特点,UDP的开销小、延迟低,非常适合那些对实时性要求高、能够容忍少量数据丢失的应用场景。典型的UDP应用包括域名系统(DNS查询)、动态主机配置协议(DHCP)、网络时间协议(NTP)、简单的网络浏览(比如TFTP)、流媒体传输(RTP)、在线游戏和VoIP/视频通话中的音视频流传输等。
总结一下TCP和UDP的主要区别:
-
连接性:
- TCP:面向连接,在传输数据前需要建立连接。
- UDP:无连接,发送数据报前无需建立连接。
-
可靠性:
- TCP:提供可靠的数据传输,通过序列号、确认、重传来保证数据正确、完整、有序到达。
- UDP:不提供可靠传输机制,数据包可能丢失、损坏或乱序。
-
顺序性:
- TCP:保证数据按发送顺序到达。
- UDP:不保证数据按发送顺序到达,可能乱序。
-
流量/拥塞控制:
- TCP:提供流量控制和拥塞控制,防止网络拥塞。
- UDP:没有自带的流量和拥塞控制机制。
-
开销:
- TCP:开销大(头部信息更多,交互复杂,连接建立/拆除),延迟相对较高。
- UDP:开销小(头部信息少,逻辑简单),延迟极低。
-
应用场景:
- TCP:适用于对数据传输可靠性要求高的场景。
- UDP:适用于对实时性要求高、能容忍少量数据丢失的场景。
TCP的连接建立涉及三次握手:
- SYN:客户端发送一个SYN报文给服务器,表示请求建立连接。
- SYN-ACK:服务器收到SYN后,如果同意连接,则会发送一个SYN-ACK报文。这个报文包含了服务器期望接收的序列号。
- ACK:客户端收到SYN-ACK报文后,会发送一个ACK报文确认连接建立。
连接终止则需要四次挥手:
- FIN:主动关闭方发送一个FIN报文,表示它已经发送完了所有数据,不会再发送。
- ACK:被动关闭方收到FIN报文后,会发送一个ACK作为响应。此时连接进入“半关闭”状态,被动关闭方可继续发送数据。
- FIN:被动关闭方在发送完所有剩余数据后,也发送一个FIN报文。
- ACK:主动关闭方收到这个FIN报文后,最后发送一个ACK报文,连接才完全关闭,双方进入CLOSED状态。
至于UDP是否可靠:UDP协议本身设计上是不可靠的,它不保证数据报的到达、不处理丢失、不进行排序、不进行重复检测。应用层如果需要一定的可靠行,必须在自身的程序逻辑里实现,例如通过设置序列号、确认机制、请求-响应模式(发送一条带序列号的消息,并要求接收方发送确认)或者定义合理的超时和重传策略。另外,可以在UDP头部(源码中通常可以选择是否计算校验和)或数据报数据部分添加校验和字段来检测数据在传输中是否被篡改或损坏,但这并不能保证数据最终送达。可以说,通过应用层的精心设计,可以在一定程度上提高基于UDP的协议的可靠性,但它绝不是像TCP那样内建了端到端可靠传输机制。
© 版权声明
本文由盾科技原创,版权归 盾科技所有,未经允许禁止任何形式的转载。转载请联系candieraddenipc92@gmail.com