diff options
author | LAN-TW <lantw44@gmail.com> | 2013-12-26 12:50:22 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-12-26 12:50:22 +0800 |
commit | 4b2c886d0ad9efd0857044c34a5fe35ae196833a (patch) | |
tree | 71c359f3bd5a7ea0276a202e54e963020ec0694a | |
parent | 1a9248027294f32945a425e5a1baca467167f0ad (diff) | |
download | cn2013-4b2c886d0ad9efd0857044c34a5fe35ae196833a.tar.gz cn2013-4b2c886d0ad9efd0857044c34a5fe35ae196833a.tar.zst cn2013-4b2c886d0ad9efd0857044c34a5fe35ae196833a.zip |
HW2: 加入 report
-rw-r--r-- | hw2/README.txt | 2 | ||||
-rw-r--r-- | hw2/report.pdf | bin | 0 -> 87863 bytes | |||
-rw-r--r-- | hw2/report.txt | 68 |
3 files changed, 69 insertions, 1 deletions
diff --git a/hw2/README.txt b/hw2/README.txt index 75a3aee..3ebc6e9 100644 --- a/hw2/README.txt +++ b/hw2/README.txt @@ -8,7 +8,7 @@ 執行 ---- ump-agent:這是 agent,需指定 bind 的 address 和 port,以及 loss rate。 -這裡指定的 loss rate 必須是個整數,實際的 loss rate 惠接近這個數的倒數。 +這裡指定的 loss rate 必須是個整數,實際的 loss rate 會接近這個數的倒數。 例如: ump-agent :: 1234 10 diff --git a/hw2/report.pdf b/hw2/report.pdf Binary files differnew file mode 100644 index 0000000..9f1dba7 --- /dev/null +++ b/hw2/report.pdf diff --git a/hw2/report.txt b/hw2/report.txt new file mode 100644 index 0000000..5305b64 --- /dev/null +++ b/hw2/report.txt @@ -0,0 +1,68 @@ +輸出檔案與原始檔的關係,以及各檔案的功能: + + 1. liblbs.a + 這是個與此次作業沒有直接相關的函式庫,部份程式碼取自上次作業以及之前寫 + 其他科目作業時留下來的程式。 + xwrap.[ch] 提供一些標準函式的 wrapper。 + l4logger.[ch] 透過環境變數決定輸出紀錄檔方式的功能。 + + 2. libump.a + 這是這次作業主要的程式。 + ump-common.h 提供一些轉型用的 macro 和定義 getter / setter 的 macro。 + ump-pkt.[ch] 定義封包外層的 header 格式,以及填入與檢查 checksum 的功能。 + ump-app.[ch] 定義封包內層的 header 格式,用以存放無法放在外層的資料。 + ump-gai.[ch] 一個 getaddrinfo(3) 的 wrapper,用於產生 host 和 port 參數。 + ump-sched.[ch] 提供類似 connect、list、accept、read、write 的界面供 sender + 和 receiver 使用。各種作業要求的功能,像是 multipath、congestion control、 + reliable transmission 也都實作在這個檔案裡。多數作業要求的輸出訊息也是這 + 裡產生的。 + + 3. ump-agent (statically linked 到 libump.a 和 liblbs.a) + 這是這次作業的 agent,僅有一個原始檔 agent-main.c。 + + 4. ump-trans (statically linked 到 libump.a 和 liblbs.a) + 這是這次作業的 file transmitter,並用 command line arguments 數量來決定 + 身份是 sender 或 receiver。 + trans-main.c 解析 command line arguments。 + trans-loop.[ch] sender 與 receiver 讀寫檔案與傳送資料的地方。 + + 5. 其他 build system 相關檔案 + configure 由 configure.ac 產生,用於設定參數、檢查 C 編譯器的功能、開啟 + C 編譯器的 C99 支援、根據作業系統類型定義不同的 feature test macros。 + Makefile 由 configure 根據 Makefile.in 產生,而 Makefile.in 由 Makefile.am + 產生。目的是節省花在編寫 Makefile 的時間。 + +實作的方法與功能: + + 1. sender 要向 receiver 建立連線時,會隨機選一個數字當作 sequence number, + 並送出 SYN packet (ump_sched_connect)。若在 5 次的 time out 時間內有收到 + receiver 的 ACK,則表示成功建立連線。之後 sender 會開始傳送 data packet + (ump_sched_send),並可能同時向多個 agent 傳送多個 packet。sender 會等到 + 這個 window 的所有 data packet 對應的 ACK 都收到以後,根據傳輸狀況更改 + window size 和 threshold,再進入下一個 window。結束連線時會送出 FIN packet + (ump_sched_shutdown),並最多等待 5 次的 time out 時間。與建立連線時不同的 + 是,若 5 次 time out 時間內都沒有收到 ACK,仍視為成功結束連線。time out + 的功能是用 SIGALRM 和 setitimer(2) 實作的。 + + 2. sender 會記錄每個封包送出時使用的 agent,以藉此對 agent 傳送的可靠程度 + 評分。當封包成功收到時,對應的 agent 會被加分;當封包 time out 時,對應的 + agent 會被扣分。sender 會選擇當時 (agent 分數 - 已要求 agent 送出的封包數) + 數值最大的 agent 送出這個 window 的資料,若數值相同則以 command line 上排 + 在較前面位置的 agent 優先。發生 time out 而需要重傳時,sender 會重新評估 + 分數,選擇新的 agent。事實上不論 agent 是否有 drop packets,都會因為 + receiver buffer 滿了而發生 time out,使得各 agent 的分數相當接近,而 + sender 也藉此不斷變換使用的 agent,達成 multipath 的要求。當檔案夠大時, + 可看出 sender 會將較多的封包送給 loss rate 較低的 agent。 + + 3. receiver 首先會先 bind 到使用者指定的位址上 (ump_sched_listen),接著等候 + sender 的 SYN packet (ump_sched_accept)。隨後開始接收 data packet,並在 + 收到 FIN packet 時 (ump_sched_receive) 回復最初狀態等待下一個連線 + (ump_sched_accept)。receiver 會在收到每個 packet 後,告知 sender 目前已 + 經連續收到的 sequence number。receiver 用接收到的 packet 的來源位址當作 + 送回 ACK 時的目的地,因此 receiver 並不需要知道 sender 使用了哪些 agent。 + + 4. agent 僅是重複 recvfrom 接收 packet,檢查 checksum 並隨機決定是否要幫忙轉 + 送封包。如果決定願意轉送封包,則 agent 會在內層 header 填入來源 IP address + 與在外層 header 填入來源 port,並重新計算 checksum 後用 sendto 送出 + packet。agent 並不知道封包是 sender 或 receiver 傳送的,也不知道有哪些 + sender 和 receiver。 |