Http学习笔记
Http的简单了解
Http建立的3次握手与断开连接的4次挥手
注: SYN:synchronize ACK: acknowledgement FIN: finish
TCP/IP的4层模型分别为:应用层(HTTP),传输层(TCP/UDP),网络层(IP),数据链路层
OSI 7层模型分别为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
说到分层,就需要知道这么做的好处是什么?解耦,隔离
DNS : 域名解析服务;位于应用层,提供域名到IP地址之间的解析服务。
到这里,不得不说一个问题,我们在浏览器输入网址到网页的显示,中间经历了哪些过程?
当我们输入网址,敲回车之后,首先要经过DNS服务将输入的域名解析为对应的IP地址,然后利用HTTP协议生成针对目标服务器的请求报文,TCP协议将报文按照序号分割成多段,IP协议做中间传送。服务器端接收到报文后,会按照序号将报文重组,紧接着HTTP协议处理请求,并利用同样的方式返回相应的内容。 当然,这只是一个简化的流程,中间的细节很多,大家有空可以了解下。
Http请求报文与响应报文
- 请求报文由:请求方法,请求URI,协议版本,请求首部以及内容实体构成
- 响应报文由:协议版本,状态码,Msg,响应首部以及内容实体构成
请求方法
方法名称 | 方法介绍 | 方法名称 | 方法介绍 |
---|---|---|---|
GET | 获取资源 | DELETE | 删除文件 |
POST | 传输实体主体 | IPTIONS | 询问支持方法 |
PUT | 传输文件 | TRACE | 追踪路径 |
HEAD | 获得报文首部 | CONNECT | 要求用隧道协议连接代理 |
注意,方法名称区分大小写,在使用的时候要使用大写。 另还有两个请求方法,LINK,UNLINK 不过这两种方法在1.1版本中已经废弃了
请求报文的格式解析
首先,我们先看一个post请求报文的例子:
POST /search HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoM // boundary是随机生成的一段字符
Cookie:xxxxxxxxxxxxxxx
Host:facebook.com
User-Agent:xxxxxxxx
// 注意空行
--OCqxMF6-JxtxoM // 参数开始位置以--开头,后面拼接 boundary
Content-Disposition: form-data; name="key"; filename="fn" // 有文件的形式,fn是你的文件名称
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
// 注意这里的空行
xxxxxxxxx // 文件的二进制流
--OCqxMF6-JxtxoM
Content-Disposition: form-data; name="key" // 这里key代表你的参数名称
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
asdfadfadf // 参数值
--OCqxMF6-JxtxoM-- // 代表结束
请求第一行分别是:请求方法 请求URI 协议版本
紧接着,后面的就是请求的首部。 请求首部的格式是key:value的形式。这些首部字段是可选的。正常情况下,如果你还有参数,则后面会紧跟请求主体。上面的例子中展示的是一种比较复杂的post情况,请求的数据格式为multipart/form-data
, 一定要注意这个格式,格式错误会导致服务器无法解析。
当然,如果是GET请求的话,报文会比POST简单很多。GET请求是没有请求主体的,也就是说只有固定的第一行:请求方法 请求URI 协议版本 以及后续紧跟的可选的首部字段。这里就不举例了。
响应报文的格式解析
HTTP/1.1 200 OK
Cache-Control:private, max-age=0, must-revalidate
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Wed, 26 Apr 2017 09:53:55 GMT
ETag:"ad7d17d1dcf7090bcba58445a76bb719"
Server:ITeye SERVER
Set-Cookie:a3239dd936188fbf05c2a10ca0c62290aac2f; domain=.iteye.com; path=/; HttpOnly
Transfer-Encoding:chunked
Vary:Accept-Encoding
// 注意空行
xxxxxxxxxxx // 响应实体
响应第一行分别是:协议版本 响应状态码 Msg
紧接着,后面就是响应的首部。同样,和请求的首部格式一样,不过字段上可能会有些区别,具体可看下面的这张表。
状态码
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | 信息 | 接收的请求正在处理 |
2XX | 成功 | 请求正常处理完毕 |
3XX | 重定向(304不属于该范围) | 需要进行附加操作 |
4XX | 客户端错误 | 服务器无法处理请求 |
5XX | 服务器错误 | 服务器处理请求错误 |
一些常见的状态码
200 :一般网络请求成功的状态码都是这个
204:代表该请求只返回了不含响应实体的报文
301:永久重定向
302:临时重定向
400:请求报文有错
404:要请求的资源未找到
报文的首部字段
字段名称 | 所属类型 | 说明 |
---|---|---|
Cache-Control | 通用首部 | 控制缓存行为 |
Connection | 逐跳首部,连接的管理 | |
Date | 创建报文的时间 | |
Pragma | 报文指令 | |
Trailer | 报文末端的首部一览 | |
Transfer-Encoding | 报文主体的编码方式 | |
Upgrade | 升级为其他协议 | |
Via | 代理服务器的相关信息 | |
Warning | 错误通知 | |
Accept | 请求首部 | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 | |
Accept-Encoding | 优先的内容编码 | |
Accept-Language | 优先的语言 | |
Authorization | web认证信息 | |
Expect | 期待服务器的特定行为 | |
From | 用户的email地址 | |
Host | 请求资源所在的服务器 | |
If-Match | 比较实体标记 | |
If-Modified-Since | 比较资源的更新时间 | |
If-None-Match | 比较实体标记,与If-Match相反 | |
If-Range | 资源未更新时,发送实体Byte的范围请求 | |
If-Unmodefied-Since | 比较资源的更新时间,与If-Modified-Since相反 | |
Max-Forwards | 最大传输跳转数 | |
Proxy-Authorization | 代理服务器要求的客户端的认证信息 | |
Range | 实体的字节范围请求 | |
Referer | 对请求中URI的原始获取方 | |
TE | 传输编码的优先级 | |
User-Agent | HTTP客户端的程序信息 | |
Accept-Ranges | 响应首部 | 是否接受字节范围请求 |
Age | 资源创建后经过的时间 | |
ETag | 资源的匹配信息 | |
Location | 重定向至的URI | |
Proxy-Authenticate | 代理服务器对客户端的认证信息 | |
Retry-After | 重试的时机 | |
Server | HTTP服务器的安装信息 | |
Vary | 代理服务器缓存的管理信息 | |
WWW-Authenticate | 服务器对客户端的认证信息 | |
Allow | 实体首部 | 资源可以支持的HTTP方法 |
Content-Encoding | 内容适用的编码方式 | |
Content-Language | 内容的语言 | |
Content-Length | 内容的长度 | |
Content-Location | 替代对应资源的URI | |
Content-MD5 | 内容的MD5值 | |
Content-Range | 内容的范围 | |
Content-Type | 内容的媒体类型 | |
Expires | 内容过期的时间 | |
Last-Modified | 内容最后一次编辑的时间 | |
Cookie | 其他 | |
Set-Cookie | ||
Content-Disposition |
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分两种类型。一种是端到端首部(End-to-end Header),它要求该中类型的首部必须被保存和转发(如果经过代理服务器的话);一种是逐跳首部(Hop-by-hop Header),它只对单次转发有效,会因为通过缓存/代理服务器而不再转发,如果要使用该类型的首部,则需要提供Connection首部字段。
属于逐跳首部的字段有8种:Connection Keep-Alive Proxy-Authenticate
Proxy-Authorization Trailer TE Transfer-Encoding Upgrade。
其余的都是端到端首部
这一部分的内容很多,大家感兴趣的可以去看看《图解Http》这本书第6章,里面有详细的讲解。其实,这一部分内容都是来自该书。自己整理一遍只是为了加深一下印象。^_^
如有错误,还请指出!