区别
-
TCP 只能点对点全双工通信。UDP 支持一对一、一对多、多对一和多对多的交互通信
-
连接
-
- TCP 面向连接的协议,握手,挥手,这个连接不是用一条网线或者一个管道把两个通信双方绑在一起,而是建立一条虚拟通信管道。
- UDP 不存在这条连接,所以它也不需要四次挥手操作。
-
可靠性
-
- tcp 可靠
- udp 不可靠
-
有序性
-
- TCP 会对请求分开发送,每次请求所携带的数据都会被目标主机进行确认,目标主机依次确认每个请求后,就会对请求中的数据进行重组,由于请求是由 seq 的,所以 TCP 在重组这些数据时,也会按照顺序进行重组,而 UDP 没有有序性的这种保证。
TCP
什么是TCP
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
- 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
- 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃。
TCP 如何保证可靠性?
重传机制
- 超时重传:超过一定时间没有接收到相应就会重新发送请求
- 快速重传:根据接受的数据判断,发起多个请求,接收到重复的相应,根据数据判断是否需要重传,不过不知道哪部分对方接收不到。
- SACK:这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
流量控制
TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力,根据滑动窗口数据控制发送的数据量。
拥塞控制
定义:避免「发送方」的数据填满整个网络。
-
慢启动:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。
-
避免拥塞算法:每当收到一个 ACK 时,cwnd 增加 1/cwnd。
-
拥塞发生算法:
-
超时重传时:慢启动门限 (ssthresh)变成一半,cwnd变成原始值
-
快速重传时:慢启动门限 (ssthresh)变成一般,cwnd = ssthresh,进入快速恢复算法
-
-
快速恢复算法:快速恢复算法是认为,你还能收到 3 个重复 ACK (快速重传)说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。
三次握手
- 客户端发送请求,随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,syn 值为1 ,客户端处于 SYN-SENT 状态。
- 收到请求,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的**「确认应答号」字段填入 client_isn + 1,** 接着把 SYN (Synchronize 同步)和 ACK(acknowledge) 标志位置为 1。发送报文,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
- 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。
为什么需要三次?
-
三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
-
两次造成混乱,四次没必要的连接
四次挥手
-
客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
-
服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
-
- 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
-
等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
-
客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。也可以变成三次
UDP
- UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。
- UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
QUIC
UDP 本身是个不可靠的协议,现在市面上已经有基于 UDP 协议实现的可靠传输协议的成熟方案了,那就是 QUIC 协议,已经应用在了 HTTP/3。