深入理解電腦系統(第三版)/ CSAPP 雜談,第11章:網路編程

  • 2019 年 12 月 23 日
  • 筆記

  • IP 協議提供基本的命名方法和遞送機制
  • UDP 稍微擴展了 IP 協議(增加埠概念),使其從原來的主機間傳送變成可以在進程間傳送(通過埠區分不同進程),通訊粒度從主機變為進程
  • TCP 基於 IP 協議提供進程間可靠通訊
  • 網路通訊總是使用大端傳輸(網路位元組序=大端)
  • Linux,Mac,Windows 都是使用 socket 通訊。

int socket(int domain, int type, int protocol) // 創建套接字描述符,成功返回非負數描述符,失敗為-1 int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen) // 連接伺服器,成功為 0,失敗為 -1 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) // 連接客戶端,成功為 0,失敗為 -1 int listen(int sockfd, int backlog) // 等待客戶端連接。此函數將主動套接字轉化為監聽套接字,成功為 0,失敗為 -1 int accept(int listenfd, struct sockaddr *addr, socklen_t addrlen) // 等待來自客戶端的連接,成功返回非負數連接描述符,失敗為-1 int getaddrinfo(const char* host, const char* service, const struct addrinfo* hints, struct addrinfo** result) // 用於主機名,主機地址,服務名,埠號的字元串表示轉換成 addrinfo // addrinfo 是一個列表,客戶端調用 getaddrinfo 後需要遍歷 result 這個列表,直到某個元素可以執行 socket 和 connect 成功 // host 可以是域名也可以是 ip 地址 // service 可以是服務名(http)或埠號 // hints 用於設置一些參數以便對返回的 result 列表做更好的控制 int getnameinfo(const struct sockaddr *sa, socklen_t salen, char* host, size_t hostlen, char *service, size_t servlen, int flags) // 用於 sockaddr 轉換成 主機名,主機地址,服務名,埠號的字元串表示 // 簡化版(非 Linux 內核內置) int open_clientfd(char *hostname, char *port) // 客戶端連接伺服器 int open_listenfd(char* port) // 伺服器監聽埠

123456789101112131415161718192021222324

int socket(int domain, int type, int protocol) // 創建套接字描述符,成功返回非負數描述符,失敗為-1int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen) // 連接伺服器,成功為 0,失敗為 -1 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) // 連接客戶端,成功為 0,失敗為 -1int listen(int sockfd, int backlog) // 等待客戶端連接。此函數將主動套接字轉化為監聽套接字,成功為 0,失敗為 -1int accept(int listenfd, struct sockaddr *addr, socklen_t addrlen) // 等待來自客戶端的連接,成功返回非負數連接描述符,失敗為-1 int getaddrinfo(const char* host, const char* service,    const struct addrinfo* hints, struct addrinfo** result)// 用於主機名,主機地址,服務名,埠號的字元串表示轉換成 addrinfo// addrinfo 是一個列表,客戶端調用 getaddrinfo 後需要遍歷 result 這個列表,直到某個元素可以執行 socket 和 connect 成功// host 可以是域名也可以是 ip 地址// service 可以是服務名(http)或埠號// hints 用於設置一些參數以便對返回的 result 列表做更好的控制 int getnameinfo(const struct sockaddr *sa, socklen_t salen,    char* host, size_t hostlen,    char *service, size_t servlen, int flags)// 用於 sockaddr 轉換成 主機名,主機地址,服務名,埠號的字元串表示 // 簡化版(非 Linux 內核內置)int open_clientfd(char *hostname, char *port) // 客戶端連接伺服器int open_listenfd(char* port) // 伺服器監聽埠

  • HTTP 請求由 request line,request header,空行 組成。

GET / HTTP/1.1 // method URI version Host: www.aol.com

1234

GET / HTTP/1.1  // method URI versionHost: www.aol.com

  • HTTP 有 GET,POST,OPTIONS,HEAD,PUT,DELETE,TRACE
  • HTTP 響應由 response line(1),response header,空行,response body,空行組成

HTTP/1.0 200 OK // version status-code status-message MINE-Version: 1.0 Date: Mon, 8 Jan 2010 4:59:42 GMT Server: Apache-Coyote/1.1 Content-Type: text/html Content-Length: 42092 <html> ... </html>

1234567891011

HTTP/1.0 200 OK  // version status-code status-messageMINE-Version: 1.0Date: Mon, 8 Jan 2010 4:59:42 GMTServer: Apache-Coyote/1.1Content-Type: text/htmlContent-Length: 42092 <html>...</html>

  • CGI,Common Gateway Interface,通用網關介面
  • CGI 收到客戶端請求後:解析參數,fork 子進程,子進程執行請求路徑上的程式,使用 dup2 將標準輸出重定向到客戶端的已連接描述符。

版權所有,轉載請註明出處: https://sickworm.com/?p=1665

Tags: