简述 HTTP(该文章并不完整,会持续更新)
内容来着 HTTP 图解
本文主要内容:
了解 web 及网络基础
简单的 http 协议
了解 web 及网络基础
1、使用 http 协议访问 web
当我们用网页浏览器(web browser)的地址栏中输入 URL 时,Web 页面的呈现过程:
输入 URL 时,可以看到 web 页面,即使不了解运作原理,也能看到页面
输入 URL 后,信息会被送往某处
然后从某处获得的回复,内容就会显示在 web 页面上
web 页面不可能凭空显示出来,根据 web 浏览器地址栏中指定的 URL,web 浏览器会从服务器端获取文件资源等信息,从而显示 web 页面。
像这一套流程就可以称作是客户端(client)向服务端(server)获取服务器资源
web 使用一种名为 HTTP(HyperText Transfer Protocol),超文本传输协议作为规范,完成从客户端到服务端等一系列运作过程。而协议是指规则的约定。可以理解成,web 是建立在 HTTP 协议上通信的。
2、网络基础 TCP/IP
为了了解 HTTP,必须的了解 TCP/IP 协议族。
通常使用的网络实在 TCP/IP 协议族的基础上运作的。而 HTTP 就属于他的一个子集。
2.1、TCP/IP 协议族
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如:如何探测到通信目标、由哪一方先发起通信、使用哪种语言等等好多规则。然而这种规则就是所谓的协议(protocol),你要用我就按照我协议的规则来。常用协议有:tcp,http,ftp,dhcp,dns,ip,pppoe,udp,snmp,icmp 等等。
像这样把与互联网关联的协议集合起来总称 TCP/IP,TCP/IP 实在 IP 协议通信过程中,使用到的协议族的统称
2.2、TCP/ip 的分层管理
TCP/IP 协议族重要的一点就是分层。TCP/IP 协议族按层次划分分别是:应用层、传输层、网络层和数据链路层。把塔层次化是有好处的。比如:当某个地方需求变更时,就必须吧所有的整体替换掉。而分层之后只需要把变动的层替换掉即可。下面介绍一下每个层次的作用
应用层
应用层决定了向用户提供应用服务时通信的活动。比如:ftp,dns 服务就是其中的两类。HTTP 协议也处于该层。
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP 和 UDP。
网络层
网络层用来处理网络上流动的数据包。数据包是网络传输的最小单位。该层规定了通过怎样的路径到达对方计算机,并把数据包发送给对方。
链路层
用来处理链接网络的硬件部分。包括操作系统、硬件的设备驱动、网卡及光纤等物理可见部分
2.3、TCP/IP 通信传输流
比如说我想看百度网页:流程如下:
客户端在应用层发出一个想看某个 WEB 页面的 HTTP 请求的时候;
接着为了传输方便,在传输层把应用层收到的数据进行分割,并在各个报文上打上标记序号及端口 - – 号后转发给网络层;
在网络层增加作为通信目的的 MAC 地址后转发给链路层,这样一来发送网络的通信请求就准备齐全了;
接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层;
当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP 请求了。
发送端在层与层之间传输数据时,每经过一层时必定会打上一个该层的首部信息。接收端没经过一层,会把消去。这种数据信心包装叫做封装。
TCP/IP 传输是三次握手,四次断开。一张图搞定一切。
3、URI 和 URL
URI 用字符串标示某一互联网资源,而 URL 表示资源的地点。可见 URL 是 URI 的子集。
URI 要使用涵盖全部必要信息的 URI、绝对 URL 以及相对 URL。相对 URL 是指从浏览器中基本 URI 处理的 URL,来先看下 URI 的格式
简单的 HTTP 协议
1、通信过程
HTTP 协议规定,请求从客户端发出,最后服务器端相应该请求并返回。换个意思就是客户端建立通信的,服务器端在没有接收到请求之前不会发送响应。来一个示例:
下面的内容是客户端想服务端发的求求内容
GET / HTTP/1.1HOST: HACKR.JP 起始行的 get 表示请求访问服务器的类型,成为方法。随后的字符串指明了请求访问的资源对象,也叫请求 URL,后面是版本号,用来提示客户端使用的 HTTP 协议功能
总结:请求报文是由请求方法、请求 URL、协议版本、可选的气你去头和内容实体构成的。
接下来服务器端接收到请求,会将请求内容的处理结果以相应的形式返回。
HTTP /1.1 200 OKDate:Tue,10 JUL 2016 10:50:20 GMTContent-length:398Content-Type:text/html 来用图片详细讲解一下:
2、HTTP 是不保存状态的协议
HTTP 是一种不报错状态,即无状态协议。http 协议自身不对请求和相应之间的通信状态进行保存,也就是说在 HTTP 这个级别,协议对于发送过得请求和响应不做持久化处理。
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本事并不保留之前的请求或响应报文的信息。这是为了处理大量事务,确保协议的课伸缩性,而特意吧 HTTP 协议设计成如此简单的。但是也存在弊端,当业务处理变得棘手的情况多了, 比如用户登录一家网站,即使他跳转到别的页面后,也需要保持登录状态,然而 cookie 就诞生了。有了 cookie 再用 http 协议通信,就可以管理状态了。
3、HTTP 方法
3.1、GET 获取资源
get 方法是用来请求访问已被 URL 识别的资源。指定的资源经服务端解析后返回响应内容。也就是说,请求的资源是文本,那就保持原样返回;如果像 cgi 那样的程序,则返回经过执行后的输出结果
使用 get 方法的请求响应的例子:
3.2、POST 传输实体主体
post 方法用来传输实体的主体。虽然用 get 方法也可以传输实体的主体,但是一般不用 get 方法进行传输,而是用 post 方法。虽说 post 的功能与 get 很相似,但是 post 的主要目的并不是获取相应的主体内容。
使用 post 方法请求的例子:
3.3、PUT 传输文件
put 方法用来传输文件,就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 url 指定的位置。由于 put 的方法不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的 web 网站不适用该方法。
使用 put 方法请求的例子:
3.4、head 获取报文首部
head 和 get 方法一样,只是不返回报文主体部分,用于确认 url 的有效性及资源更新的日期时间等。
使用 head 方法请求的例子:
3.5、DELETE 删除文件
delete 方法用来删除文件,是与 put 相反的方法,delete 方法按照请求 url 删除指定的资源。其本质和 put 方法一样不带验证机制,所以不适用 delete 方法。
使用 delete 方法请求的例子:
下面列举一些方法:其中 link 和 unlink 已被 HTTP/1.1 废弃,不在支持
4、持久化
当频繁访问 web 网页的时候,每次都要进行 TCP/IP 通信,tcp/ip 通信三次握手四次断开,代价是很昂贵的,增加了通信量的开销,为解决上述 TCP 连接的问题,HTTP 就诞生了持久连接的方法。特点是只要任意一端没有明确提出断开连接,则保持 TCP 连接状态
持久化连接减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务端的负载。另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早的结束,这样 web 页面的显示速度也就相应的提高了。
5、使用 cookie 的状态管理
cookie 技术通过在请求和相应报文中写入 cookie 信息来控制客户端的状态。cookie 会根据从服务端发送的相应报文内的一个叫做 set-cookie 的首部字段信息,通知客户端保存 cookie。当下次客户端再往服务器发送请求的时候,客户端会自动在请求头加入 cookie 值后发送出去。下面带图分析下过程
没有 cookie 状态下的请求
第二次以后(存有 cookie 信息状态)的请求
注:百度云链接:HTTP 图解
HTTP 状态码(HTTP Status Code)
一些常见的状态码为:
200 // 服务器成功返回网页
404 // 请求的网页不存在
503 // 服务器不可用
1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态码。代码说明
100 // 继续 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 // 切换协议 请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx(成功)
表示成功处理了请求的状态码。代码说明
200 // 成功 服务器已经成功处理了请求。通常,这表示服务器提供了请求的网页。
201 // 已创建 请求成功并且服务器创建了新的资源
202 // 已接受 服务器已接受请求,但尚未处理
203 // 非授权信息 服务器已经成功处理了请求,但返回的信息可能来自另一来源
204 // 无内容 服务器成功处理了请求,但没有返回任何内容
205 // 重置内容 服务器成功处理了请求,但没有返回任何内容
206 // 部分内容 服务器成功处理了部分 GET 请求
3xx(重定向)
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。代码说明
300 // 多种选择 针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。
301 // 永久移动 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 // 临时移动 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
303 // 查看其它位置 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
304 // 未修改 自动上次请求后,请求的网页未修改过。服务器返回此响应,不会返回网页的内容
305 // 使用代理 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
307 // 临时性重定向 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有的位置来进行以后的请求
4xx(请求错误)
这些状态码表示请求可能出错,妨碍了服务器的处理。
代码说明
400 // 错误请求 服务器不理解请求的语法
401 // 未授权 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应
403 // 禁止 服务器拒绝请求
404 // 未找到 服务器找不到请求的网页
405 // 方法禁用 禁用请求中指定的方法
406 // 不接受 无法使用请求的内容特性响应请求的网页
407 // 需要代理授权 此状态码与 401(未授权)类似,但指定请求者应当授权使用代理
408 // 请求超时 服务器等候请求时发生超时
409 // 冲突 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
410 // 已删除 如果请求的资源已永久删除,服务器就会返回此响应
411 // 需要有效长度 服务器不接受不含有效内容长度标头字段的请求
412 // 未满足前提条件 服务器未满足请求者在请求者设置的其中一个前提条件
413 // 请求实体过大 服务器无法处理请求,因为请求实体过大,超出了服务器的处理能力
414 // 请求的 URI 过长 请求的 URI(通常为网址)过长,服务器无法处理
415 // 不支持媒体类型 请求的格式不受请求页面的支持
416 // 请求范围不符合要求 如果页面无法提供请求的范围,则服务器会返回此状态码
417 // 未满足期望值 服务器未满足“期望”请求标头字段的要求
5xx(服务器错误)
这些状态码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
代码说明
500 // 服务器内部错误 服务器遇到错误,无法完成请求
501 // 尚未实施 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
502 // 错误网关 服务器作为网关或代理,从上游服务器无法收到无效响应
503 // 服务器不可用 服务器目前无法使用(由于超载或者停机维护)。通常,这只是暂时状态
504 // 网关超时 服务器作为网关代理,但是没有及时从上游服务器收到请求
505 //HTTP 版本不受支持 服务器不支持请求中所用的 HTTP 协议版本