天天看點

CMU CSAPP筆記 第十一章

基本網絡知識

  • 用戶端和伺服器
    • 用戶端和伺服器都是程序
    • 一台主機可以同時運作多個不同的用戶端和伺服器,一個用戶端和伺服器的事務可以運作在不同的主機
  • 網絡系統層次
    • LAN(區域網路)
      • Ethernet(以太網)
    • WAN(廣域網)
      CMU CSAPP筆記 第十一章
    CMU CSAPP筆記 第十一章
  • 資料的傳輸過程
    CMU CSAPP筆記 第十一章
CMU CSAPP筆記 第十一章
  • TCP/IP協定
    • IP
      • 基本的命名方法和遞送機制
      • IPv4和IPv6
        • 最初的網際網路協定使用32位位址,稱位IPv4,而IPv6有128位位址
      • IP位址通常以一種點分十進制來表示
        • 128.2.194.242就是位址0x8002c2f2
    • UDP
      • 不可靠資料報協定
      • 使得包可以在程序間而不是主機間傳遞
    • TCP
      • 提供程序間可靠的雙向連結
  • 域名
    • 從後往前解析
    • 通過一個叫做DNS的分布式資料庫來維護
    • 将IP位址與域名映射
      • 一個IP位址可以映射到多個域名,一個域名也可以映射到多個IP位址
      • 每個主機都有本地域名localhost
      • 通過Linux下的nslookup指令可以檢視域名對應的IP位址
CMU CSAPP筆記 第十一章

Socekt

  • socket(套位元組)
    • 套位元組位址:IP位址:端口
      • 例如199.16.156.198:80
    • 端口分為臨時端口和知名端口
      • 客服端一般為臨時端口,伺服器一般為知名端口,有相應的服務名
      • WEB伺服器端口通常為80(http),電子郵件端口為25(smtp)
      • 端口為16bit整數
  • socket接口
    • socket從Linux程式角度來看就是一個file descriptor
    • 位址結構
      CMU CSAPP筆記 第十一章
CMU CSAPP筆記 第十一章
  • 伺服器和用戶端的連接配接過程
    • 伺服器和用戶端都調用socket函數建立檔案描述符
    • 伺服器調用bind函數準備連接配接
    • 由于預設socket描述符用于用戶端,伺服器調用listen函數将其轉變為監聽描述符,這個描述符伺服器自開機運作隻建立一次
    • 最後調用accept函數等待伺服器請求到達,傳回已連接配接描述符,這個描述符每當一個伺服器和客服端連接配接就建立一個
      • 區分監聽和已連接配接的目的是建立并發伺服器,同時處理多個用戶端
    • 同時用戶端(使用者)調用connect函數準備連接配接,打開clientfd描述符
    • 當用戶端斷開後,将會向伺服器發送EOF結束符,伺服器收到後關閉
      • EOF實質上不是一個字元,而是一個核心檢測的條件
  • listen函數傳回的監聽描述符和accept傳回的已連接配接描述符是不同的
    • 前者在伺服器開始運作的整個周期内隻有一個,後者每和一個用戶端連接配接就産生一個
    • 這樣是為了一個伺服器可以和多個用戶端連接配接,進而實作并發伺服器
  • 如圖, 可以用open_clientfd和open_listenfd函數封裝這些函數
CMU CSAPP筆記 第十一章
  • 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

HTTP事務

  • HTTP請求
    • 首先要連接配接伺服器和用戶端
    • 格式:method URI version
    • method一般為 GET
    • URI為URL端口後面的部分
    • version為HTTP版本,一般為HTTP/1.0或HTTP\1.1
  • HTTP響應的常見狀态碼
CMU CSAPP筆記 第十一章
  • 傳遞動态内容
    • ?分割檔案名和參數
    • 每個參數用 & 隔開
    • 舉例:

      GET /adder?1500&213 HTTP/1.1