[問答] 關於 Computer Networking 書上的 rdt 2.2 receiver

看板Network作者 (stw)時間13年前 (2012/08/24 12:52), 編輯推噓0(0020)
留言20則, 2人參與, 最新討論串1/3 (看更多)
James F. Kurose 的 Computer Networking: A Top-down Approach 5th edition 第三章 Transport Layer 的 3.4 節 -- Principles of Reliable Data Transfer 其中的 rdt 2.2 receiver 的 Finite State Machine Λ ---------- oncethru=0 ↘ ┌─────────┐ │ │ rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || ┌--→ │ │ has_seq1(rcvpkt)) │ │ Wait for call 0 │→ -------------------------------------- │ │ from below │ if (oncethru == 1) └---- │ │ udt_send(sndpkt) │ │ └─────────┘ 我不懂的地方是,為什麼要增加 oncethru 這個變數呢? 為什麼左邊那個遞迴的部分,不乾脆改成底下這樣: rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || has_seq1(rcvpkt)) -------------------------------------------------------- sndpkt=make_pkt(ACK,1,checksum) udt(send(sndpkt) 就好了呢?這樣就不需要增加 oncethru 這個變數了不是嗎? 而且使用 oncethru,且一開始 oncethru=0 萬一 receiver 第一個接收到的 packet 就是 corrupt 的 packet 由於一開始 oncethru=0,結果底下的 udt_send(sndpkt) 並不執行 這樣豈不是 sender 根本就不知道第一個 packet 就已經 corrupt 了 然後 sender 就一直卡在 wait for ACK 0 這邊動彈不得? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.254.0.106

08/25 01:22, , 1F
為什麼我翻了好幾本都是
08/25 01:22, 1F

08/25 01:22, , 2F
rdt_rcv(rcvpkt) && (corrupt(rcvpkt) ||has_seq1(rcvpkt))
08/25 01:22, 2F

08/25 01:22, , 3F
-------------------------------------------------------
08/25 01:22, 3F

08/25 01:23, , 4F
udt(send(sndpkt) 沒你說的那行
08/25 01:23, 4F

08/25 02:18, , 5F
不可能直接udt_send(sndpkt),因為這個時候sndpkt是空的
08/25 02:18, 5F

08/25 02:19, , 6F
必須先執行sndpkt=make_pkt(ACK,1,checksum)
08/25 02:19, 6F

08/25 02:20, , 7F
可是第五版書上卻是用oncethru來檢查,可是這樣的話,第一
08/25 02:20, 7F

08/25 02:20, , 8F
個packet出錯的話,receiver根本不會回傳任何訊息...
08/25 02:20, 8F

08/25 02:21, , 9F
我手上只有第五版的書,難道說前幾版不是這樣寫的?
08/25 02:21, 9F

08/25 02:22, , 10F
這邊有第五版書上的圖 http://ppt.cc/A94-
08/25 02:22, 10F

08/25 02:26, , 11F
改成這樣或許還比較合理:
08/25 02:26, 11F

08/25 02:27, , 12F
if (oncethru==0)
08/25 02:27, 12F

08/25 02:27, , 13F
sndpkt=make_pkt(ACK,1,checksum)
08/25 02:27, 13F

08/25 02:27, , 14F
udt_send(sndpkt)
08/25 02:27, 14F

08/25 02:28, , 15F
if (oncethru==1)
08/25 02:28, 15F

08/25 02:28, , 16F
udt_send(sndpkt)
08/25 02:28, 16F

08/25 02:38, , 17F
08/25 02:38, 17F

08/25 02:41, , 18F
謝謝 ^^ 看來是書籍版本不同的問題。我剛剛也找了一個
08/25 02:41, 18F

08/25 02:42, , 19F
http://ppt.cc/aOsY 跟您提供的一樣,不過是1999年的
08/25 02:42, 19F

08/25 02:43, , 20F
不管新舊版本,只要第一個packet出錯,整個系統就不會運作
08/25 02:43, 20F
文章代碼(AID): #1GDmY9BG (Network)
文章代碼(AID): #1GDmY9BG (Network)