TCP 确认应答/超时重传机制

本文深入解析TCP协议如何实现可靠传输,通过确认应答机制(ACK)和超时重传机制确保数据完整无误地到达接收方。文章详细解释了序列号的作用,以及在网络复杂环境下如何动态调整超时时间,防止数据丢失。

我们知道TCP协议是传输层协议,它是可靠传输,有连接的传输协议。那么它是依靠什么才能有这个功能的呢?

确认应答机制(ACK)
这里写图片描述

TCP将每个字节的数据都进行了编号,即为序列号:
这里写图片描述

每一个ACK都带有对应的确认序列号,意思是告诉发送者,我们已经收到了哪些数据,下一吃发送数据应该从哪里开始。
如上图,主机A给主机B发送了1-1000的数据,ACK应答,携带了1001序列号。告诉主机A,我已经接受到了1-1000数据,下一次你从1001开始发送数据。


TCP 在传输数据过程中,还加入了超时重传机制:
在传输数据过程中:
1.主机A发送数据给主机B,主机B没有收到数据包,丢包了
2.如果主机A在一个特定时间间隔内没有收到主机B发来的确认应答,就会进行重发
这里写图片描述

也有这种可能:
主机B收到了数据包,它发送ACK确认包时,主机A未能接收到,丢包了。

这里写图片描述

这时,主机A认为主机B没有接收到数据包。则会发生重传。数据包1 - 1000 数据包再发送一次。

从上面中,看的出,主机A发送重传,主机B有可能收到几份重复的数据包。那么TCP协议需要识别出那些包是重复的包,并且把重复的包丢弃掉。这就需要我们利用上面提到的序列号,就可以去重。

在复杂的网络环境中,我们的超时时间如何确定?
1.找到一个最小的时间,保证“确认应答一定能在这个时间内返回”
2.这个时间的长短,随着网络环境的不同,有差异
3.超时时间设的太长,会影响整体的重传效率
4.超时时间设的太短,有可能会频繁发送重复的包

ps:TCP动态计算这个最大超时时间
超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。如果重发一次之后,得不到应答,等待2*500ms后再进行重传。如果任然等不到应答,等待4*500ms进行重传,以指数形式递增。累积到一定的重传次数,TCP认为网络或者对端主机出现异常,强制断开连接。

### 序列号与确认应答机制 序列号为每个传输的字节分配一个唯一编号,接收方根据序列号对数据包进行排序,将有序数据传送给应用层。同时,接收方会向发送发送确认应答(ACK),告知发送方哪些数据已成功接收。若发送收到某个数据包的确认应答,则认为该数据包丢失,会进行重传。这种机制确保了数据的有序性和完整性,避免了数据的丢失和乱序[^1]。 ### 超时重传机制TCP发送一个数据包后,会启动一个定时器。如果在定时器超时之前没有收到该数据包的确认应答TCP会认为该数据包丢失,从而重新发送该数据包。超时时间的设置很关键,需要根据网络状况动态调整,以平衡重传的及时性和避免不必要的重传超时重传机制是应对网络丢包的重要手段,保证了数据在丢失情况下也能可靠传输[^1]。 ### 滑动窗口机制 滑动窗口是一种流量控制技术,它允许发送方在收到确认应答的情况下连续发送多个数据包。窗口大小表示发送方可以连续发送确认数据包的最大数量。发送方根据接收方返回的窗口大小信息,动态调整自己的发送窗口。接收方通过调整窗口大小,可以控制发送方的发送速率,避免接收方缓冲区溢出。滑动窗口机制提高了数据传输的效率,同时也实现了流量控制[^1]。 ### 面向连接的通信 TCP传输数据之前,需要通过三次握手连接,确保双方都具备发送和接收数据的能力,并且同步了初始序列号。在数据传输结束后,通过四次挥手关闭连接,保证数据的完整传输。面向连接的通信方式使得数据传输在一个可靠的通道中进行,为数据的可靠传输提供了基础保障[^1]。 ### 流量控制 流量控制通过滑动窗口机制实现,接收方根据自己的缓冲区大小,动态调整发送方的发送窗口大小。当接收方缓冲区接近满时,会减小窗口大小,通知发送方降低发送速率;当接收方处理完部分数据,缓冲区有空闲时,会增大窗口大小,允许发送方加快发送速率。流量控制避免了接收方因处理能力不足而导致的数据丢失,保证了数据传输的稳定性[^1]。 ### 拥塞控制 拥塞控制是为了避免网络出现拥塞而采取的措施。TCP通过拥塞窗口来控制发送方的发送速率,根据网络的拥塞状况动态调整拥塞窗口的大小。常见的拥塞控制算法有慢开始、拥塞避免、快重传和快恢复。当网络出现拥塞时,发送方会减小拥塞窗口,降低发送速率;当网络状况改善时,逐渐增大拥塞窗口。拥塞控制保证了在网络拥塞的情况下,数据也能有序、可靠地传输,避免了网络拥塞的进一步恶化[^1]。 ### 全双工通信 TCP支持全双工通信,即双方可以同时进行数据的发送和接收。这使得通信双方可以及时地交换数据,提高了通信效率。在全双工通信模式下,双方都可以独立地发送和接收确认应答,进一步增强了数据传输的可靠性。 ```python # 以下是一个简单的TCP客户端示例代码 import socket # 创TCP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_address = ('localhost', 8888) client_socket.connect(server_address) # 发送数据 message = 'Hello, TCP Server!' client_socket.sendall(message.encode()) # 接收数据 data = client_socket.recv(1024) print(f'Received from server: {data.decode()}') # 关闭连接 client_socket.close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值