• 江山如画
    2022-02-17
    问题1: 分情况讨论。 1. 如果是三次握手时,第二个握手报文SYN+ACK 丢失,在经过一个 RTO 时间后,由于还没收到第三个握手报文,发生超时重传,会重传这个报文。(这种情况是我猜的,没有实际验证) 2. 如果发送端先后发送了报文n,n+1,接收端也先后确认了这两个报文,如果ACK[n] 传输时丢失,ACK[n+1] 正常传输,由于后者的确认范围涵盖了前者,那么即使 ACK[n] 丢失也不会有什么影响,则不会重传 ACK[n]。 3. 如果在情况2中,第 n+1 个报文是当前数据流的最后一个报文,且 ACK[n+1] 传输时丢失了,发送端经过1个RTO时间后会触发超时重传,接收端在接收到报文后会重传 ACK[n+1]。

    作者回复: 非常好,而且全面,这些理解都是正确的,感觉你进步明显:)也请继续加油~

    共 3 条评论
    11
  • MeowTvづ
    2022-02-16
    由于Option字段最大为40字节,所以SACK中只能装4组边界信息,SACK选项的最大占用字节数=4*8+2 = 34。

    作者回复: 赞:)其中的2字节是kind和length的各一个字节~

    
    7
  • 我来也
    2022-02-16
    思考题一:TCP 的确认报文如果丢失了,发送端还会不会重传呢?为什么? 我觉得要看实际情况。 1. 比如后续收到了更新的 ACK 报文,说明前面的内容都接收到了。发送端自然不会再重传前面的内容。 2. 如果说后续没有 ACK 报文了,触发了发送端的 超时重传,这个时候就会重传了。

    作者回复: 是的,ack本身没有ack了,否则就是无限循环了。根据不同的场景,对端会启动超时重传或者快速重传,这样就还是能保证传输。要保障传输可靠性,这就是是tcp如此复杂和精妙的原因。

    
    4
  • taochao_zs
    2022-02-16
    1 不会,ack是没有ack确认报文,所有没有重传的意义。2 重传的本质是:网络/应用/操作系统不稳定导致处理不及时,网络层避免重传应该重点关注网络流量工程的规划和建设,应用层和操作系统层关注重试机制的应对保证不稳定状态下业务稳定性。

    作者回复: 说的很好:)网络要做好质量可靠性,应用也需要做到比较好的容错性,两者合作,这样就最大程度的保证系统可靠性了。

    
    2
  • 志强
    2022-02-23
    老师您好 我的环境rx 几秒钟就会dropped值加一,但要是在环境上tcpdump抓包,rx的dropped就不变了,取消抓包,又几秒钟开始出现dropped值加一,请问老师这可能是什么原因 环境是微服务三台部署,没有任何业务

    作者回复: 有意思的问题:)你tcpdump时候有没有启用混杂模式(promiscuous mode)?可能drop的是广播包(目标MAC是全1),而启用混杂模式会收下这种报文。

    共 4 条评论
    1
  • 不忘初心
    2022-11-15 来自上海
    老师,对于重传有些疑问。 1. 如果发送端网络报文因为延迟多次重发后,因为接收端已经收到过该报文, 是不是直接就将该报文丢弃了。并且回复SACK吗? 2. 如果SACK机制没有打开, 会怎么样? 会回复什么呢?

    作者回复: 1. 开启SACK的情况下,就是你说的 2. 没开启SACK的情况,假设接收端收到了1~1000字节的数据,而第1000~1500未收到;发送端持续重传2000~2500这些数据,那么接收端还是只ACK 1000,当然更没有SACK

    
    
  • Realm
    2022-02-17
    快速重传如何触发?没有SACK的情况下,32号报文从服务端发出,在网络上丢了,后面服务端又发了34,36,38...,客户端在收到这些报文时,根据seq-len一看,发现我压根没有收到序列号是seq-len的32号报文,就一直回DupAck要32号报文,就触发快速重传了,老师,是不是这样理解?

    作者回复: 应该说是34 36这些报文的序列号,跟前面30(也就是32之前的报文)的nextseq连不上了,按tcp的规定,tcp头部的确认号必须是连续字节,如果“跳空”了,就只能ack最近的连续字节位置。每次收到这种“跳空”的报文,确认报文还是要回复的,只是确认号会重复,你看看这样说可以清楚一点吗

    共 2 条评论
    
  • Realm
    2022-02-17
    “我直接给你揭晓答案:就是因为从 32 号报文之后,服务端还继续发送了 14 个数据报文,远不止 3 个,所以触发的 DupAck 也远不止是 3 个。你可以直接看下图来理解这里的逻辑” ,老师,这个下面的图,是不是34、36、38触发重传更准确一点,35好像是反方向的数据包.

    作者回复: 恩是34 36 38:)

    
    
  • ERROR404
    2022-02-16
    1.不会,接收端可以根据通过ACK来告诉发送端收到的收到的重复数据,每次服务端发送最新ACK号即可,即D-SACK。 2.重传还是看影响不影响到业务,实际是允许重传存在的。像互联网线路丢包或者营销等引起流量突升的重传。

    作者回复: 嗯回答挺好的:)这里面的DSACK我没有在课程中提及,但确实是一个知识点,有时候工作中也会遇到。DSACK的作用向对端表示“我重复收到了某些报文”,这样对端可以相应的做传输优化,比如拥塞控制行为的调整。 重传是TCP应对网络网络的行为,本质上不能算是“根因”,而是一种外化表现,有时候重传是正常的,有时候表示真的有问题,然后就需要针对这些重传的具体情况来分析应对了~

    
    
  • Chao
    2022-02-16
    机房可用性那个案例最后是什么问题 怎么解决的呢

    作者回复: 时间有点久远了,记得没错的话,当时的具体原因应该是路由选的某条公网链路质量不稳定,容易丢包,导致了重传。跟客户协商更换线路后,质量就好了很多。 关于进一步排查路径上的准确问题节点的相关工具和方法,在课程后半程里会专门介绍,特别是当我们大部分人是网络使用者,也就是通信两端的所有者时,可以采用的排查方法。敬请期待~

    
    