TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。
1 它通过以下几种方法来保证数据传输的可靠性:
- 检验和:TCP 在发送和接收数据时,都会计算一个检验和,用来检测数据是否在传输过程中发生了错误或损坏。如果检验和不匹配,说明数据有误,TCP 会请求重传。
- 序列号和确认应答:TCP 会给每个发送的数据段分配一个序列号,用来标识数据的顺序和完整性。接收方收到数据后,会发送一个确认应答报文,告诉发送方已经收到了哪些数据,以及期待收到下一个序列号的数据。如果发送方没有收到确认应答,或者收到了重复的确认应答,说明数据丢失或延迟了,TCP 会进行重传。
- 超时重传:TCP 会设置一个超时时间,如果在超时时间内没有收到确认应答,就认为数据丢失了,需要重传。超时时间的设置需要根据网络的状况动态调整,一般是根据往返时延(RTT)和其波动范围(DevRTT)来计算的。
- 快速重传:TCP 还有一种快速重传的机制,它不是以时间为驱动,而是以数据为驱动。当发送方连续收到三个相同的确认应答时,就认为数据丢失了,不等待超时时间就立即重传。
- 选择性确认:TCP 还可以使用选择性确认(SACK)的方法,让接收方告诉发送方哪些数据已经收到了,哪些数据还没有收到。这样发送方就可以只重传丢失的数据,而不是整个窗口的数据。
2 TCP 协议的流量控制是通过窗口机制实现的。
每个 TCP 连接都有一个发送窗口和一个接收窗口,它们控制着数据的流动。
发送窗口:
发送方通过发送窗口的大小告诉接收方自己还可以发送多少数据。发送窗口的大小由接收方动态调整,取决于接收方的可用缓存空间和网络状况。
接收窗口:
接收方通过接收窗口的大小告诉发送方自己还能接收多少数据。接收窗口的大小由接收方根据自己的处理能力和缓存空间来设置。
当发送方收到接收方的窗口通告时,就会根据接收窗口的大小来调整自己的发送窗口,从而控制自己的发送速率,使得接收方能够及时处理数据,避免数据丢失或拥塞。
如果接收方的缓存空间不足,它会把接收窗口设置为 0,通知发送方停止发送数据。这时,发送方会启动一个持续计时器,每隔一段时间就向接收方发送一个探测报文,询问接收方的窗口大小。如果接收方回复了非零的窗口大小,说明它已经有足够的空间来接收数据了,那么发送方就会恢复数据的传输。
除了上述方法外,TCP 还使用了窗口控制、流量控制和拥塞控制等机制来调节发送和接收的速率,避免网络过载或拥塞。
(1) TCP的可靠性传输是如何保证的 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/112317245.
(2) 图解 TCP 重传、滑动窗口、流量控制、拥塞控制 - 知乎. https://zhuanlan.zhihu.com/p/135932018.
(3) TCP 协议是如何保证数据传输的可靠性的? - 知乎. https://www.zhihu.com/question/592951058.
(5) TCP如何保证可靠传输?TCP怎么保证可靠性?最详细的总结_tcp 传输如何保证传输顺序_OpenSani的博客-CSDN博客. https://blog.csdn.net/sansipi/article/details/121459589.
(1) TCP流量控制、拥塞控制 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/37379780.
(2) 通俗易懂讲解TCP流量控制机制,了解一下 - 帅地 - 博客园. https://www.cnblogs.com/kubidemanong/p/9987810.html.
(3) 深入理解TCP:解答这10个关键问题 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/623956721.
(6) 计算机网络基础(十八)---传输层-TCP的流量控制 - 知乎. https://zhuanlan.zhihu.com/p/182436506.
(7) 详解TCP协议(四)——传输中的流量控制 - CSDN博客. https://blog.csdn.net/shang_0122/article/details/104517762.
TCP的10个问题
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠的传输层协议,它提供了数据传输的可靠性,保证了数据传输的有序性和完整性。
具有一下特点:
- 可靠性:TCP保证数据传输的可靠性,确保数据能够准确地到达接收方,并且能够按照发送方发送的顺序进行重组。
- 面向连接:TCP在传输数据前需要先建立连接,数据传输完毕后再断开连接,这种方式可以保证数据的可靠性。
- 面向字节流:TCP把传输的数据看成一个连续的字节流,而不是数据块,这样能够更好地控制传输过程。
- 拥塞控制:TCP能够根据网络拥塞的程度来调整发送速率,防止网络拥塞而导致数据丢失或延迟。
- 全双工通信:TCP允许发送方和接收方同时进行数据传输,这样可以提高数据传输的效率。
TCP连接为什么需要三次握手?
TCP连接建立需要三次握手的原因是确保双方都认可对方的初始序列号并且建立起可靠的通信信道。具体来说,三次握手的步骤如下:
- 客户端发送SYN包给服务器,表示客户端请求建立连接,并随机生成一个初始序列号seq。此时客户端处于SYN_SEND状态。
- 服务器收到SYN包后,回复ACK包和SYN包给客户端,ACK包确认收到客户端的SYN包,SYN包表示服务器同意建立连接,并且服务器也随机生成一个初始序列号seq+1。此时服务器处于SYN_RECEIVED状态。
- 客户端收到服务器的ACK包和SYN包后,回复ACK包给服务器,ACK包确认收到服务器的SYN包,此时客户端和服务器均建立起了连接,并可以进行数据传输。此时客户端处于ESTABLISHED状态。
三次握手的过程中,客户端和服务器都可以确保对方认可了自己的初始序列号,并建立起了可靠的连接。同时,三次握手也可以防止因为延迟的ACK导致的错误连接,以及防止因为旧的连接请求信息重复发送而导致的错误连接。因此,TCP连接建立需要三次握手来确保连接的可靠性。
TCP协议如何保证可靠性?
TCP协议通过序列号和确认应答、超时重传、流量控制和拥塞控制等机制来保证传输的可靠性。
- 序列号和确认应答:每个TCP报文段都包含一个序列号,用于指示发送方发送的数据的字节流中的位置。接收方收到TCP报文段后会发送确认应答,告诉发送方收到了哪个序列号之前的数据。如果发送方没有收到确认应答,它就会重传这些数据。
- 超时重传:如果发送方没有在一定时间内收到确认应答,就会认为数据包丢失了,并且会重新发送这些数据。
- 流量控制:接收方可以通过TCP窗口大小来告诉发送方可以发送多少数据。这个窗口大小会根据接收方的可用缓冲区大小动态调整,以防止接收方的缓冲区溢出。
- 拥塞控制:TCP使用拥塞窗口来控制网络中的拥塞程度。如果网络拥塞,发送方会降低拥塞窗口的大小,以减少发送的数据量,从而减轻网络拥塞。
TCP连接如何保持活跃状态?
TCP连接的保持活跃状态通常有两种方式:
- TCP keepalive机制:TCP keepalive机制是一种保持TCP连接状态的方法。当一段时间内没有数据传输时,TCP keepalive会向对端发送一个探测包。如果对端收到了探测包,则会回复一个确认包,证明连接仍然存在。如果对端没有回复,则会在一定时间内重试探测,若重试多次后仍然没有回复,则会认为连接已经断开。TCP keepalive的默认设置是2小时。
- 应用层心跳包:应用层心跳包是一种应用层协议,用于保持TCP连接状态。应用层心跳包是由应用程序发送的一个小的数据包,用于告诉对端连接仍然存在。一般情况下,应用层心跳包的发送频率会比TCP keepalive要高一些,可以根据具体的业务需求进行调整。
这两种方式都可以保持TCP连接状态,但是TCP keepalive机制是在TCP协议层面实现的,而应用层心跳包则需要应用程序自己实现。
什么是TCP窗口大小?
TCP窗口大小指的是接收端主机可以接收的数据量大小。在TCP连接建立时,双方会交换窗口大小信息,以便发送方发送适合接收方的数据量,防止发送方发送过多的数据导致接收方无法及时处理而丢失数据或出现阻塞。
TCP窗口大小的单位是字节(byte),通常是由接收端主机来设置和控制。接收端主机通过设置窗口大小来告诉发送端主机,自己可以接收多少数据,发送端主机在发送数据时就不会超过这个窗口大小,以确保数据能够被接收端主机及时处理和接收。
TCP窗口大小的优化可以通过调整系统参数、硬件优化以及网络拓扑结构等方式来实现,从而提高TCP连接的传输效率和稳定性。
TCP协议的流量控制是如何实现的?
TCP协议的流量控制是通过窗口机制实现的。每个TCP连接都会有一个发送窗口和一个接收窗口,它们控制着数据的流动。
发送窗口:发送方通过发送窗口的大小告诉接收方自己还可以发送多少数据。发送窗口的大小由接收方动态调整,取决于接收方的可用缓存空间和网络状况。
接收窗口:接收方通过接收窗口的大小告诉发送方自己还能接收多少数据。接收窗口的大小由发送方动态调整,取决于发送方的发送速率和网络状况。
通过这种窗口机制,TCP协议可以在不丢失数据的前提下控制数据的流动速度,防止发送方发送过多数据导致接收方无法及时处理,从而实现流量控制。
TCP拥塞控制的机制是什么?
TCP拥塞控制是一种控制网络拥塞的机制,它通过调整发送方的数据发送速率和接收方的数据接收速率来避免网络拥塞和网络崩溃。TCP拥塞控制的主要机制有以下几个:
- 慢启动:在开始时,TCP发送方会以指数级别递增数据的发送速率,直到达到网络的最大容量。
- 拥塞避免:一旦发送方确定了网络的最大容量,就会以线性增长的方式逐步增加数据的发送速率,直到出现拥塞。
- 快重传:当TCP发送方接收到一个重复的ACK(确认),表示有些数据已经到达接收方,它将立即重新发送最近发送的没有确认的数据段,而不是等待超时重传计时器超时。
- 快恢复:在接收到重复的ACK时,TCP发送方会减少数据发送速率,并立即发送已经确认的但还未发送的数据,以便更快地恢复数据的发送速率。
- 拥塞超时:如果发送方没有在指定时间内收到ACK确认,则假定数据包已经丢失并重传数据,同时将数据发送速率减半。
这些机制组合起来,可以有效地控制TCP连接的数据发送速率,从而避免网络拥塞和崩溃。
如何实现TCP多路复用?
TCP多路复用指的是在一个TCP连接中同时发送和接收多个数据流,它可以显著提高网络通信的效率和吞吐量。
在TCP多路复用中,可以使用以下两种方式来实现:
- 使用多线程或多进程:每个线程或进程处理一个数据流,通过对不同的数据流进行处理,从而实现多路复用。
- 使用select、poll或epoll等I/O多路复用机制:在使用这种机制的时候,应用程序只需要在一个进程中创建一个TCP连接,然后使用I/O多路复用机制来同时监听多个数据流的I/O事件,从而达到多路复用的效果。
使用I/O多路复用机制的方式可以更好地利用系统资源,避免了多线程或多进程的上下文切换开销,同时也减少了代码的复杂性。因此,在实现TCP多路复用时,建议使用I/O多路复用机制来实现。
TCP传输中出现超时或延迟,如何处理?
TCP传输中出现超时或延迟,可以通过以下方式进行处理:
- 调整超时时间:TCP协议中有一个超时重传机制,当数据包发送后一定时间内没有收到ACK确认,就会进行重传。可以通过调整超时时间来优化网络延迟,比如减小超时时间可以使数据包更快地被重传,加快数据传输速度。
- 使用快速重传:快速重传是指当发送方连续接收到3个重复的ACK确认时,就可以认为数据包已经丢失,立即进行重传,而不必等待超时重传。这可以减小重传的延迟时间,提高数据传输速度。
- 增加拥塞窗口:当网络拥塞时,可以通过增加拥塞窗口来提高网络吞吐量。拥塞窗口是指在一个RTT(Round Trip Time,往返时间)内允许发送的数据量,可以根据网络拥塞程度动态调整。
- 检查网络链路:有时超时和延迟是由网络链路问题导致的,可以通过检查网络链路状态,排查故障并解决问题。
- 使用更快速的传输协议:如果TCP协议无法满足需求,可以考虑使用更快速的传输协议,如UDP或QUIC。这些协议不仅可以提供更快的传输速度,还具有更好的适应性和鲁棒性,能够适应不同的网络环境和传输需求。
什么是TCP协议中的TIME_WAIT状态?它的作用是什么?
TCP协议中的TIME_WAIT状态指的是TCP连接关闭后,等待2倍的MSL时间(Maximum Segment Lifetime,最大分段生存时间)后才会关闭的状态。
MSL是指一个TCP分段在网络中最长的生存时间,通常为2分钟。
TIME_WAIT状态的作用是确保网络中所有的分段都已经被接收并且被正确处理。
在TCP连接关闭后,可能还会有一些未到达的分段存在于网络中,这些分段可能会在关闭连接之后到达,如果不等待这些分段到达并被正确处理,可能会导致后续的连接出现问题,因此TCP协议会通过TIME_WAIT状态来等待这些分段的到达和处理。
此外,TIME_WAIT状态还可以防止旧的连接请求被误认为是新连接的请求,从而确保连接的安全性和可靠性。
如何在Linux系统中查看TCP连接状态?
在 Linux 系统中,可以使用netstat
或ss
命令查看 TCP 连接状态。
- 使用
netstat
命令:
perlCopy code netstat -ant | grep ESTABLISHED
该命令可以列出所有已建立的 TCP 连接,其中
-a
选项表示显示所有连接,包括已建立、正在等待和已经关闭的连接;
-n
选项表示以数字形式显示 IP 地址和端口号;
-t
选项表示只显示 TCP 连接;
grep ESTABLISHED
表示只显示已建立的连接。
- 使用
ss
命令:
perlCopy code ss -ant | grep ESTAB
该命令与netstat
类似,其中
-a
选项表示显示所有连接,包括已建立、正在等待和已经关闭的连接;
-n
选项表示以数字形式显示 IP 地址和端口号;
-t
选项表示只显示 TCP 连接;
grep ESTAB
表示只显示已建立的连接。
另外,还可以使用tcpdump
命令捕获和分析 TCP 数据包,以进一步了解 TCP 连接状态和传输情况。