Try   HackMD

CS:APP 第 11 章重點提示

網路程式設計

網頁伺服器

網頁伺服器運作流程如下:

典型 Client–Server 步驟:

  1. client 送出連線請求
  2. server 根據自身資源處理請求
  3. server 回傳結果
  4. client 取得回應並顯示

下圖說明程式面細節,左側為 client,右側為 server:

  1. 雙方先呼叫 getaddrinfo() 解析位址並取得 struct addrinfo,其中包含 IP、通訊埠與服務名稱等資訊
  2. 接著透過 socket() 建立通訊端,回傳一個檔案描述子;此步驟僅建立端點,不會觸發網路傳輸
  3. server 呼叫 bind() 將 socket 與指定 IP 與通訊埠連結 (位於核心空間)
  4. server 進入監聽狀態並呼叫 listen(),等待 client 連線
  5. server 使用 accept() 接受連線並為該 client 建立新的 socket
  6. client 端則在 connect() 發出連線要求並等待 server accept
  7. 連線建立後,雙方透過 readwrite (或封裝如 rio,reliable I/O)進行資料交換
  8. 當 client 結束會送出 EOF,server 接收後關閉對該 client 的 socket
  9. server 關閉後可選擇再接受下一個 client,或關閉整體服務

上述流程僅適合單一 client 與單一 server,若需支援多個 client,可採用《CS:APP》第 12 章介紹的並行模型。

server 持續監聽,當偵測到 client 請求便 fork (或在核心空間建立 worker) 處理個別連線。每個子行程或 worker 擁有獨立位址空間,因此彼此互不干擾,能滿足多 client 需求。從 server 角度來看,就是不斷接受連線並將處理工作分派給新的行程或執行緒。

相關報告