http协议

一、tcp/ip协议

(tcp协议和ip协议是众多协议中最重要的,所以用这两者命名)

tcp/ip协议包含了互联网基础的网络协议,特点是分层管理:

应用层:http协议(超文本传输)、ftp协议(文件传输)、dns协议(域名系统);

传输层:tcp协议(建立连接、超时重传、发送和接收方确认)、udp协议(没有确认机制)

网络层:处理发送和返回的数据包(包括ip协议);

链路层:硬件部分。

 

二、http协议的特点:

1、快速简单,明文传输

2、灵活(根据头部分的数据类型,就可以完成对不同数据类型的传输)

3、无连接(连接一次就会断开)

4、无状态(不会记住上次连接者的身份)

 

三、http和https的区别

1、端口号不一样,前者80,后者443;

2、http不需要证书,https需要CA申请证书,需要一定的费用;

3、http信息明文传输,https经过加密传输、身份认证,比较安全;

 

四、http的方法

get:获取

post:发送 与put区别(后一个不会把前一个覆盖,用post来新增资源)

put:与post区别(两个相同的请求,后一个会把前一个覆盖掉,用put来改资源)

head:只获取头部,可查看资源是否存在

delete:删除某个资源;

options:查看当前uri所支持的方法

 

五、http状态码

1**:请求已接收,继续处理;

2**:请求已被成功接收;

3**:重定向;

4**:客户端错误;

5**:服务端错误;

200:成功;

206:已完成一部分的请求(断点续传时,客户端发送一个带有range头的get请求,服务器已完成)

301:已永久重定向;

302:临时重定向;

304:缓存还可用;

401:客户端的请求不被服务器所理解

403:被禁止,客户没有权限;

404:请求资源不存在;

503:服务器过载崩溃,过段时间可恢复。

502:网关错误

504:超时

附:断点续传

从文件已经下载的地方开始继续下载

请求头加上开始下载的节点:Range:bytes=2000-

 

六、post和get区别

安全性上:

1、首先get的参数会被拼接在url上,而post则是放在请求体中;

2、其次,get请求会被浏览器的历史记录缓存,而post不会;

3、攻击者更容易利用get去伪造一个请求,所以在安全性上,post优于get;

请求数据上:

通常浏览器和服务器会限制url的长度,所以get请求数据大小也有一定的限制;浏览器2k,服务器64k;

效率上:

get请求是header跟data一并发送的,只产生一个数据包,而post是先发送header,再发送data,会产生两个数据包,所以get效率要优于post。

(在验证数据完整性上,post更优)

 

七、http1.1版本特性

1、默认持久连接,Connection:keep-alive模式避免重新建立连接。

2、管线化,建立一个tcp连接可发送多个http请求(可并发请求),而不用等待一个一个响应。

 

八、http的优化方案

1、持久连接,避免重新建立连接,造成性能和带宽的浪费。

2、http复用(管线化),多个http请求通过一个tcp连接进行处理。

3、内容缓存。将常用的内容进行缓存,客户端直接在内存读取数据。

4、压缩,减少带宽。

5、加密,使用ssl/tls协议对http协议进行加密(https:数据加密,身份认证),

6、tcp缓冲,提高服务器的响应时间和处理效率。

 

九、DNS解析过程

即把域名转换为ip的过程:

本地DNS服务器=>根域名服务器=>com顶级域名服务器=>google.com域名服务器

 

十、https的连接方式

https:在http协议的基础上,使用tls对数据进行加密传输。

1、客户使用https的url访问web服务器,要求建立ssl连接;

2、服务器收到请求,将网站的证书信息(包含公钥)发送一份给客户端;

3、客户端验证证书的合法性,建立会话秘钥,并用公钥加密,传送给服务器

4、服务器用自己的私钥解密会话秘钥,并用会话秘钥加密数据。

(会话秘钥:采用非对称加密;数据:采用对称加密)

 

十一、同源策略

1、定义:

同源策略即协议、域名、端口都要相同。不同源的客户端脚本在没有授权的情况下,不能读取对方的资源。

2、目的:

保证用户信息安全,防止恶意网站窃取数据。

3、哪些行为受同源限制:

cookie、webStorage、indexDB

DOM、iframe对象无法读取

ajax不能发送请求 (报错:。。。No 'Access-Control-Allow-Origin'...)

4、哪些行为不受同源限制:

script标签、img标签、link标签

页面中的链接、重定向、表单提交

 

十二、跨域

受同源策略的限制,当我们去访问一个不同源下的资源的时候就会产生跨域。

解决跨域的方法:

客户端与服务器端之间:

1、(后端)服务器配置cors,跨域资源共享;使用自定义的http头部,让浏览器与服务器进行沟通。

res.header("Access-Control-Allow-Origin", "*"); //设置请求来源不受限制
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); //设置请求方式

2、(后端)nginx反向代理(服务器之间没有同源策略的限制)

3、jsonp,利用script标签可以跨域的特性,只能使用get方法,不安全。

4、如果使用webpack的话,修改webpack选项devServer的代理功能proxy:

(webpack-dev-server是一个小型的Node.js Express服务器,用它做反向代理)

proxy:{
    '/api':{
        target:'', //请求的实际地址
        changeOrgin:true, //是否跨域
            /''/
        pathRewrite: {   //将/api 替换为空
            '^/api':''
        } 
    }
}
客户端之间(页面与页面之间):
具有相同的上级域名:

1、html5 postMessage(),客户端之间传递数据

window.onload = function() {  
    var ifr = document.getElementById('ifr');  
    var targetOrigin = "http://www.google.com";  
    ifr.contentWindow.postMessage('hello world!', targetOrigin);  
};  

2、document.domain(document.domian='baidu.com'),这时浏览器会认为他们都处于同一个域下。问题:当其中一个站点被攻击后,另一个站点也会有安全漏洞。

3、设置window.name

 

六、从输入url到渲染完成经历了什么?

1、根据地址栏中的域名进行DNS解析,返回对应的ip。(查询浏览器DNS缓存=>系统DNS缓存=>hosts文件的缓存=>都没有,则DNS服务器端将对应的IP地址返回; 2、浏览器根据返回的ip,找到对应的服务器,并与服务器建立TCP连接; 3、向服务器发送http请求; 4、服务器响应请求,并返回数据; 5、浏览器下载返回的数据; 6、解析html,生成DOM树,解析css和js,渲染页面。

 

tcp连接三次握手和四次挥手:

1、防止服务器端开启一些无用的连接,增加服务器开销;

2、防止已失效的连接请求报文段又传到服务端,产生错误。

 

七、网站攻击的方式有哪几种

1、xss(跨站脚本攻击):富文本、评论

在页面中输入并执行js脚本,获取客户敏感信息(发布评论、恶意连接、插入广告,获取cookie等)

方法一:cookie添加httpOnly属性,这是使用js是不能读取和操作cookie的。

方法二:在cookie中添加校验信息。

方法三:对用户输入进行编码(encode)、过滤(移除style、script、iframe相关节点)、校正()

js编码解码:
1、使用参数时,使用encodeURIComponent
2、进行url跳转时,使用encodeURI
3、js使用数据时,使用escape

 

2、csrf(跨站请求伪造):支付扣款

伪造用户的请求,冒充用户在站内进行操作。

方法一:使用referer来判定来源页面

方法二:关键操作只接受post请求,因为get请求的参数携带在url中,很容易模拟。

方法三:在http请求中加上token,并在服务器端验证这个token。

方法四:登录、支付的页面加上一些用户互动,比如验证码,确保当前请求是用户发起的。

两者的区别:

1、xss不需要登录;csrf需要用户先登录获取到cookie;

2、xss是在网站A注入js代码,然后执行js代码,达到篡改网站A的内容;

csrf利用网站A的漏洞,去请求网站A的api。

 

Cookie和Token都存需要放在Header里面,为什么只劫持前者?

1、http是无状态的,为了使域名下的所有网页能共享某些数据,因此出现了session、cookie以及token。

2、cookie是用于记录用户状态的一种方式,装有sessionId,由服务端设置,存储在客户端在每个请求中会自动携带。

3、token是无状态的,用户信息都被加密到token中,服务器收到token后解密就可以知道是哪个用户,token不会在请求中自动携带,而需要手动添加。

cookie:用户点击了链接,cookie未失效情况下,后端以为是用户的正常操作,于是进行扣款等操作。

token:用户点击链接,由于浏览器不会自动带上token,即使发了请求,但是后端token验证不通过。

 

//封装cookie
function setCookie(name,value,days,domain){
  let oDate=new Date();
  oDate.setDate(odate.getDate()+days);
  if(domain){
    document.cookie=`name=${value};expires=${oDate};domain=${domain};path=/`
  }else{
    document.cookie=`name=${value};expires=${oDate};path=/;
  }
};
​
function getCookie(key){
  let arr=document.cookie.split(';');
  for(var i=0;i<arr.length;i++){
    let arr2=arr[i].split('=');
    if(arr2[0]==key){
      return arr2[1]
    }
  }
  return null;
};
​
function delCookie(name,value,-1){
  setCookie(name)
};
 

收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?

如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。

如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了。

 

轮询和长轮询

轮询:说白了就是客户端定时去请求服务端, 是客户端主动请求来促使数据更新;

长轮询:说白了也是客户端请求服务端,但是服务端并不是即时返回,而是当有内容更新的时候才返回内容给客户端,从流程上讲,可以理解为服务器向客户端推送内容;

    

从中可以看出区别:

轮询:

  1:大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数据更新,因此绝大部分请求都是无效请求

  2:数据不一定是实时更新,要看设定的请求间隔,基本会有延迟。

长轮询:

  1:解决了轮询的两个大问题,数据实时更新;

  2:唯一的缺点是服务器在挂起的时候比较耗内存;

原文地址:https://www.cnblogs.com/annie211/p/14701083.html