大家好,我是前端西瓜哥,今天来聊聊 TCP 和 UDP 的区别。
TCP 和 UDP 都是 TCP/IP 协议簇中的比较有代表性的 传输层协议。这里的传输层负责为应用程序提供端对端的通信服务。
TCP,全称 Transmission Control Protocol,中文为传输控制协议,是一种 面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 需要先在端到端进行正式的连接后,才开始传输真正的数据,且有重传等机制保证数据能够可靠地收发。
UDP,全称 User Datagram Protocol,中文为用户数据报协议,它是一种无连接的面向数据报的协议。
TCP 是面向连接的,在发送真正的数据前,需要先建立 TCP 链接,即我们常说的 TCP 三次握手。这时数据就可以在两端之间进行任意方向的传输。如果要断开连接,也要进行 TCP 四次挥手。
关于建立和断开 TCP 连接,具体可以看我的这两篇文章:
UDP 则是无连接的,知道 IP 地址后,直接就将数据发送过去了,也不做数据报文的拆分和拼接。
TCP 是可靠的连接,会给每个 TCP 包设置序号,来确保消息发送的 顺序正确。
接收端接受数据后会返回 ACK 确认,客户端如果一段时间没收到 ACK,会认为数据可能丢包了,就会进行重传,这样就能 确保数据是完整的。
TCP 头部还有一个校验和(checksum)来确定数据是否因为信号突变产生出错,如果出错就丢掉。UDP 也可以使用校验和,不过它是可选的。
UDP 不需要额外建立连接。因为没有重传机制,所以不保证消息能成功地发送给对方。发送端发出 UDP 数据后,数据不会进行备份,因为 UDP 不会重发。
UDP 不保证发送的数据的顺序,基本上是乱序的。
TCP 需要建立连接,并带有校验和重传机制,所以速度会相对较慢。
UDP 很快,因为它是自由的。
广播(broadcast)是指将信息数据包发往指定网络范围内的所有设备。
TCP 不支持广播,只能在固定的两端进行收发。
UDP 支持广播。
TCP 面向字节流的。所谓字节流,就是应用层的一个完整的消息,会被 TCP 拆分和组合,放到 TCP 包里进行发送。
相邻两个数据的边界需要应用层自己来确定。比如 HTTP/1 通过换行来切割头字段,并通过 Content-Length
来确定请求主体的长度,来确定截断边界。
UDP 是面向报文的,不会对应用层完整的消息进行拆分,直接放到 UDP 包里。一个 UDP 就是一个完整的数据。
UDP 的优点是快,不需要做额外的建立连接工作,且减少了额外开销,所以适合实时性强的场景。常见的场景有
TCP 的优点是数据可靠,适合要求质量的场景。绝大多应用软件都使用 HTTP 请求,而 HTTP 是基于 TCP 的。
TCP 可靠,UDP 快,这是它们最大的不同。
我是前端西瓜哥,欢迎关注我,学习更多前端知识。