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信息。

限制范围:

  1. Cookie ,localStorage 和indexDB 无法读取
  2. DOM无法获取(iframe 已经废弃)
  3. AJAX请求不能发送
 1.所谓同源:必须要域名相同,端口相同,域名相同,才能访问,否则出现跨域问题。限制访问(什么事同源策略)
 2.同源的目的是为了保护用户的隐私安全,防止黑客的入侵(当然高级黑客还是会有办法的)(有什么用)
 3.同源策略是浏览器最基础,最核心的安全功能。(为什么)
 4.同源策略能限制cookielocalStorageindexDB的获取,DOM的获取,和AJAx发起的http请求(具体作用)
 5.web开发中,前后端分离,一般是前端一个访问端口,后台一个访问端口,就会产生跨域问题(产生什么问题)
 6.html标签中,imgsrclink标签,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协议的主要内容,如果未能解决你的问题,请参考以下文章

怎么用http协议实现安卓数据

CPNtools协议建模安全分析---实例变迁标记

HTTP客户端代码片段

高效Web开发的10个jQuery代码片段

如何从一个片段导航到另一个片段?

这两个代码片段有啥区别?