如果TCP客户端将序列号从10000到20000的数据包发送到TCP服务器。tcp将使用seq_ack 20001进行ACK响应。
如果我拦截了来自客户端的TCP数据包,并将其分成2个tcp段,一个段的seq从10000到15000,另一个段的seq从15001到20000。然后将这2个TCP段发送到TCP服务器。假设第二段在路径中丢失。TCP服务器将使用seq_ack 15001响应ACK。
现在,由于TCP客户端发送了seq 10000到20000的整数数据包,但是从客户端的角度来看,它收到的ACK为15001,这很奇怪。它会如何反应?从理论上讲,客户端应从seq 15001到20000重新传输字节,即,客户端将从seq 15001传输新的数据包。但是,在TCP堆栈实现中,这种做法与理论中的相同吗?
我认为在TCP发送缓冲区中,当发送tcp段时,该段仍然停留在那里直到ACK。ACK到来时,将从缓冲区中清除该段的这些字节。发送缓冲区中有一个指针,当收到ACK时,该指针指向ack_seq所对应的位置。ack_seq以下的字节将被清除。这样,整个段都不需要重新传输吗?