主机A 主机B
→→→→→数据(1-1000) →→→→→
→→→→→应答(下一个是ack=1001)→→→→→
→→→→→数据(1001-2000) →→→→→
→→→→→应答(下一个是ack=2001)→→→→→
→→→→→数据(2001-3000) →→→→→
→→→→→应答(下一个是ack=3001)→→→→→
TCP将每个字节的数据都进行了编号,即为序列号。(TCP包的序列号为该包数据首个字节的序列号)
每一个ACK都会附带确认序列号
1、=已接收的最后一个字节数据的序列号+1
2、=接下来要接收字节数据的序列号 = 接下来要接收的TCP数据包的序列号
3、该序列号前的数据全部已接收
假设:收到了1-1000和2001-3000,但是没有收到1001-2000
则ACK包的确认序列号为1001
1、重发的条件:发送者A在特定时间间隔内无法收到接收者B的ACK数据包/ACK包 传输过慢or丢包
2、B接收到重复数据,利用序列号丢弃重复数据
3、重传计时器的时间设定:
①因网络环境不同而存在差异
②设定过长会影响效率;设定过短会频繁发送重复数据
③动态计算:Linux中,超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。若重发一次之后仍得不到应答,等待2500ms后再进行重传;如果仍得不到应答,等待4500ms进行重传,依次类推,以指数形式递增。累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。
引入之前:数据—ACK—数据—ACK…(必须在ACK后才发送下一个数据包)
总的传输时间=N份数据传输时间+N份应答传输时间
时间效益差,尤其在数据往返时间较长的情况下
引入之前之后:改为一次发送多条数据(本质:将多个段的等待时间重叠在一起了。)
总的传输时间=N份数据传输时间重叠成了1份时间,N份应答传输时间,重叠成了一份时间
发送窗口大小指的是无需等待ACK而可以继续发送的数据的最大值
1、发送窗口大小由接收方的接收缓冲区大小决定,
可以在建立TCP连接时协商
2、窗口越大,则网络的吞吐率就越高。
滑动:窗口范围就是表示当前哪些数据在等待ACK,随着一个ACK到达就立刻发送下一个数据,等待的数据包的范围就在逐渐滑动
操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据才能从缓冲区删掉。
1、ACK丢失or后面的ACK先到