首先需要明白TCP包中的sequence和ack sequence的含义:
1.sequence·是表示发送方的当前包的起始数据序列号
2.ack sequence则是表示对接收方的应答序列号,它是指对方下一个包要使用的起始sequence。(上一接收包的sequence加上len之后的值)
那么再来看什么是dupack,它是为了快速重传机制而发送的重复确认包,那么是不是说只要发送包中的ack sequence一直相同就表示它是一个dupack呢,并且会触发重传机制?
实际上并不是如此,试想一下,当发送方A向接收方B不停发送数据,而B端始终处于接收而没有发送数据到A的场景 ,首先比较容易理解的是,B端应答的Ack sequence应该是递增的;那么A端发送数据给B时,按照协议来说也需要填充Ack sequence,由于B端始终没有发送数据到A端,那么可想而知,当A端数据到B端时,填充的Ack sequence始终是相同的,那么对于这种来说,它并没有触发快速重传,因为B端压根不存在要发送给A端的数据,所以这种情况并不数据Dup Ack,Dup Ack的存在时有一个前提的,那就是它所重复应答的包,是对方发送的旧包,并且对方已经把新包也发出来了,所以这个处理到底是按照Dup Ack进行快速重传还是正常处理,是由发送端是否已经发送了更新的数据来决定的。