HTTP协议
Posted itdansan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP协议相关的知识,希望对你有一定的参考价值。
网络协议分层
应用层 -> HTTP FTP
为应用软件提供了很多服务
构建于TCP协议之上
屏蔽网络传输的相关细节
传输层 -> TCP UDP
向用户提供可靠的端对端的服务(end to end)
(数据量过大,会分包发送)
网络层 -> 为数据节点之间传输创建逻辑链路
数据链路层 -> 物理连接完成后,需要通过软件进行连接
物理层 -> 网线,光纤等传输硬件设备
TCP/IP协议族
计算机与网络设备相互通信,双方就必须基于相同的方法,无论是语言之间的通讯,设备,硬件,操作系统的通讯,怎么开始,怎么发起,怎么结束,都需要一种规则。我这种规则被称为协议。例如:TCP、FTP、HTTP、DNS、ICMP、IP、UDP......
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
负责域名解析的DNS服务
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议,它提供域名到IP地址之间的解析服务。
计算机擅长处理IP地址这样长数字形式的内容,但却不符合人类的记忆习惯,所以用户会借助域名(www.baidu.com)和端口号等来记忆。
但域名却难以理解这样的一串字符串,因此,DNS协议就营运而生,用于解析域名,通过域名查找IP地址,也可以逆向从IP地址查找域名
HTTP状态码
状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果,借助状态码,可以知道服务器端是正常处理了请求,还是出现错误
状态码类别
code | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
http状态码多达六十多种,但实际使用大概只有十四种左右(其他状态码,欢迎百度)
2XX
code | 原因短语 |
---|---|
200 | 请求成功 |
204 | 请求成功,但无资源返回 |
206 | 请求成功,只是请求部分资源 |
3XX 重定向
code | 原因短语 |
---|---|
301 | 永久性重定向 资源地址更新,需要进行变更,(主要作用在书签页) |
302 | 临时性重定向 资源地址更新,需要进行变更,(主要作用在书签页) |
303 | 临时性重定向 使用get 方法获取资源 |
304 | 资源找到了,但不符合条件请求,意思是:内容还没更新,先使用客户端内缓存的内容(非重定向) |
404 | 服务器没有找到该资源 |
4XX
code | 原因短语 |
---|---|
400 | 无法理解请求的内容(报文语法错误) |
401 | 需要通过HTTP认证 |
403 | 被服务器拒绝访问内容 |
404 | 资源找到了,但不符合条件请求,意思是:内容还没更新,先使用客户端内缓存的内容(非重定向) |
5XX
code | 原因短语 |
---|---|
500 | 服务器内部出现故障 |
503 | 服务器正忙(处于暂时超负载或者停机维护等,无法处理请求) |
通讯转发程序: 代理 网关 隧道
代理
作用:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的。
特点:代理不改变请求的URL,会直接发送给前方持有资源的目标服务器(源服务器)。在HTTP通信中,可级联多台代理服务器(即请求和响应都经过数台类似锁链一样连接的代理服务器),转发时,需要附加Via首部字段以标记出经过的主机信息。
缓存代理:会预先将资源的副本(缓存)保存在代理服务器上,当下次再接受到同样的请求时,就可以不需要从源服务器上获取资源,而是在代理服务器上直接返回资源
透明代理:转发请求或响应时,不对报文做任何加工的代理类型,叫做透明代理,反之叫非透明代理...
隧道
目的:隧道的目的是为了确保客户端能与服务器进行安全的通信
可按要求建立起来一条与其他服务器的通讯线路,届时使用SSL等加密手段进行通讯.确保安全性.隧道本身不会去解析HTTP请求。也就是说,隧道只是用来中转HTTP请求,当通讯双方断开连接是结束
网关
网关的工作机制和代理十分相似,而网关能使通讯线路上的服务器提供非HTTP协议服务。 利用网关能提高通信的安全性。因为可以在客户端与网关之间的通讯路上加密以确保链接的安全
跨域
1.同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响,可以说web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现。
他的核心在于它认为自任何站点装载的信赖内容都不安全的,当被浏览器半信半疑的脚本运行的沙箱时,他们应该只被允许访问来自统一站点的资源,而不是那些来自其他站点可能不怀好意的资源
所谓同源: 域名相同,协议相同,端口相同
另外,同源策略又分为以下两种
1.DOM同源策略:禁止对不同源页面DOM进行操作,这里主要场景是iframe跨域的情况,不同域名的iframe是限制相互访问的
2.XMLHttpRequest同源策略:禁止使用XHR对象向不同源的服务器发起http请求
如果出现了域名不同,协议不同,端口不同,就会受到同源策略的限制,产生跨域的问题。
同源策略的目的是保证用户信息安全,防止恶意的网站窃取数据,防止其他网站在访问的时候获取其他网站留下的cookie信息。
限制范围:
- Cookie ,localStorage 和indexDB 无法读取
- DOM无法获取(iframe 已经废弃)
- AJAX请求不能发送
1.所谓同源:必须要域名相同,端口相同,域名相同,才能访问,否则出现跨域问题。限制访问(什么事同源策略)
2.同源的目的是为了保护用户的隐私安全,防止黑客的入侵(当然高级黑客还是会有办法的)(有什么用)
3.同源策略是浏览器最基础,最核心的安全功能。(为什么)
4.同源策略能限制cookie,localStorage和indexDB的获取,DOM的获取,和AJAx发起的http请求(具体作用)
5.在web开发中,前后端分离,一般是前端一个访问端口,后台一个访问端口,就会产生跨域问题(产生什么问题)
6.在html标签中,img的src,link标签,a标签,和scrip标签无视同源策略。可以通过标签进行跨域访问>。(JSONP方法)(如何解决(其中一个方法))
解决跨域的方法
CORS跨域请求
// Access-Control-Allow-Origin:‘*‘ //允许跨域的端口,可以是一个借口,可以是*(不安全)get可以
// ‘Access-Control-Allow-Headers‘:‘X-Test-Cors‘//允许跨域的请求头,可以自定义
// ‘Access-Control-Allow-Methods‘: ‘POST, PUT, Delete‘//允许跨域的方式
// ‘Access-Control-Max-Age‘: ‘1000‘ //允许在一千秒内发起正式,不用发起预请求
<!--允许方法-->
GET
HEAD
POST
允许Content-Type //传输的数据类型
text/plain
multipart/form-data
application/x-www-form-urlencoded
其他限制
请求头限制
XMLHttpReqiestUpload 对象均没有注册任何事件监听器
请求中没有使用ReadableStream对象
<!--预请求-->
// ‘Access-Control-Allow-Headers‘:‘X-Test-Cors‘//允许跨域的请求头,可以自定义
// ‘Access-Control-Allow-Methods‘: ‘POST, PUT, Delete‘//允许跨域的方式
// ‘Access-Control-Max-Age‘: ‘1000‘ //允许在一千秒内发起正式,不用发起预请求
// 可缓存性
.public (任何地方)
.private(发起请求的地方)
.no-cache(验证后是否使用本地缓存才能缓存)
//到期时间
.max-age=100 (缓存时间)
s-maxage=100 (缓存时间[在代理服务器上用])
max-stale=1000 (即使过去,也还能用,在规定时间范围内)
//重新验证
.must-revalidate (在过期后,在服务端发送请求,重新获取数据验证是否真的过期)
proxy-revalidate (在缓存服务器上使用)
<!--其他-->
no-store (不用验证,不能缓存,每次都要拿新的内容)
no-transform (告诉代理服务器 不允许改动内容)
// 资源验证
Last-Modified 上次修改时间(通过判断资源修改时间是否一样去验证是否需要更新)
配合 if-Modified-Since 或者If-Unmodified-Since
Etag 数据签名
配合if-Match或者if-Non-Match使用
对比资源的签名判断是否使用缓存
<!--
第一个修改信息时,把修改的内容发送到服务器,第二次请求的时候,会返回第一次的数值,然后跟现在的数值对比,如果有不一样,证明修改了,需要从后台拿数据
-->
HTTPS
HTTP的不足之处
- 通讯使用明文(不加密) 内容可能会被窃听 (http本身不具备加密功能)
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完成性,所以有可能遭遇篡改
以上是关于HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章