Http学习

Http学习笔记

Http的简单了解

  • Http建立的3次握手与断开连接的4次挥手
    Http学习_第1张图片

    注: 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章,里面有详细的讲解。其实,这一部分内容都是来自该书。自己整理一遍只是为了加深一下印象。^_^

如有错误,还请指出!

你可能感兴趣的:(Java,网络)