Http学习

来源:互联网 发布:京东关键词优化 编辑:程序博客网 时间:2024/05/22 08:12

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.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdch, brAccept-Language:zh-CN,zh;q=0.8Cache-Control:max-age=0Connection:keep-aliveContent-Type: multipart/form-data; boundary=OCqxMF6-JxtxoM   // boundary是随机生成的一段字符Cookie:xxxxxxxxxxxxxxxHost:facebook.comUser-Agent:xxxxxxxx                                                // 注意空行--OCqxMF6-JxtxoM                                // 参数开始位置以--开头,后面拼接 boundaryContent-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-8Content-Transfer-Encoding: 8bitasdfadfadf                                              // 参数值--OCqxMF6-JxtxoM--                                      // 代表结束

请求第一行分别是:请求方法 请求URI 协议版本

紧接着,后面的就是请求的首部。 请求首部的格式是key:value的形式。这些首部字段是可选的。正常情况下,如果你还有参数,则后面会紧跟请求主体。上面的例子中展示的是一种比较复杂的post情况,请求的数据格式为multipart/form-data, 一定要注意这个格式,格式错误会导致服务器无法解析。

当然,如果是GET请求的话,报文会比POST简单很多。GET请求是没有请求主体的,也就是说只有固定的第一行:请求方法 请求URI 协议版本 以及后续紧跟的可选的首部字段。这里就不举例了。

响应报文的格式解析

HTTP/1.1 200 OKCache-Control:private, max-age=0, must-revalidateContent-Encoding:gzipContent-Type:text/html; charset=utf-8Date:Wed, 26 Apr 2017 09:53:55 GMTETag:"ad7d17d1dcf7090bcba58445a76bb719"Server:ITeye SERVERSet-Cookie:a3239dd936188fbf05c2a10ca0c62290aac2f; domain=.iteye.com; path=/; HttpOnlyTransfer-Encoding:chunkedVary: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章,里面有详细的讲解。其实,这一部分内容都是来自该书。自己整理一遍只是为了加深一下印象。^_^

如有错误,还请指出!

0 0