大家好,我是香香。
昨天讲了 HTTP 和 HTTPS 之间的区别。
同时简单介绍了 TCP:可靠的、面向连接的数据传输服务。
那么它(TCP)究竟是如何保证自己 可靠传输 的呢?
在搞明白这个之前。
我们要先知道它是如何 建立稳定连接 的。
我们来详细讲解一下 TCP 连接中的 三次握手 和 四次挥手 过程。
这是建立和关闭 TCP 连接的关键步骤,保证了数据的可靠传输。
在客户端和服务器之间建立 TCP 连接时,会进行三次握手的过程。
三次握手是在建立连接时的一个过程,目的是确保双方都能够正常通信。
它涉及到客户端和服务器之间的互动,用于同步双方的初始序列号和确认连接的请求。
让我们看一下具体的步骤:
第一步:客户端发送同步序列号(SYN)
客户端首先向服务器发送一个带有 SYN 标志的数据包,其中包含一个初始序列号(ISN),用于标识数据段的起始序号。
这表明客户端请求建立连接,并且客户端进入 SYN_SENT 状态 (表示客户端已经发送了连接请求,正在等待服务器端的响应)。
第二步:服务器确认(ACK+SYN)
服务器接收到客户端的 SYN 后,如果同意建立连接,就会发送一个 ACK 确认号,确认号码为客户端的 ISN 加一。
同时,服务器也会发送自己的 SYN,表示自己也想建立连接。
这时服务器进入 SYN_RCVD 状态(表示服务器端已经收到了客户端的连接请求,并且也发送了自己的确认,正在等待客户端的最终确认以完成连接的建立)。
第三步:客户端确认(ACK)
客户端收到服务器的响应后,会发送一个确认号(ACK),确认号码为服务器的 ISN 加一。
此时,TCP 连接已经建立,客户端和服务器可以开始传输数据。
客户端进入 ESTABLISHED 状态,而服务器在接收到最后一个 ACK 之后也进入 ESTABLISHED 状态(它表示TCP连接已经建立成功,双方可以开始进行数据传输和通信)。
当客户端或服务器想要关闭 TCP 连接时,会进行四次挥手的过程。
下面是具体的步骤:
第一步:客户端发送关闭请求(FIN)
当客户端想要关闭连接时,会发送一个带有 FIN 标志的数据包,表示客户端不再发送数据,但仍可以接收数据。
这时客户端进入 FIN_WAIT_1 状态(表示客户端已经发送了连接释放请求(FIN),正在等待服务器端的确认或拒绝)。
第二步:服务器确认收到关闭请求(ACK)
服务器收到客户端的 FIN 后,会发送一个确认号(ACK),表示已经收到关闭请求。
服务器进入 CLOSE_WAIT 状态(表示服务器端已经收到客户端发送的连接释放请求并发送了确认,但是该连接在等待关闭,因为服务器端还有数据需要发送给客户端);
而客户端在收到确认后进入 FIN_WAIT_2 状态(表示客户端已经收到了服务器端发送的带有 FIN 标志的数据包,表示连接释放的最后一步,但是客户端还没有发送带有 ACK 标志的数据包作为确认)。
第三步:服务器发送关闭请求(FIN)
当服务器也准备关闭连接时,它会发送一个带有 FIN 标志的数据包给客户端,表示服务器不再发送数据。
服务器进入 LAST_ACK 状态(表示服务器端已经发送了连接释放请求(FIN),并等待客户端发送确认的 ACK 数据包)。
第四步:客户端确认收到关闭请求(ACK)
客户端收到服务器的 FIN 后,会发送一个确认号(ACK),表示已经收到关闭请求。
此时,客户端进入 TIME_WAIT 状态(表示连接已经关闭,但仍然保持一段时间,以处理延迟或重复数据包,并确保连接的完全关闭),等待 2MSL(通常为 30 秒到 2 分钟之间)后释放连接;
而服务器在接收到最后一个 ACK 后进入 CLOSED 状态(TCP 连接的最终状态,表示连接已经完全关闭,并且不再使用)。
通过三次握手和四次挥手的过程,TCP 连接得以建立和关闭。
这确保了数据在客户端和服务器之间的可靠传输。
(这个时候有的小伙伴可能就会疑惑了?)
:那建立连接也建立了,它的可靠传输是怎么做到的?
TCP 通过以下几个机制来 保证可靠传输:
1. 确认和重传机制:
TCP 使用确认和重传机制来确保数据的可靠传输。
每当发送方发送数据段时,接收方会确认已经成功接收到数据段,并返回一个确认号。
如果发送方在一定时间内没有收到确认,它会认为数据丢失或损坏,并重新发送数据段。
2. 序列号和窗口机制:
TCP 使用序列号和窗口机制来对数据进行分割和排序。
发送方给每个数据段分配一个序列号,接收方根据序列号将数据段按正确的顺序组装起来。
同时,TCP 还使用滑动窗口机制来控制发送和接收数据的流量,以提高传输效率。
3. 流量控制:
TCP 使用流量控制机制来防止发送方发送速度过快导致接收方无法及时处理数据。
接收方通过发送窗口大小告知发送方自己的接收能力,发送方根据接收方的窗口大小调整发送速率,以确保数据的可靠传输。
4. 拥塞控制:
TCP 使用拥塞控制机制来避免网络拥塞。
当网络出现拥塞时,TCP 会减少发送速率,防止拥塞进一步恶化。
拥塞控制算法包括慢启动、拥塞避免和快重传等策略,它们通过监测网络的拥塞状况和动态调整发送速率来实现可靠传输。
通过以上这些机制,TCP 能够保证数据的可靠传输,确保数据在发送方和接收方之间按正确的顺序到达,并且能够适应不同网络环境下的变化,从而提供可靠的面向连接的数据传输服务。
总结:
实际上,三次握手是 TCP 建立连接的一部分,而上面提到的确认和重传机制、序列号和窗口机制、流量控制以及拥塞控制等机制是 TCP 实现可靠传输的方式。
而确认和重传机制、序列号和窗口机制、流量控制以及拥塞控制等机制则是在连接建立后,用于保证数据能够可靠地传输。
它们是 TCP 协议中的一些机制或算法,通过不断地检测和调整发送和接收数据的方式,确保数据的完整性、有序性和可靠性。
简单来说,三次握手是连接建立的过程,而后面提到的机制是在连接建立后用于保证数据的可靠传输。
三次握手只发生一次,而后面的机制在整个连接的生命周期中持续起作用。