Http学习

Http学习笔记

Http的简单了解

  • Http建立的3次握手与断开连接的4次挥手
    该图片来自《图解Http》

    注: 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优先的语言
Authorizationweb认证信息
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-AgentHTTP客户端的程序信息
Accept-Ranges响应首部是否接受字节范围请求
Age资源创建后经过的时间
ETag资源的匹配信息
Location重定向至的URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After重试的时机
ServerHTTP服务器的安装信息
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章,里面有详细的讲解。其实,这一部分内容都是来自该书。自己整理一遍只是为了加深一下印象。^_^

如有错误,还请指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值