前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

作者头像
sickworm
发布2019-12-23 11:18:45
6790
发布2019-12-23 11:18:45
举报
文章被收录于专栏:sickwormsickworm

  • 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://cloud.tencent.com/developer/article/1557793

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年2月6日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档