HTTP协议
思维导图:
1. HTTP协议
1.1 HTTP协议概述
1)协议类型
HTTP:Hyper Text Transfer Protocol
应用层协议,文本协议
占据端:80/tcp
http协议是无状态的(stateless),服务器无法持续追踪访问者来源,但我们可以通过cookie、session来实现此功能。
2)协议版本
http/0.9:原型版本,功能简陋
http/1.0:cache、MIME、method
- MIME:Multipurpose Internet Mail Extension 多用途互联网邮件扩展,从而使得一个文本协议能够传输一个非文本数据了
- method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
http/1.1:增加了缓存功能
- spdy:谷歌公司研发的改进版
http/2.0:借鉴了spdy
3)MIME
MIME:Multipurpose Internet Mail Extension 多用途互联网邮件扩展,从而使得一个文本协议能够传输一个非文本数据
MIME type帮助浏览器识别一个HTTP请求返回的是什么内容的数据,应该如何打开、如何显示
MIME的常见形式是一个主类型加一个子类型,用斜线分隔,比如text/html、application/javascript、image/png等
MIME是邮件和HTTP协议中用来标注网络数据的信息格式的,比如http://bbs.xxx.com/images/logo.jpg,它就对应服务器上的一个/xxxxxx/images/logo.jpg文件。在有人访问它时,返回的MIME type是image/jpeg
1.2 HTTP工作模式
1)http请求和响应
http请求报文:http request
http响应报文:http response
2)http事务
一次http事务:请求 <--> 响应
一个请求和一次响应共同构成一次http事务
3)web资源(web resource)
静态资源:无需服务器端做出额外处理
- .jpg,.png,.gif,.html,.txt,.js,.css,.mp3,.avi
动态资源:服务端需要通过执行程序做出处理,发送给客户端的是运行的结果
- .php,.jsp
4)资源标识机制URL
1.3 URI和URL
1)URI
URI,统一资源标志符(Uniform Resource Identifier, URI)表示的是web上每一种可用的资源,如HTML文档、图像、视频片段、程序等都由一个URI进行标识。
URI的组成:通常由三部分组成(这只是一般URI资源的命名方式,只要是可以唯一标识资源的都被称为URI,下面三条合在一起是URI的充分不必要条件)
- 资源的命名机制
- 存放资源的主机名
- 资源自身的名称
例如:https://www.cnblogs.com/hgzero/p/13409248.html ,可以这样解释它:
# 1.这是一个可以通过https协议访问的资源 # 2.位于主机www.cnblogs.com上 # 3.通过 /hgzero/p/13409248.html 可以对该资源进行唯一标识(这个不一定是完整的路径) # 注意:上面三点并不是URI的必要条件,URI只是一种概念,只要它唯一标识一个资源就可以。
2)URL
URL(Uniform Resource Locator),统一资源定位符,URL是URI的一个子集。
URL是Internet上描述信息资源的字符串,采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等,URL是URI概念的一种实现方式。
URL的格式:
Scheme://hostname[:port] / path / [;parameters][?query]#fragment # URL的格式由三部分组成: # 1. 第一部分:协议(或称为服务方式),URL方案 # 2. 第二部分:存有该资源的主机IP地址(有时也包括端口号),服务器地址 IP:PORT # 3. 第三部分:主机资源的具体地址,如目录和文件名等 # 第一部分和第二部分用“://”符号隔开, # 第二部分和第三部分用“/”符号隔开。 # 第一部分和第二部分是不可缺少的,第三部分有时可以省略 # params:参数 http://www.hgzero.com/bbs/hello;gender=f # query:查询条件 http://www.hgzero.com/bbs/item.php?username=tom&title=abc # frag:标识 https://www.hgzero.com/index.html#ch-Boot-x86
3)URI和URL的区别
URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。
URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。
URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
1.4 一次完整的http请求处理过程
- 建立或处理连接:接收请求或拒绝请求
- 接受请求:接受来自于网络上的主机请求报文中对某特定资源的一次请求的过程
- 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
- 访问资源:获取请求报文中请求的资源
- 构建响应报文
- 发送响应报文
- 记录日志
1.5 并发访问模型
单进程IO模型:启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串行响应
多进程IO结构:并行启动多个进程,每个进程响应一个请求
复用的IO结构:一个进程响应n个请求
- 多线程模式:一个进程生成n个线程,一个线程处理一个请求
- 事件驱动(event-driven):一个进程直接处理n个请求
复用的多进程IO结构:启动多个(m)个进程,每个进程生成(n)个线程
- 响应的请求数量:m*n
1.6 处理请求
分析请求报文的http请求报文首部
# http协议 http请求报文首部 http响应报文首部 # 请求报文首部的格式: <method> <URL> <VERSION> HEADERS:(name:value) <request body>
1.7 访问资源
存放了web资源的主机负责向请求者提供静态资源或动态资源运行生成的结果,这些资源通常应该放置于本地文件系统某路径下,此路径称为DocRoot
# 比如/var/www/html/ 为文档根路径,下面有文件 image/logo.jpg # 这个资源的URL:http://www.hgzerowzh.com/images/logo.jpg
web服务器的资源路径映射方式
# docroot # alias # 虚拟主机的docroot # 用户家目录的docroot
1.8 http请求处理的连接模式
- 保持连接(长连接):keep-alive
- 时间
- 数量
- 非保持连接(短连接)
2. HTTP报文
2.1 http报文语法格式
# request报文格式 <method> <request-URL> <version><handers> <entity-body> # response报文格式 <version> <status> <reason-phrase><headers><entity-body> # request报文示例: GET / HTTP/1.1 Host: www.hgzerowzh.com Connection: keep-alive Cache-Control: max-age=0 # response报文示例: HTTP/1.1 200 OK Date: Tue, 08 Oc t 2019 04:50:21 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive
2.2 method请求方法
请求方法:表明客户端希望服务器对资源执行的动作
2.3 version版本号
HTTP/<major>.<minor> # 协议名/主版本号.次版本号 # 例如:HTTP/1.1、HTTP/1.0
2.4 status状态码
1)状态码类型
# 三位数字,如 200,301,302,404,502,标记请求处理过程中发生的情况 1xx:100-101, 信息提示 2xx:200-206, 成功 3xx:300-305, 重定向 4xx:400-415, 错误类信息,客户端错误 5xx:500-505, 错误类信息,服务器端错误
2)常用的状态码
# 常用的状态码: 200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK 301: 请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently (永久重定向) 302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置;Found (临时重定向) 304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
400: 访问的页面域名不存在或者请求错误;bad request invalid hostname 401: 需要输入账号和密码认证方能访问资源;Unauthorized 403: 请求被禁止;Forbidden 404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error 502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
2.5 reason-phrase原因短语
状态码所标记的状态的简要描述,如:
# 各个状态码所对应的原因短语 200 OK 301 Moved Permanently 302 Found
304 Not Modified
403 Forbidden
404 Not Found
2.6 headers
每个请求或响应报文都可以包含任意个首部
每个首部都有首部名称,后面跟一个冒号,然后跟上一个可选空格,接受的是一个值
header的格式(Name: Value)
Cache-Control:public, max-age=600 Connection:keep-alive Content-Type:image/png Date:Tue, 28 Apr 2015 01:43:54 GMT ETag:"5af34e-ce6-504ea605b2e40" Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT Accept:image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Cache-Control:max-age=0 Connection:keep-alive Host:access.redhat.com If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT If-None-Match:"5af34e-ce6-504ea605b2e40" Referer:https://access.redhat.com User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64)
2.7 首部的分类
- 通用首部、请求首部、响应首部、实体首部、扩展首部
1)通用首部
Date: 报文的创建时间 Connection: 连接时间,如keep-alive,close Via: 显示报文经过的中间节点 Cache-Control:控制缓存 Pragma:
2)请求首部
Accept:通知服务器主机可接受的媒体类型(MIME,text/html,application/javascript,image/jpeg) Accept-Charset: 默认字符集 Accept-Encoding:接受编码格式,如gzip,一般指压缩机制 Accept-Language:接受的语言 Client-IP: Host: 请求的服务器名称和端口号 Referer: 包含当前正在请求的资源的上一级资源 User-Agent: 客户端代理 # 条件式请求首部 Expect: If-Modified-Since: 主从指定的时间之后,请求的资源是否发生过修改 If-Unmodified-Since: If-None-Match: 本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配 If-Match # 安全请求首部 Authorization: 向服务器发送认证信息,如住账号和密码 Cookie: 客户端向服务器发送cookie Cookie2: # 代理请求首部 Proxy-Authorization:向代理服务器认证
3)响应首部
# 信息性: Age:响应持续时长 Server:服务器程序软件名称和版本 # 协商首部:某资源有多种表示方法时使用 Accept-Ranges:服务器可接受的请求范围类型 Vary:服务器查看的其他首部列表 # 安全响应首部: Set-Cookie:向客户端设置cookie Set-Cookie2: WWW-Authenticate:来自服务器的对客户端的质询认证表单
4)实体首部
Allow:列出对此实体可使用的请求方法 Location:告诉客户端真正的实体位于何处 Content-Encoding: Content-Language: Content-Length: 主体的长度 Content-Location: 实体真正所处位置; Content-Type:主体的对象类型 # 缓存相关: ETag:实体的扩展标签; Expires:实体的过期时间; Last-Modified:最后一次修改的时间
3. Curl命令的使用
3.1 curl命令说明
curl命令是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议,支持文件断点续传。
3.2 curl使用语法及参数
# 使用语法:
curl [options] [URL...] #curl的常用选项: -A/--user-agent <string> 设置用户代理发送给服务器 示例:curl -A "hgzero-chrome" 192.168.1.111 -I/--head 只显示响应报文首部信息 -e/--referer <URL> 来源网址 --compressed 要求返回的是压缩的格式 -X 选项可以自定义url的请求方法 curl -X PURGE http://172.16.0.6/index.html
3.3 elinks
# 使用语法 elinks [OPTION] ... [URL] ... # 使用参数 --dump:不进入交互式模式,而直接将URL的内容输出至标准输出