首页 > Linux操作系统 > Linux操作系统 > Go back n小例子
进程1给2发送数据,数据以包的形式被发送和接受。
为了即使在有数据包丢失的情况下也能完整的接收到1发送的所有数据,一般发送方需要接受接收方的
相应,例如
1 -> Packet(seq=1,len=10) -> 2
1 <- Packet(seq=1,ack=11) <- 2
1,2各自有自己的sequence number,假设都从1开始,1发给2一个10字节的数据包,2发给1一个
ACK,ack=11表示2已经接受了10个包,期待接受的下一个包的seq是11。
1收到了2的ACK后,在继续发送下一个数据包,例如:
1 -> Packet(seq=11,len=1) -> 2
2的下一个响应可能如下:
1 <- Packet(seq=2, ack=12) <- 2
这种数据交互方式速度比较慢,因为发送方必须要等到接收方接受了数据才能继续发送,如果有了一
定大小的发送/接受缓冲区,发送方就可以发送数据到缓冲区慢,然后再等待应答,这样就能提高效率
。
至于Go back n
举个例子,前面的packet sequence是无错误出现的状态下,下面是有错误
1. 1 -> Packet (seq=1, len = 10) -> 2 OK
2. 1 -> Packet (seq=11, len = 5 ) -> 2 OK
3. 1 -> Packet (seq=16, len = 10 ) -> 2 FAIL
4. 1 -> Packet (seq=26, len = 1 ) -> 2 FAIL
如上,假设3,4两个包都丢失了,2没有收到,则2会回1一个这样的ACK
5. 1 <- Packet (seq=1, ack = 16)
此时,1收到该packet后,发现3,4两个包2都没有收到,于是就go-back-2,重新发送3,4两个包
发表于:2007.02.12 11:06
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12476590/viewspace-134079/ ,如需转载,请注明出处,否则将追究法律责任。