HTTP

这里写图片描述

一、HTTP协议——-不保存状态


HTTP自身不对请求和响应之间的通信状态进行保存,协议对于发送过的请求或响应不做持久化处理。使用HTTP协议,
每当有新的请求发送时,就会有对应的新响应产生,协议本身并不保留之前一切的请求或响应报文的信息。

二、HTTP协议首部


报文首部包含请求行、请求/响应首部字段、通用首部字段、实体首部字段
请求行:包括方法、URI和HTTP版本
HTTP首部字段:包括请求/响应首部字段、通用首部字段、实体首部字段三种。主要提供报文大小,所使用的的语言、认证信息等。

常见的HTTP首部字段:
a、通用首部字段(请求报文与响应报文都会使用的首部字段)
    Date:创建报文时间
    Connection:连接的管理
    Cache-Control:缓存的控制
    Transfer-Encoding:报文主体的传输编码方式
b、请求首部字段(请求报文会使用的首部字段)
    Host:请求资源所在服务器
    Accept:可处理的媒体类型
    Accept-Charset:可接收的字符集
    Accept-Encoding:可接受的内容编码
    Accept-Language:可接受的自然语言
c、响应首部字段(响应报文会使用的首部字段)
    Accept-Ranges:可接受的字节范围
    Location:令客户端重新定向到的URI
    Server:HTTP服务器的安装信息
d、实体首部字段(请求报文与响应报文的的实体部分使用的首部字段)
    Allow:资源可支持的HTTP方法
    Content-Type:实体主类的类型
    Content-Encoding:实体主体适用的编码方式
    Content-Language:实体主体的自然语言
    Content-Length:实体主体的的字节数
    Content-Range:实体主体的位置范围,一般用于发出部分请求时使用

三、和TCP/IP协议的关系


TCP/IP协议族分为四层,应用层、传输层、网络层和数据链路层
  • HTTP协议主要用于应用层,用于生成报文和对请求的内容做处理

  • IP协议主要解决网络路由和寻址问题

  • TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序
    与发出顺序一致。

四、状态码


     1XX:接收的请求正在处理
     2XX:请求正常处理完毕 
  • 200—–客户端发出的请求在服务器端被正常处理
  • 204—–请求被成功处理,响应报文中不能含有任何实体的主体部分
  • 206—–客户端进行了范围请求,服务器端成功执行

      3XX:需要执行附加操作以完成请求 
    
  • 301—–永久重定向,表示请求的资源已经被分配了新的URI,以后应使用新的URI

  • 302—–临时性重定向,表示请求的资源已经被分配了新的URI,仅限本次使用新的URI
  • 303—–表示请求的资源已经被分配了新的URI,要求仅限本次使用GET方法请求资源
  • 304—–客户端发送附带条件的请求,服务端允许访问资源,但发生请求未满足的情况
    附带条件的请求是指GET方法的请求报文中含有If-Match,If-Modified-Since,If-None-Match等条件请求首部字段。
  • 307—–临时重定向,表示请求的资源已经被分配了新的URI,仅限本次使用新的URI,不会从POST变为GET

       4XX:客户端存在错误 
    
  • 400—–客户端请求报文中存在语法错误
  • 401—–表示发送的请求需要认证信息
  • 403—–请求资源的访问被服务器拒绝
  • 404—–服务器上无法找到请求的资源

     5XX:服务器处理请求出错
    
  • 500—–服务器在执行请求时发生错误
  • 503—–服务器暂时处于超负载或正在进行停机维护

五、HTTPS=HTTP+加密+认证+完整性保护(说明两者的区别6点)


  • HTTP超文本传输协议,HTTPS安全超文本传输协议
  • 采用HTTPS协议的服务器必须要有一套数字证书
  • HTTP协议没有加密机制,HTTPS用SSL(安全套接层)进行加密
  • HTTPS标准端口443,HTTP标准端口80;
  • HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
  • HTTPS比HTTP更加安全,对搜索引擎更友好

    HTTPS的功能是:
    ①对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
    ②对网站服务器进行真实身份认证。
    
    HTTP的缺点:    
     ①、通信使用明文不加密,内容可能被窃听
     ②、不验证通信方身份,可能遭到伪装
     ③、无法验证报文完整性,可能被篡改
    

六、追加协议WebSocket

WebSocket 是一种网络通信协议,它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向 
服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
var ws = new WebSocket("wss://echo.websocket.org");  
ws.onopen = function(evt) {   console.log("Connection open ...");   
ws.send("Hello WebSockets!"); };   
ws.onmessage = function(evt) {   
        console.log( "Received Message: " + evt.data);  
         ws.close();
 }; 
  ws.onclose = function(evt) {   
        console.log("Connection closed.");
 };   

七、HTTP方法(8个)

GET:请求访问已被URI识别的资源
POST:传输信息给服务器
PUT:传输文件,报文的主题中包含文件内容,然后保存到请求URI指定的位置。
HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
TRACE:让WEB服务器端将之前的请求通信返回给客户端
CONNECT:在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。

八、GET与POST的区别(5个)


①get重点在从服务器上获取资源,post重点在向服务器发送数据;

②GET的所有参数全部包装在URL中,明文显示,非常不安全;POST的URL中只有资源路径,不包含参数,相对安全。  

③Get传输的数据量小,因为受URL长度限制,一般限制在2~8K之间,但效率较高;Post可以传输大量数据,所以上传文件 
时只能用Post方式;

④get方式只支持ASCII字符,向服务器传中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。  

⑤GET 请求能够被缓存,POST请求默认不会缓存。缓存是针对URL来进行缓存的  

九、HTTP协议流程(10步)


1.打开HTTP连接。一定要记住HTTP是一种无状态协议。正因为如此,对于每一个请求你都要建立一个新的连接。

2.初始化方法请求。这里面将包含一些类型的方法指示符用来描述调用什么方法和方法所需要的参数。 

3.设置HTTP请求头。这里面包含要传送的数据类型(二进制)和数据的总长。  

4.发送请求。将二进制流写到服务器。  

5.读取请求。目标servlet程序将被调用并接受HTTP请求数据。servlet程序就调用所有必要的参数选择相应的方法。 
注意,如果这是这个客户端的第一次请求,一个服务器对象的新的实例就会被创建。  

6.调用方法。方法将会被服务器端的对象调用。   

7.初始化方法响应。如果调用的方法抛出一个异常,客户将接收到出错信息。否则,返回的类型(如果有)将会被发送。  

8.设置HTTP响应头。在响应头中,一定会设置待发送数据的类型和长度。   

9.发送响应。二进制数据流将从Web服务器发送并返回给客户端。   

10.关闭连接。

十、TCP三次握手,四次挥手


①几个有关参数的介绍  

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位(6个)
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。

②各种状态的意义

LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;

③什么是“三次握手”?为什么需要“三次握手” ?

答:所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息(剩余缓冲区空间的数量)

④“三次握手”的步骤:

a.第一次握手:
Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
b.第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进SYN_RECEIVED状态。
c.第三次握手:
Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

⑤“四次挥手”的步骤   

a.第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
b.第二次挥手:
Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。客户端进入FIN_WAIT_2状态
c.第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
d.第四次挥手:
Client收到FIN后,接着发送一个ACK给Server,Client进入TIME_WAIT状态,Server进入CLOSED状态,
完成四次挥手。

⑥为什么连接的时候是三次握手,关闭的时候却是四次挥手?  

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

  ⑦为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?(针对客户端)

我们必须假想网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在TIME_WAIT状态中,如果 客户端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

十一、前端安全问题


参考:http://blog.csdn.net/github_36978270/article/details/78212616

(一)被动攻击:利用圈套策略执行攻击代码,攻击者不直接对目标WEB应用访问发起攻击
1.XSS—–跨站脚本攻击(Cross Site Script)

①含义:

        通过存在安全漏洞的WEB网站注册用户的浏览器运行非法的HTML标签或JavaScript进行的一种攻击 

②危害:

         利用虚假输入表单骗取用户个人信息。
         利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。   
         显示伪造的文章或图片。

③防范:

  • 输入值验证—–检查是否符合系统业务逻辑的数值和字符编码
  • 任何内容写到页面之前必须加以encode(转义),避免标签泄露
  • 避免直接在cookie中泄露隐私
  • 尽量采用POST提交表单
2.CSRF—–跨站点请求伪造

①含义:冒充用户发起请求(在用户不知情的情况下), 完成一些违背用户意愿的事情
②危害:

  • 利用已通过认证的用户权限更新设定信息等;
  • 利用已通过认证的用户权限购买商品;
  • 利用已通过的用户权限在留言板上发表言论。

③原理:

    CSRF主要是因为WEB隐式身份验证机制,WEB身份验证机制虽然可以保证一个请求是来自某个用户的浏览器, 
    但是不能保证这个请求是用户批准发出的。
  • 登录信任的网站A,并且在本地产生的cookie
  • 在不退出A的情况下,访问危险网站B

④防范:

  • 验证码;强制用户必须与应用进行交互,才能完成最终请求。此种方式能很好的遏制 csrf,但是用户体验比较差。尽量使用 post ,限制 get 使用;上一个例子可见,get 太容易被拿来做 csrf 攻击,但是 post 也并不是万无一失,攻击者只需要构造一个form就可以。
  • Referer check;请求来源限制,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到
  • Referer,而且低版本的浏览器存在伪造 Referer 的风险
  • token;token 验证的 CSRF 防御机制是公认最合适的方案。整体思路如下: -
    第一步:后端随机产生一个 token,把这个token 保存到 session 状态中;同时后端把这个token 交给前端页面; -
    第二步:前端页面提交请求时,把 token 加入到请求数据或者头信息中,一起传给端; -
    第三步:后端验证前端传来的 token 与 session 是否一致,一致则合法,否则是非法求。
(二)主动攻击:攻击者通过直接访问WEB应用,把攻击代码传入的攻击模式
1.SQL注入攻击

①含义:针对WEB应用所使用的数据库,通过运行非法的SQL而产生的攻击
②危害:

        非法查看或篡改数据库的数据
        规避认证
        执行·和数据库服务器关联的程序

③防范:

            对用户输入进行校验
            不要使用动态拼接SQL
            不要使用管理员权限的数据库连接
           不要把机密信息明文存放 
(三)CSP

①含义:一个标准,对浏览器做出限制,以保证它只能从可信赖来源下载资源。用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。
②原理:CSP遵循以下规则:

不许允不可信赖的来源:只有来自明确定义过的可信赖来源的外链资源才可以被下载
不允许内联资源:行内脚本和内联CSS不允许被执行。
不允许eval函数:Javascript的eval函数不可以被使用

③使用:如何配置CSP?

在服务器返回的响应中添加额外的HTTP头部:Content-Security-Policy。 
因为安全策略是附属于每一个HTTP返回中,所以对服务器来说可以逐个页面的设置安全策略。通过在  
每一个返回中添加统一的CSP头来使得整个站点都可以采取同一个策略。  

十二、HTTP缓存机制


参考:http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html
http://blog.csdn.net/abc86319253/article/details/43765333
http://blog.csdn.net/mjr99999/article/details/78682744
http://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ?utm_source=caibaojian.com

(一)强缓存相关的header字段
Expires策略

Expires会将资源失效的日期告知客户端,在Expires字段值指定的时间之前,相应的副本会一直被保存

Cache-control策略(重点关注)

Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览 器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置 更细致,如果同时设置的话,其优先级高于Expires。 以下为几个相关的控制指令:

  • public:其他用户也可利用缓存
  • private:这允许服务器对特定用户提供资源缓存的服务,此响应消息对于其他用户的请求无效。
  • no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认
  • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
  • max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
(二)协商缓存相关的header字段
  Etag/If-None-Match

Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识。
当客户端发现和服务器约定的直接读取缓存的时间过了,就在请求中发送If-None-Match选项,值即为上次请求后响应头的ETag值,该值在服务端和服务端代表该文件唯一的字符串对比(如果服务端该文件改变了,该值就会变),如果相同,则相应HTTP304,客户端直接读取本地缓存,如果不相同,HTTP200,下载正确的数据,更新ETag值。

Last-Modified/If-Modified-Since
  • Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
  • If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。

     (三)既生Last-Modified何生Etag?
    

    你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  • Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
  • 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
  • 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
  • Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

十三、cookie和Session


参考:https://www.jianshu.com/p/25802021be63
https://www.jianshu.com/p/ca8637b05c8a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
http://blog.csdn.net/u010168160/article/details/47128443

(一)Session出现原因:

由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户

 (二)cookie出现的原因

服务器端需要识别特定的用户,每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的

(三)服务器识别特定用户具体实现过程:

第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

(四)两者的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能大于3K。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

十四、cookie的弊端


cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的。
第一:每个特定的域名下最多生成20个cookie

    1.IE6或更低版本最多20个cookie
    2.IE7和之后的版本最后可以有50个cookie。
    3.Firefox最多50个cookie
    4.chrome和Safari没有做硬性限制,IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie。  
    cookie的最大大约为4096字节,为了兼容性,一般不能超过4095字节。

IE 提供了一种存储可以持久化用户数据,叫做uerData,从IE5.0就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。

    优点:极高的扩展性和可用性
    1.通过良好的编程,控制保存在cookie中的session对象的大小。
    2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
    3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
    4.控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。

缺点:

    1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
    2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者  
    并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
    3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们   
    把这个计数器保存在客户端,那么它起不到任何作用。

十五、JSON和XML


JSON的理解,处理JSON的方法,对象与JSON的转换,JSON的序列化和反序列化

(一)JSON是什么?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小。是前后台数据交互最常见的一种数据格式。

(二)JSON语法

1.数据在键值对中,如: key:value 使用冒号分隔。
2.数据由逗号分隔
3.花括号保存对象
4.方括号保存数组

(三)对象与JSON的转换

1.JavaScript对象序列化为JSON对象:

var jsonText=JSON.stringify(obj);
第二个参数可以为数组或函数,返回值只保留传入的部分(序列化第二部考虑)
第三个参数用于控制缩进和空白符(序列化第三步考虑)
定义toJSON()方法,返回某些值(序列化第一步考虑)

2.JSON字符串解析为原生JavaScript值:

var bookCopy=JSON.parse(jsonText)
第二个参数为还原函数,返回某些值

(四)JSON的序列化

var jsonText=JSON.stringify(obj);

(五)JSON的反序列化

var bookCopy=JSON.parse(jsonText)

(六)JSON和XML的区别   

数据体积:JSON的数据体积更小
数据交互:JSON与JavaScript的交互更方便,更容易解析处理,更好交互
数据描述:JSON对数据的描述性比较差
传输速度:JSON的速度要远远快于XML

发布了31 篇原创文章 · 获赞 9 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章