详解 TCP 超时与重传机制——长文预警

本文详细介绍了TCP协议中的超时和重传机制,包括超时如何确定、经典与标准方法的RTT计算、基于计时器和快速重传的策略,以及SACK和DSACK在解决数据包丢失和乱序问题上的应用。通过理解这些机制,有助于深入理解TCP的可靠性保障。

上一篇介绍 TCP 的文章「TCP 三次握手,四次挥手和一些细节」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部分。


我们都知道 TCP 协议具有重传机制,也就是说,如果发送方认为发生了丢包现象,就重发这些数据包。很显然,我们需要一个方法来「猜测」是否发生了丢包。最简单的想法就是,接收方每收到一个包,就向发送方返回一个 ACK,表示自己已经收到了这段数据,反过来,如果发送方一段时间内没有收到 ACK,就知道很可能是数据包丢失了,紧接着就重发该数据包,直到收到 ACK 为止。

你可能注意到我用的是「猜测」,因为即使是超时了,这个数据包也可能并没有丢,它只是绕了一条远路,来的很晚而已。毕竟 TCP 协议是位于传输层的协议,不可能明确知道数据链路层和物理层发生了什么。但这并不妨碍我们的超时重传机制,因为接收方会自动忽略重复的包。

超时和重传的概念其实就是这么简单,但内部的细节却是很多,我们最先想到的一个问题就是,到底多长时间才能算超时呢

超时是怎么确定的?

一刀切的办法就是,我直接把超时时间设成一个固定值,比如说 200ms,但这样肯定是有问题的,我们的电脑和很多服务器都有交互,这些服务器位于天南海北,国内国外,延迟差异巨大,打个比方:

  • 我的个人博客搭在国内,延迟大概 30ms,也就是说正常情况下的数据包,60ms 左右就已经能收到 ACK 了,但是按照我们的方法,200ms 才能确定丢包(正常可能是 90 到 120 ms),这效率实在是有点低
  • 假设你访问某国外网站,延迟有 130 ms,这就麻烦了,正常的数据包都可能被认为是超时,导致大量数据包被重发,可以想象,重发的数据包也很容易被误判为超时。。。雪崩效应的感觉

所以设置固定值是很不可靠的,我们要根据网络延迟,动态调整超时时间,延迟越大,超时时间越长。

在这里先引入两个概念:

  • RTT(Round Trip Time):往返时延,也就是**数据包从发出去到收到对应 ACK 的时间。**RTT 是针对连接的,每一个连接都有各自独立的 RTT。
  • RTO(Retransmission Time Out):重传超时,也就是前面说的超时时间。

比较标准的 RTT 定义:

Measure the elapsed time between sending a data octet with a particular sequence number and receiving an acknowledgment that covers that sequence number (segments sent do not have to match segments received). This measured elapsed time is the

### Transformer模型详解 Transformer是一种深度学习模型,最初在2017年的论文《Attention is All You Need》中被提出。它主要用于处理序列数据,尤其是在自然语言处理(NLP)领域取得了显著的成功[^1]。传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformer完全基于注意力机制,特别是自注意力机制(self-attention),这使得模型能够并行处理信息,并且更好地捕捉长距离依赖关系。 #### 注意力机制工作原理 注意力机制允许模型在处理一个特定位置的信息时,关注到输入序列中的其他位置。这种机制的核心在于计算查询(query)、键(key)和值(value)之间的相似度,从而决定哪些部分需要更多的注意。具体来说,在Transformer中,每个位置都会生成这三个向量,通过它们的点积来衡量相关性,并使用softmax函数将这些得分转换为权重。最终的结果是所有值向量加权求和的结果,权重反映了各个位置的重要性。 对于自注意力机制而言,查询、键和值都来自于同一个输入序列的不同位置。这样的设计让模型能够在处理当前词的时候,考虑到句子中其他词的影响,进而获取更全面的上下文信息。 ```python # 示例代码:简化版的自注意力机制实现 import torch from torch import nn class SelfAttention(nn.Module): def __init__(self, embed_size, heads): super(SelfAttention, self).__init__() self.embed_size = embed_size self.heads = heads self.head_dim = embed_size // heads assert ( self.head_dim * heads == embed_size ), "Embedding size needs to be divisible by heads" self.values = nn.Linear(self.head_dim, embed_size, bias=False) self.keys = nn.Linear(self.head_dim, embed_size, bias=False) self.queries = nn.Linear(self.head_dim, embed_size, bias=False) self.fc_out = nn.Linear(embed_size, embed_size) def forward(self, values, keys, query, mask): N = query.shape[0] value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1] # Split embedding into self.heads pieces values = values.reshape(N, value_len, self.heads, self.head_dim) keys = keys.reshape(N, key_len, self.heads, self.head_dim) queries = query.reshape(N, query_len, self.heads, self.head_dim) energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) # queries shape: (N, query_len, heads, head_dim) # keys shape: (N, key_len, heads, head_dim) # energy shape: (N, heads, query_len, key_len) if mask is not None: energy = energy.masked_fill(mask == 0, float("-1e20")) attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3) out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape( N, query_len, self.heads * self.head_dim ) # attention shape: (N, heads, query_len, key_len) # values shape: (N, value_len, heads, head_dim) # after einsum: (N, query_len, heads, head_dim), then flatten last two dimensions out = self.fc_out(out) return out ``` #### 自然语言处理中的应用 Transformer及其变体已经在多种NLP任务上展现了卓越的表现,包括但不限于机器翻译、文本摘要、问答系统等。BERT(Bidirectional Encoder Representations from Transformers)就是基于Transformer编码器的一种预训练技术,它能够产生上下文相关的词嵌入,极大地提升了下游任务的效果[^1]。此外,还有GPT系列模型,它们利用了Transformer解码器的部分结构,实现了强大的文本生成能力。 除了NLP,Transformer也被应用于计算机视觉等领域,例如Vision Transformer(ViT),它直接将图像分割成块,并作为序列输入给Transformer模型进行处理。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值