目录
[toc]
介绍一下 tcp 和 udp
TCP
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
- 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
- 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃。
TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:
TCP 断开连接是通过四次挥手方式。双方都可以主动断开连接,断开连接后主机中的「资源」将被释放,四次挥手的过程如下图:
UDP
UDP 不提供复杂的控制机制,利用 IP 提供面向「无连接」的通信服务。
区别
1. 连接
- TCP 是面向连接的传输层协议,传输数据前先要建立连接。
- UDP 是不需要连接,即刻传输数据。
2. 服务对象
- TCP 是一对一的两点服务,即一条连接只有两个端点。
- UDP 支持一对一、一对多、多对多的交互通信
3. 可靠性
- TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
- UDP 是尽最大努力交付,不保证可靠交付数据。但是我们可以基于 UDP 传输协议实现一个可靠的传输协议,比如 QUIC 协议,具体可以参见这篇文章:如何基于 UDP 协议实现可靠传输?(opens new window)
4. 拥塞控制、流量控制
- TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
- UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
5. 首部开销
- TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是
20
个字节,如果使用了「选项」字段则会变长的。 - UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
6. 传输方式
- TCP 是流式传输,没有边界,但保证顺序和可靠。
- UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
7. 分片不同
- TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
- UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层。
详细描述三次握手和四次挥手
三次握手能不能两次,为什么
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。
为什么握手是三次,挥手是四次
服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK
和 FIN
一般都会分开发送,因此是需要四次挥手。
四次挥手中 timeWait 的作用,实际时长是多少
tcp 的粘包拆包
tcp 保证可靠传输的各项措施,以及这些措施各自的作用
TCP (Transmission Control Protocol) 采用多种机制来保证可靠传输,这些机制包括以下几个方面:
- 序列号和确认应答机制:TCP 通过对每个数据包的序列号进行标记,并对接收方的每个数据包进行确认应答,以确保数据在传输过程中不会丢失或损坏。
- 滑动窗口机制:TCP 使用滑动窗口机制来控制发送方和接收方的传输速率。发送方根据接收方返回的确认应答来调整发送速率,以避免发送过多数据导致网络拥塞。同时,接收方也会根据自身的处理能力来调整接收速率,以避免数据丢失或堆积。
- 重传机制:TCP 通过在一定时间内未收到确认应答时,自动重传该数据包来保证数据传输的可靠性。
- 拥塞控制机制:TCP 通过监测网络拥塞情况,并在发现拥塞时自动调整传输速率,以避免网络拥塞导致数据丢失或传输延迟增加。
- 流量控制机制:TCP 通过对发送方和接收方的传输速率进行控制,以确保数据在传输过程中不会丢失或堆积。
这些措施的作用是确保 TCP 协议在数据传输过程中能够保证数据的可靠性、完整性和顺序性,同时避免网络拥塞和数据堆积导致的传输延迟增加。这些机制的应用可以使得 TCP 协议能够在不可靠的网络环境下进行数据传输,并保证数据的完整性和正确性。
tcp 流量控制, 拥塞控制, 滑动窗口, 确认号
滑动窗口
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。 窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
流量控制
TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
拥塞控制
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大… 所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。 于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。 TCP 拥塞控制是一种网络流量控制机制,用于避免网络拥塞和数据包丢失,以保证数据的可靠传输。当网络拥塞时,TCP 通过减少传输速率以及重传丢失的数据包来缓解网络拥塞,从而避免数据包的丢失和网络拥塞的加剧。 TCP 拥塞控制的主要机制包括:
- 慢启动:在建立连接和发生拥塞时,TCP 会以指数级别增加发送窗口的大小,以快速探测可用带宽。发送方会先发送一定数量的数据包,然后每收到一个确认应答,就将发送窗口的大小加倍,直到达到一个阈值。
- 拥塞避免:一旦发送方确定了可用带宽,TCP 就会进入拥塞避免状态,减缓发送速度,防止网络拥塞。此时,TCP 会以线性增加发送窗口的方式逐渐增加发送速度。
- 快速重传和快速恢复:如果 TCP 检测到有数据包丢失,它会使用快速重传机制立即重传缺失的数据包,并在接收到重传数据包时启用快速恢复机制,以避免发送窗口大小回退到慢启动状态。
- 超时重传:如果 TCP 在一段时间内没有收到确认应答,就会将该数据包视为丢失并进行超时重传。
总之,TCP 拥塞控制通过一系列机制来避免网络拥塞和数据包丢失,以保证网络传输的可靠性和效率。
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量