網路程式設計練習題 (Practice - Network Programming)


Question 1 - Client-Server Transaction [recall]

每個網路應用的基本操作單位是 client-server transaction。請依序寫出它固定的四個步驟,並說明:client 與 server 到底是機器還是 process?這種 transaction 具有 database transaction 的 atomicity 嗎?


Question 2 - Hub vs Bridge vs Router [recall]

LAN 與 internet 中有三種連接元件:hub、bridge、router。請分別說明它們的轉送策略,並指出哪一個會讀取 packet header 中的 internet address、哪一個會改寫 frame header。


Question 3 - Byte Order 轉換函式 [recall]

TCP/IP 規定封包標頭中的整數(IP address、port)使用統一的 network byte order。請問這是哪種 endian?寫出 host ↔ network 轉換的四個函式與各自的位元寬度。有 64-bit 版本嗎?


Question 4 - Connection 與 Socket Pair [recall]

Internet connection 讓兩個 process 以 byte stream 通訊。請寫出 connection 的三個性質、一條 connection 由什麼唯一識別,以及 ephemeral port 與 well-known port 的差別。


Question 5 - Listening vs Connected Descriptor [recall]

server 端的 accept 會回傳一個新的 connected descriptor,而不是直接用 listening descriptor 通訊。請比較兩種 descriptor 的建立時機與存活期間,並說明 listen 函式的作用與 backlog 參數的意義。


Question 6 - getaddrinfo 與 getnameinfo [recall]

現代網路程式以 getaddrinfogetnameinfo 做主機/服務轉換。它們各取代了哪些過時函式?相比之下有哪兩大優點?getaddrinfo 回傳什麼資料結構,用完必須做什麼?


Question 7 - HTTP 格式與 Status Codes [recall]

HTTP 是文字式應用層協定。請寫出:(1) 每個文字行的結尾字元;(2) request line 與 response line 的格式;(3) 以下 status codes 的意義:200、301、403、404、501、505。


Question 8 - Host Header 與 static/dynamic content [recall]

哪個 request header 在 HTTP/1.1 為必填、HTTP/1.0 不需要?它的用途是什麼?另外請說明 serving static content 與 serving dynamic content 的差別。


Question 9 - IP Address 進位轉換 [application]

完成下列 dotted-decimal 與 hex 的互轉(hex 值為 network byte order 存放的 32-bit 位址):
(a) 128.2.194.242 → 0x? (b) 0xFFFFFF00 → ? (c) 10.1.1.64 → 0x? (d) 0x00000080 → ?


Question 10 - URL 解析與 Tiny 的判斷 [application]

瀏覽器送出請求 GET /cgi-bin/adder?15000&213 HTTP/1.0 給 Tiny server。
(1) URI 中 ?& 各分隔什麼?若參數含空白該如何編碼?
(2) Tiny 如何判斷這個請求是 static 還是 dynamic?URI 開頭的 / 是 Linux 根目錄嗎?


Question 11 - CGI 參數與輸出路徑 [application]

承上題,Tiny 收到 /cgi-bin/adder?15000&213 後 fork 一個 child 執行 CGI 程式 adder:

Setenv("QUERY_STRING", cgiargs, 1);
Dup2(fd, STDOUT_FILENO);          /* fd 是 connected descriptor */
Execve(filename, emptylist, environ);

請說明:(1) adder 如何取得參數 15000&213?(2) adder 對 printf 寫出的內容為什麼會直接到達 client?(3) Content-typeContent-length 這兩個 response headers 由誰產生?為什麼?


Question 12 - 為何區分兩種 Descriptor [analysis]

有同學認為 accept 回傳新的 connected descriptor 是「多餘的複雜化」:server 直接用 listening descriptor 跟 client 通訊不就好了?請分析區分兩種 descriptor 的真正目的,並說明若 server 重啟時 bind 出現 "Address already in use",該用什麼解決、否則會怎樣。


Question 13 - 已關閉連線的 write 與 EOF [analysis]

使用者在瀏覽器按下 Stop 關閉連線後,Tiny 仍繼續對該 connected descriptor 執行兩次 write。請分析:第一次與第二次 write 各發生什麼事?預設行為對 server 有何致命影響?強健的 server 應如何處理?另外,連線上的 EOF 是一個字元嗎?server 如何偵測?