1. 程式人生 > >計算機網路自頂向下方法 習題參考答案 第三章

計算機網路自頂向下方法 習題參考答案 第三章

複習題

R1.

a.
稱這個簡單的運輸層協議為 STP。
在傳送端,STP 接收應用程式要傳送的資料(不超過 1196 位元組)、目的地址、埠號;然後 STP 新增 4 位元組頭部資訊,即埠號;將這 1200 位元組的報文段連同目的地址交付給網路層;
在接收端,STP 提取埠和資料,將資料傳送給埠所標誌的程式。

b.
在頭部資訊中增加 4 位元組的源埠號,將資料減少為 1192 位元組。

c.
不。

R2.

R3.

y、x

R4.

一些應用程式不想使用 TCP,因為其擁塞控制會降低傳送速率。而且應用本身並不需要可靠的資料傳輸。

R5.

因為今天大多數的防火牆會攔截 UDP

R6.

在應用層新增差錯檢測,需要程式開發人員在程式中新增一些檢測程式碼

R7.

題目正確的翻譯應該是:這兩個報文段都將被定向到主機C上的同一個套接字嗎?還不如直接 google 翻譯呢。那麼現在題目要求清楚了,兩個報文段都將被定向到主機C上的同一個套接字。根據源 IP 區分不同主機。

R8.

通過不同的歡迎套接字。它們的目的埠都是 80。

R9.

判斷究竟是新的分組還是重傳

R10.

處理丟包事件,如果丟包可以重傳

R11.

RTT 固定的好處就是傳送方可以準確判斷 ACK 是否丟失,不過它仍需要一個時間固定的定時器。

R12.

a.
接收方丟棄全部分組,之後傳送方重傳五個分組。

b.
GBN 使用累積確認,因此沒有觸發重傳

c.
只能傳送五個,因為視窗大小就是 5

R13.

a.
只重發第一個分組即可

b.
超時重發第一個分組

c.
只能傳送五個,因為視窗大小就是 5

R14.

a.
b.
c.
d.
e.
f.
g.

R15.

a. 110 - 90 = 20byte
b. 90

R16.

依然是三個,第一個 seq=43 ack=80,第二個 seq=80 ack=44,第三個 seq=44 ack=81

R17.

R/2

R18.

錯,設為 cwnd 的一半

R19.

習題

P1.

假定 A 向 S 的源埠號為 x, B 向 S 的源埠號為 y
a.
A 向 S 的源埠號為 x, 目的埠號為 23

b.
B 向 S 的源埠號為 y, 目的埠號為 23

c.
S 向 A 的源埠號為 23, 目的埠號為 x

d.
S 向 B 的源埠號為 23, 目的埠號為 y

e.
x y 可能相同

f.
不可能

P2.

從 B 到 C:
   左邊的連線:源埠號 80,源 IP 為 B 的 IP;目的埠 26145,目的 IP 為 C 的 IP;
   右邊的連線:源埠號 80,源 IP 為 B 的 IP;目的埠 7532,目的 IP 為 C 的 IP;

從 B 到 A:
   源埠號 80,源 IP 為 B 的 IP;目的埠 26145,目的 IP 為 C 的 IP;

P3.

注意應在溢位時向最低位進位:

    01010011  
+   01100110 
————————————
    10111001
+   01110100
————————————
(1) 00101101
+          1
————————————
    00101110

其反碼為 11010001

使用反碼有以下好處:

  1. 不依賴系統是大端還是小端
  2. 計算檢驗和比較簡單快速

接收方檢驗差錯的方法是將三個位元組與檢驗和相加,如果任何一個位為 0,說明出錯

1位元的差錯肯定會導致結果不同
2位元的差錯可能會檢測不出,比如題中第一、二位元組變為 01010010,01100111,即最後一個位元反轉

P4.

a. 00111110
b. 01000000
c. a 中的第一、二位元組變為 01011101、01100100

P5.

不能確保,如同上兩題討論的那樣

P6.

如果 rdt2.1 傳送方正處於“等待來自上層的呼叫0”,接收方處於“等待來自下層的0”,傳送方傳送序號為 0 的分組,而接收方正確接收並向傳送方傳送 ACK;此時傳送方處於“等待 ACK 或 NAK 0”,接收方處於“等待下層的 1”,如果此 ACK 損壞,傳送方重發序號0的分組,而接收方會發送 NAK,這將導致一個死迴圈;
其實此接收方並沒有標註初始狀態,如果傳送方初始狀態為“等待來自上層的 0”,接收方初始為“等待下層的 1”,也會導致上述死鎖。

P7.

ACK 分組沒有序號是因為接收方、傳送方都不需要該序號。

P8.

可以直接使用 rdt2.2 中的接收方

P9.

資料分組損壞
確認分組損壞

P10.

類似於 rdt3.0 的傳送方,在 rdt2.1 的傳送方上加上 start_timer 以及 timeout 事件即可。timer 的時間要大於最大往返時延。

P11.

如果從“等待來自下層的1”中刪除,不會影響正常工作,因為 sndpkt 已經被生成了。
但是如果從“等待來自下層的0”中刪除,而且接收方剛剛啟動(處於初始狀態),sndpkt 是一個錯誤的值(很可能是一個隨機值),那麼傳送方會認為 ACK 損壞並重發分組,接收方會繼續傳送錯誤值,浙江導致一個死鎖。

P12.

僅有一個位元差錯時,協議正常工作,只不過可能比 rdt3.0 傳送方反應更快。
而當定時器時間過短時,每一個超時重發的分組都將會導致正在傳送的包重發,這樣從第一個包累積到第n個包,分組傳送的次數將趨於無窮。

P13.

像圖片展示的那樣,兩個 M0 將無法區分
重排序

P14.

分組 x 丟失只能被接收方檢測到,且只有 x-1,x+1 都被接收後。如果傳送方在傳送 x 之後隔較長時間才傳送 x+1,那麼這段時間 x 將一直不會被重發。
而當資料量較大且很少丟包時,用 NAK 協議傳送的資料包的數量明顯比 ACK 協議少

P15.

中文版翻譯較差,錯誤極多,無力吐槽。。。這裡按英文版的 98% 來做:
U = (nL/R) / (RTT + L/R) > 98%
    解出 n > 2450.98
    因此 n 至少是 2451

P16.

肯定能增加利用率,接收到 ACK0 或 ACK1 之後傳送方認為分組已經成功到達,即使事實不是如此。
可能導致許多問題,例如差錯出現並不會重發、造成無謂的重發等。

P17.

B與A類似,只不過初始狀態從 receive from A 開始
A

P18.

P19.

P20.

P21.

P22.

a.
考慮兩種極端情況:

  1. 傳送方傳送 k-4,k-3,k-2,k-1,接收方都完整得接收併發送 ACK,但 ACK 全都未傳到傳送方,接收方的期待序號為 k,而傳送方視窗序號為 [k-4, k-1]
  2. 如果 ACK 全都傳回,則傳送方更新 base,其序號為 [k, k+3]

因此序號可能是 [k-4, k+3]

b.
如果接收方期待 k,則它一定將比 k-1 小的 ACK 傳送出去了,如果要使傳送方傳送 k-1,那麼它至少已經接收到了 k-5 的 ACK。
因此正在傳播回傳送方的 ACK 序號可能是 [k-4, k-1]

P23.

設序號為 0(第一個 0),1,…,k-1,0(第二個 0)

對於 SR,要使其序號發生混雜,至少是當接收方剛剛包含第二個 0,即接收方視窗為[k-N-1, 0],也就是說 k-N (包括 k-N) 之前的都接收過了。要使序號混雜還有一個條件就是第一個 0 在傳送方視窗且恰好其 ACK 丟失,需要重發。0(第一個0)~k-N 為 k-N+1 個值,如果視窗長度不足 k-N+1,則第一個 0 和第二個 0 不會同時包含在傳送或接收視窗中。
所以視窗長度 N <= k-N,即 N <= k/2

GBN 類似,N <= k 即可

P24.

a.
可能, ACK 還沒來得及返回,傳送方超時重發,之後傳送方接收到 ACK 並移動視窗,那麼它之前重發的分組的 ACK 將落在視窗之外

b.
可能,類似 a

c.
是的

d.
是的

P25.

a.
UDP 直接將使用者資料打包進報文並立即傳輸,而 TCP 會將資料寫進快取並可能分成多個報文

b.
TCP 有流量控制和擁塞控制,而 UDP 沒有

P26.

a.
注意到 TCP 是位元組流編號的, L 的最大值為 2^32 byte

b.
設 N 為報文數:
N=232536=8012999N = \lceil \frac{2^{32}}{536} \rceil = 8012999

=N66byte=528857934byte總頭部長 = N * 66 byte = 528857934 byte

=232byte+528857934byte=4.824109byte總位元組數 = 2^{32} byte + 528857934 byte = 4.824*10^9byte

t=155Mbps=249st = \frac{總位元組數}{155Mbps} = 249s

P27.

a.
序號、源、目的埠號分別為 207、302、80

b.
序號、源、目的埠號分別為 207、80、302

c.
127

d.
p27

P28.

TCP 讓傳送方 A 維護一個接收視窗來提供流量控制,主機 B 將實時的 rwnd 值放入發給 A 的報文中,通知 B 的快取大小。A 確保 LastByteSent - LastByteAcked <= rwnd,當快取不足時,將暫停向 B 傳送資料

P29.

a.
防止有攻擊者發動 SYN 洪泛攻擊

b.
不能。當伺服器使用 SYN cookie 時,它不維護 cookie 或其他資訊,因此半開連線不可行。攻擊者並不知道某個伺服器和某 IP 對應的初始序列號,因為那個祕密數只有伺服器知道。

c.
理論上可行

P30.

a.
超時值是固定的,單一得增加有限快取的長度,會導致未丟失的分組被重傳

b.
有助於。

P31.

略,自己慢慢算算吧

P32.

a.
EstimatedRTT’
= 0.9 ( 0.9 ( 0.9 ( 0.9 EstimatedRTT + 0.1 SampleRTT1 ) + 0.1 SampleRTT2 ) + 0.1 SampleRTT3 ) + 0.1 SampleRTT4
= 0.9^4 EstimatedRTT + 0.1 SampleRTT4 + 0.9 * 0.1 SampleRTT3 + 0.9^2 * 0.1 SampleRTT2 + 0.9^3 * 0.1 SampleRTT1

b.
推廣到 n:
EstimatedRTT’ = 0.9^n EstimatedRTT + 0.9^(n-1) * 0.1 SampleRTT1 + 0.9^(n-2) * 0.1 SampleRTT2 + … + 0.1 SampleRTTn

c.
根據上式:
EstimatedRTT=0.9nEstimatedRTT+110i=1n0.9niSampleRTTiEstimatedRTT&#x27; = 0.9^n EstimatedRTT + \frac{1}{10}\sum_{i=1}^{n}0.9^{n-i}SampleRTT_i

可以看出 i 越小,SampleRTTiSampleRTT_iEstimatedRTTEstimatedRTT&#x27; 的影響越小,且其權重呈指數形式銳減

P33.

假設傳遞分組 1 到目的地,超時後源又重發分組 1 的副本分組 2;如果分組 1 的 ACK 返回到源,則源可能將它作為分組 2 的 ACK,從而計算了一個錯誤的 RTT

P34.

SendBase - 1 <= LastByteRcvd
LastByteRvcd 是剛到達 B 的編號, SendBase - 1 是已經到達 B 的編號

P35.

y 之前的所有位元組都被接收,因此 y-1 <= LastByteRcvd

P36.

考慮當分組錯序到達會發生什麼,分組 1 正確到達,目的地傳送 ACK,分組 3 提前於分組 2 到達,傳送一個冗餘 ACK,這將導致傳送方重傳分組 2,即使分組 2 並未丟失

P37.

a.
GBN:
A:首先發送分組 12345,後來重發 2345,總共 9 個分組
B:首先發送 ACK 1111,後來傳送 2345,總共 5 個 ACK

SR:
A:首先發送分組 12345,後來重發 2,總共 6 個分組
B:首先發送 ACK 1345,後來傳送 2,總共 5 個 ACK

TCP:
A:首先發送分組 12345,後來重發 2,總共 6 個分組
B:首先發送 ACK 2222,後來傳送 6,總共 5 個 ACK

b.
GBN、SR 需要等待超時,而 TCP 使用快速重傳,故 TCP 最快

P38.

是的

P39.

λ’in 超過 R/2,會導致更多的丟包以及重傳,λout 可能會下降

P40.

a. [1, 6] 和 [23, 26]

b. [6, 16] 和 [17, 22]

c. 三個冗餘 ACK

d. 超時

e. 32

f. 42/2 = 21

g. 29/2 = 14

h. 分組 1 (p1) 在傳輸輪迴 1 (t1) 中傳送,p2~p3 在 t2 中傳送,p4~p7 在 t3 中傳送,p8~p15 在 t4,p16~p31 在 t5,p32~p63 在 t6,p64~p96 在 t7,
因此分組 70 在第 7 個傳輸輪迴內傳送

i. ssthresh = 4,cwnd = ssthresh + 3MSS = 7

j. 在第16個傳輸輪迴時,ssthresh = cwnd/2 = 21,cwnd = 1 並進入慢啟動狀態,則在第19個傳輸輪迴中,ssthreash = 21,cwnd = 4

k. t17:1個,t18:2個,t19:4個,t20:8個,t21:16個,t22:21個
1 + 2 + 4 + 8 + 16 + 21 = 52 個

P41.

從圖中可以看出,這不是一種平等演算法
p41

P42.

超時僅能減緩 分組未丟失超時重傳 這種情況,不能阻止 TCP 向可能出現擁塞的端到端路徑上繼續傳送更多的新的分組。

P43.

流量控制將無法適用,因為接受快取足夠大。
沒有丟包、沒有超時,因此擁塞控制也無法適用。
無需適用任何措施,當傳送快取滿載時,自動就慢下來了。

P44.

a.
每個 RTT 加 1 個 MSS,因此需要 6 個 RTT

b.
6 + 7 + 8 + 9 + 10 + 11 = 51 MSS
平均吞吐量為 51MSS / 6RTT = 8.5 MSS/RTT

P45.

a.
從 W/2RTT 到 W/RTT 期間總共傳送的分組數:
W2+(W2+1)+(W2+2)+...+W=(W+W2)(WW2+1)2=38W2+34W\frac{W}{2} + (\frac{W}{2} + 1) + (\frac{W}{2} + 2) + ... + W=\frac{(W+\frac{W}{2})(W-\frac{W}{2}+1)}{2} = \frac{3}{8}W^2+\frac{3}{4}W

L=138W2+34W僅丟了一個包,因此丟包率 L = \frac{1}{\frac{3}{8}W^2+\frac{3}{4}W}

b.
W38W2&gt;&gt;34WL138W2=8/3W2當 W 足夠大, \frac{3}{8}W^2 &gt;&gt; \frac{3}{4}W,此時 L ≈ \frac{1}{\frac{3}{8}W^2} = 8/3W^2

W8/3L得出 W ≈ \sqrt{8/3L}

=0.75WRTT1.22MSSRTTL則平均吞吐率為 = \frac{0.75W}{RTT} ≈ \frac{1.22MSS}{RTT\sqrt{L}}

P46.

a.
最大視窗長度 W 受限於鏈路速率:W * MSS / RTT = 10Mbps
得到 W = 125

b.
從 W/2 到 W:
平均視窗長度為 0.75W = 94
平均吞吐量為 94 * 1500 * 8 / 0.15 = 7.52Mbps

c.
W’ = W/2 + 3 = 65
從 W’ 到 W:
(125-65)*150ms = 9s

P47.

不會

P48.

a.
W*MSS/RTT = 10Gbps
W = 125000

b.
7.52Gbps

c.
156.2min

P49.

已知 TCP 平均吞吐量 D=1.22MSSRTTLD = \frac{1.22MSS}{RTT\sqrt{L}}

L=(1.22MSSRTTD)2L=(\frac{1.22MSS}{RTT*D})^{2}

1L()TCP()\frac{1}{L}為丟包後(的那一刻) TCP 傳送的總分組數(因為只丟了一個包)

MSSL=TD,T=DRTT21.222MSS\frac{MSS}{L}=T*D,T=\frac{D*RTT^{2}}{1.22^{2}MSS}

因此 T 是 D 的函式

P50.

每秒傳送最多 30 個報文段,即每 100ms 最多傳送 3 個,每 50ms 最多傳送 1 個;無論何時發生丟包,假定 C1 每 100ms 調整一次視窗, C2 每 50ms 調整一次。
a.

t/ms C1.cwnd/報文段 C2.cwnd/報文段
0 10 10
50 5↓ (↓ 的意思是因丟包而減少一半) 10
100 2↓ 5↓
150 1↓ 5
200 1▲ (▲ 的意思是無法繼續減少) 2↓
250 1▲ 2
300 1▲ 1↓
350 2↑(↑ 的意思是加性增) 1
400 1↓ 1▲
450 2↑