網頁伺服器運作流程如下:
典型 Client–Server 步驟:
下圖說明程式面細節,左側為 client,右側為 server:
getaddrinfo()
解析位址並取得 struct addrinfo
,其中包含 IP、通訊埠與服務名稱等資訊socket()
建立通訊端,回傳一個檔案描述子;此步驟僅建立端點,不會觸發網路傳輸bind()
將 socket 與指定 IP 與通訊埠連結 (位於核心空間)listen()
,等待 client 連線accept()
接受連線並為該 client 建立新的 socketconnect()
發出連線要求並等待 server accept
read
/write
(或封裝如 rio,reliable I/O)進行資料交換上述流程僅適合單一 client 與單一 server,若需支援多個 client,可採用《CS:APP》第 12 章介紹的並行模型。
server 持續監聽,當偵測到 client 請求便 fork
(或在核心空間建立 worker) 處理個別連線。每個子行程或 worker 擁有獨立位址空間,因此彼此互不干擾,能滿足多 client 需求。從 server 角度來看,就是不斷接受連線並將處理工作分派給新的行程或執行緒。