进程1给2发送数据,数据以包的形式被发送和接受。
6`kR)p7P.GZL%O0为了即使在有数据包丢失的情况下也能完整的接收到1发送的所有数据,一般发送方需要接受接收方的
相应,例如ITPUB个人空间@6R-L#W+U7n
yXVAb'{
1 -> Packet(seq=1,len=10) -> 2ITPUB个人空间8yDw_/~(Hh']
1 <- Packet(seq=1,ack=11) <- 2
;O.\-A&_-Ie\XbWS01,2各自有自己的sequence number,假设都从1开始,1发给2一个10字节的数据包,2发给1一个
ACK,ack=11表示2已经接受了10个包,期待接受的下一个包的seq是11。
6F4l*@BPWp(x01收到了2的ACK后,在继续发送下一个数据包,例如:ITPUB个人空间5Lbe(WX?E9L
1 -> Packet(seq=11,len=1) -> 2ITPUB个人空间
q _3~Q)n'b@R
2的下一个响应可能如下:
b8U%i6GF#Gv,i01 <- Packet(seq=2, ack=12) <- 2
这种数据交互方式速度比较慢,因为发送方必须要等到接收方接受了数据才能继续发送,如果有了一
定大小的发送/接受缓冲区,发送方就可以发送数据到缓冲区慢,然后再等待应答,这样就能提高效率ITPUB个人空间yATW/h+e0]
。
至于Go back nITPUB个人空间^by1rG[
举个例子,前面的packet sequence是无错误出现的状态下,下面是有错误
1. 1 -> Packet (seq=1, len = 10) -> 2 OK
Kr4E[5n+?H02. 1 -> Packet (seq=11, len = 5 ) -> 2 OKITPUB个人空间:|0]iz%iOd_
3. 1 -> Packet (seq=16, len = 10 ) -> 2 FAILITPUB个人空间M S%P+J(J\/F/o9D6eL
4. 1 -> Packet (seq=26, len = 1 ) -> 2 FAIL
如上,假设3,4两个包都丢失了,2没有收到,则2会回1一个这样的ACKITPUB个人空间$y&oX/F"}(tA%e
5. 1 <- Packet (seq=1, ack = 16)
此时,1收到该packet后,发现3,4两个包2都没有收到,于是就go-back-2,重新发送3,4两个包
发表于:2007.02.12 11:06