http
Table of Contents
套接字
- socket: (IP + port) 客户端的为随机端口
IP:port
IP.port
- unix sock: 基于文件系统通信实现, 主要用于本机和本机之间的通信
套接字的类型:
- TCP 套接字
- UDP 套接字
- raw 套接字 (由程序自身维护, 不经过传输层, 直接到网络层)
通信方式:
- 点对点
- c/s (client/server)
c/s:
通信子网: 通用传输
应用层协议: 不通用, 特定的 (http, https, smtp, pop, imap, ftp, ldap)
http 协议的版本:
http0.9: 只能传输 html 文档, 1991 年
http1.0: 支持多媒体数据的处理, 保持连接, 有缓存功能
http1.1: 支持更多的请求方法, 更加精细的缓存控制, 持久连接
MIME: Multipurpose Internet Mail Extension 互联网多用户邮件扩展
base64: 将二进制数据编码成文本发送, 并能够让接受方还原回原来的格式
HTTP 报文:
- HTTP 方法: GET、PUT、HEAD、POST、DELETE
- HTTP 请求: request
报文格式:
<method><request-url><version> <headers> <entity-body>
首部:
name: value content-type: images/gif
- HTTP 响应: response
报文格式:
<bersion><status><reason-phrase> <headers> <entity-body>
<method>: 请求方法, 希望服务器端执行的动作, 如 GET, HEAD, POST 等
<request-url>: 请求的资源, 可以是相对路径, 也可以是完整的 URL
<version>: 协议版本, 格式 HTTP/<major>, <minor>, 如 http/1.0
<headers>: HTTP 首部
<status>: 状态码
<reason-phrase>: 成功或者错误 的原因短语, 数字状态码易读信息
<entity-body>: 主体部分
http 协议: 是一种 stateless(无状态)协议
一次 HTTP 事务结束后, 链接即行断开
加速方式:
并行请求
持久连接
HTTP 的请求方法:
安全的方法: GET, HEAD
POST, PUT, DELETE, OPTIONS, TRACE
扩展方法: LOCK、MKCOL、COPY、MOVE
GET: 请求获取一个资源, 需要服务器发送
HEAD: 跟 GET 相似, 但其不需要服务发送资源而仅传回响应首部
POST: 支持 HTML 表单提交, 表单中有用户填入的数据, 这些数据会发送到服务器端, 由服务器存储至某位置(例如发送处理程序)
PUT: 与 GET 相反, 向服务写入文档;发布系统
DELETE: 请求删除 URL 指向的资源
OPTIONS: 探测服务器端对某资源所支持的请求方法
TRACE: 追踪请求资源要经过的防火墙、代理或网关等
- 响应报文代码
- 1XX: 信息性状态码
100: 继续
- 2XX: 成功状态码
200: OK
201: Created OK
- 3XX: 重定向状态码
301: Moved Permanebtly 永久重定向, 在响应报文中使用首部 "Location: URL" 指定资源现在所在的位置
302: Found 临时重定向, 在响应报文中使用首部 "Location: URL" 指定临时资源位置
304: Not Modified, 条件式请求中使用, 缓存
- 4XX: 客户端的错误
403: Forbidden,请求被服务器拒绝
404: Not Found, 服务器无法找到请求的 URL
405: Method Not Allowed,不允许使用此方法请求响应的 URL
- 5XX: 服务器类的错误
500: Internal Server Error, 服务器内部错误
502: Bad Gateway: 代理服务器从上游收到一条伪响应
503: Service Unavailable, 服务器此时无法提供服务, 但将来可能可用
- 1XX: 信息性状态码
一个 Web 请求的基本过程
建立连接
接收请求
处理请求
访问资源
构建响应
发送响应
记录日志
单线程 I/O 结构
多线程 I/O 结构
复用的 I/O 结构 (一个进程响应多个请求, 不安全)
复用多线程 I/O 结构: 多个线程, 每个线程响应多个请求
普通的请求过程
- 外部请求 –> 内核空间 –> 服务器(应用程序): 请求
- 服务器(应用程序) –> 内核空间: 加载所需的资源
- 内核空间 –> 应用程序 (应用程序包装响应报文)
- 应用程序 –> 发送相应报文
sendfile:
普通的请求过程的 第 3 个步骤
, 内核不到应用程序, 内核直接发送响应报文
日志写入缓冲: (堆一坨再写)