TCP是一种面向连接、可靠的传输方式。
超时重传
TCP层每发送一个数据包,都要设置一个定时器,如果接收方在有效时间内没有返回数据接收的确认ACK,发送方则重新发送这个数据包。
滑动窗口
滑动窗口,主要用于流量控制,避免性能高的主机向性能低的主机短时间传输大量数据,以致撑爆性能低的主机的数据接收缓冲区。
滑动窗口包含几个概念:
- 慢启动,每收到一个数据包的ACK确认后,都会将拥塞窗口的长度加一,直到达到慢启动的窗口阈值,进入拥塞避免阶段。如果中间发生数据包超时重传,则重新开始慢启动阶段。
- 拥塞避免,在此阶段,整个窗口的数据包都返回ACK确认后,才会将拥塞窗口的长度加一。
- 快速重传,一个窗口中连续3个数据包发生超时重传,则认为整个窗口的数据都丢失了,然后将整个窗口的数据都进行重传。
- 快速恢复,在快速重传之后,会将拥塞窗口的长度按一定规则缩小。之后,整个窗口的数据包都返回ACK确认后,将窗口长度加一。此外,收到超时数据包返回的ACK后,也会将拥塞窗口的长度加一。当窗口长度达到阈值时,进入拥塞避免阶段。
TCP三次握手
- 主机A向主机B发送连接请求
- 主机B向主机发送ACK确认
- 主机A建立连接,向主机B发送ACK确认;主机B收到ACK确认,建立连接
为什么要三次握手?
如果网络不会出现阻塞延迟的情况,一次握手就够了:
- 源主机建立连接并向目标主机发送连接请求
- 目标主机收到连接请求后,建立连接
三次握手是为了兜底异常情况。
- 假如一个连接请求因为物理节点繁忙而被阻塞,超时失效之后才被传到目标主机。
- 目标主机会误认为这是源主机发送的新的建立连接的请求,假如只是两次握手,此时目标主机应该建立连接并向源主机返回连接响应。
- 源主机在收到响应后,发现这是过期的连接请求,不做任何事情。此时目标主机将一直连接状态,但又不接收和发送数据,这是一种资源浪费。
而在三次握手中,
- 当连接请求因阻塞而延迟到达目标主机,目标主机并不直接建立连接,而是返回连接确认。
- 源主机收到确认后,发现这是过期的请求,不做任何事情。
- 目标主机因为收不到连接确认,所以也不会建立连接,这样就兜底这种异常情况。
TCP四次挥手
- 主机A在发送完数据后,向主机B发送关闭连接的请求FIN,之后处于半关闭状态,不再发送任何数据,但可以接收数据
- 主机B在接收完数据后,处理关闭连接的请求,返回FIN同意关闭。在此之前,可能也向主机A发送了一些数据;在此之后,也处于半关闭状态,不再发送新的数据。
- 主机A在接收完数据后,并不知道是否所有的数据都已经接收,因为有的数据可能还在路上,因此需要向主机B发送请求(FIN & ACK)来确认是否所有的数据都已经发送完成,同时也是告诉主机B数据已经接收完成了。
- 主机B在收到主机A的ACK确认后,判断数据是否传输完成。如果传输完成,则向主机A返回确认(FIN & ACK),并关闭连接。
- 主机A收到关闭确认,得知数据已经传输完成,于是关闭连接。
TCP四次挥手主要是为了保证连接关闭前的数据能够稳定地进行传输。
为什么要四次挥手?
当然也是为了兜底异常情况,与建立连接时不同,建立连接时还没有数据传输,关闭连接时,之前的数据可能还没有传输完成,需要保证数据稳定地传输。