基本網絡知識
- 用戶端和伺服器
- 用戶端和伺服器都是程序
- 一台主機可以同時運作多個不同的用戶端和伺服器,一個用戶端和伺服器的事務可以運作在不同的主機
- 網絡系統層次
- LAN(區域網路)
- Ethernet(以太網)
- WAN(廣域網)
CMU CSAPP筆記 第十一章
CMU CSAPP筆記 第十一章 - LAN(區域網路)
- 資料的傳輸過程
CMU CSAPP筆記 第十一章
- TCP/IP協定
- IP
- 基本的命名方法和遞送機制
- IPv4和IPv6
- 最初的網際網路協定使用32位位址,稱位IPv4,而IPv6有128位位址
- IP位址通常以一種點分十進制來表示
- 128.2.194.242就是位址0x8002c2f2
- UDP
- 不可靠資料報協定
- 使得包可以在程序間而不是主機間傳遞
- TCP
- 提供程序間可靠的雙向連結
- IP
- 域名
- 從後往前解析
- 通過一個叫做DNS的分布式資料庫來維護
- 将IP位址與域名映射
- 一個IP位址可以映射到多個域名,一個域名也可以映射到多個IP位址
- 每個主機都有本地域名localhost
- 通過Linux下的nslookup指令可以檢視域名對應的IP位址
Socekt
- socket(套位元組)
- 套位元組位址:IP位址:端口
- 例如199.16.156.198:80
- 端口分為臨時端口和知名端口
- 客服端一般為臨時端口,伺服器一般為知名端口,有相應的服務名
- WEB伺服器端口通常為80(http),電子郵件端口為25(smtp)
- 端口為16bit整數
- 套位元組位址:IP位址:端口
- socket接口
- socket從Linux程式角度來看就是一個file descriptor
- 位址結構
CMU CSAPP筆記 第十一章
- 伺服器和用戶端的連接配接過程
- 伺服器和用戶端都調用socket函數建立檔案描述符
- 伺服器調用bind函數準備連接配接
- 由于預設socket描述符用于用戶端,伺服器調用listen函數将其轉變為監聽描述符,這個描述符伺服器自開機運作隻建立一次
- 最後調用accept函數等待伺服器請求到達,傳回已連接配接描述符,這個描述符每當一個伺服器和客服端連接配接就建立一個
- 區分監聽和已連接配接的目的是建立并發伺服器,同時處理多個用戶端
- 同時用戶端(使用者)調用connect函數準備連接配接,打開clientfd描述符
- 當用戶端斷開後,将會向伺服器發送EOF結束符,伺服器收到後關閉
- EOF實質上不是一個字元,而是一個核心檢測的條件
- listen函數傳回的監聽描述符和accept傳回的已連接配接描述符是不同的
- 前者在伺服器開始運作的整個周期内隻有一個,後者每和一個用戶端連接配接就産生一個
- 這樣是為了一個伺服器可以和多個用戶端連接配接,進而實作并發伺服器
- 如圖, 可以用open_clientfd和open_listenfd函數封裝這些函數
- getaddrinfo函數
- 可以編寫獨立于特定版本的IP協定的網絡程式
- 将主機名,主機位址,服務名和端口号轉換為套位元組位址結構
WEB伺服器
- web伺服器向用戶端提供的内容
- 每條伺服器傳回的内容都和他管理的某個檔案相關聯,這些檔案都有一個唯一的名字URL
- 例如: http://www.google.com:80/index.html
- 客服端使用到端口前的部分(http://www.google.com:80),伺服器使用端口後的部分(/index.html)
- 預設端口為80
- 端口後不加字尾預設為補全缺失的 ‘/’ 并取出網站的首頁
- 靜态内容
- 讀取伺服器上的磁盤檔案并傳回給用戶端
- 例如 http://www.w3.org/Protocols/rfc2616/rfc2616.html
- 動态内容
- 運作一個可執行檔案并将輸出傳回給用戶端
- 例如 http://add.com/cgi-bin/adder?15213&18213
- 運作一個可執行檔案并将輸出傳回給用戶端
- 每條伺服器傳回的内容都和他管理的某個檔案相關聯,這些檔案都有一個唯一的名字URL
HTTP事務
- HTTP請求
- 首先要連接配接伺服器和用戶端
- 格式:method URI version
- method一般為 GET
- URI為URL端口後面的部分
- version為HTTP版本,一般為HTTP/1.0或HTTP\1.1
- HTTP響應的常見狀态碼
- 傳遞動态内容
- ?分割檔案名和參數
- 每個參數用 & 隔開
- 舉例:
GET /adder?1500&213 HTTP/1.1