一、相关的定义:
概念:
**协议:**不同的硬件 、操作系统之间的通信需要遵循的一种规则。 协议中存在的内容很多,包括ip地址的选定方式 、寻找异地用户的方法 、双方建立通信的顺序 、web页面显示需要处理的步骤等
TCP/IP: 把与互联网相关联的协议集合起来总称为 TCP/IP 。 HTTP是TCP/IP协议族的一个子集
分层管理:按照层次将TCP/IP 划分为 4层(《图解http》):应用层 、传输层、网络层、数据链路层
HTTP:是客户端和服务端之间数据传输的格式规范,表示超文本传输协议
1-TCP/IP 协议和分层管理
1)每一层的作用?
答案:《图解http》 P8
2)为了确保数据能够达到目标,TCP三次握手策略?
答案:《图解http》 P13
3)负责域名解析的DNS协议 是为了解决什么问题?
答案:《图解http》 P14
4)什么是域名?
5)还了解什么协议? 这些协议 和HTTP协议的关系?
答案:《图解http》 P15
2-URI 和URL
概念:
URI:统一资源标识符,用于唯一的标识一个资源
URL:统一资源定位器,是一种具体的URI,可以用来标识一个资源,并指明如何定位这个资源,具体就是web浏览器中访问页面需要输入的网页地址。
URL是URI的子集,因为URI是用字符串标识某一互联网资源,而URL表示资源的地点
。在充分理解的基础上,可以用URL替换URI。
1)URI的格式是什么样的?
答案:《图解http》 P17
首先了解绝对URI的格式:
http:// user:pass @ www.example.jp : 80/ dir/index.htm ? uid=1 # ch1
http://: 协议类型
表示协议方案名 访问资源的 协议类型
user:pass : 登录信息
可以指定用户名和密码 作为从服务器端获取资源时 必要的登录信息 (可选)
www.example.jp :
使用绝对URI必须指定待访问的服务器地址
80: 服务器端口号
dir/index.htm :
带层次的文件路径 一般用来定位特指的资源
uid=1 : 查询字符串
针对已经指定的文件路径内的资源 ,可以使用 查询字符串 传入 任意参数 (可选)
ch1: 片段标识符
3-简单的HTTP协议
二、请求报文和响应报文包括的部分:
浏览器发送的http的get 请求,该请求报文包括三个部分:
请求行,含有请求方法、URI、http版本信息
请求的首部字段
请求内容实体
服务器接收到浏览器的请求之后,返回响应报文,也是包括三个部分:
状态行,含有http版本、状态码、状态码的原因短语
响应的首部字段
响应内容实体
注意:在响应报文内,随着状态码一起返回的信息会因为方法的不同二发生改变:
在get方法内:对应请求的资源的实体会作为响应返回
在head方法内:对应请求的资源的实体首部不随着报文主体作为响应返回
三、http中的请求方式:
1)请求的方式
get:用于请求已经被URI识别的资源,可以通过URL传参给服务器
post:
head:
put:
options:
delete:
2)get和post之间的区别
1、get请求的参数长度有一定的限制,因为浏览器和web服务器限制了URI(统一资源标识符)的长度
而且GET请求的参数(需要传递的数据params)要放在URL中发送。
POST请求的参数可以放在URL后传递,也可以放在请求体中。
例如:
GET请求: xhr.open(“GET”,options.url+"?"+params,true)
POST请求:xhr.open(“GET”,options.url,true);
xhr.send(params);//发送一个请求
3.GET安全性相对较差。因为get是明文传送,而且数据会被浏览器缓存,容易被盗取修改
4.在缓存方面有一定的区别:get请求类似于查找的过程,get请求参数会被完整保留在浏览器的历史记录中。用户获取数据,可以不用每次都与数据库连接,
而post一般都是做修改和删除的工作,所以必须和数据库交互,不能使用缓存
四、http中常见的状态码:
2xx:成功的状态码
200:表示客户端发来的请求在服务端被正常的处理
204:表示请求处理成功,但没有资源可以返回,即在返回的响应报文中不含实体的主体部分
206:表示客户端进行了范围请求,而服务器成功执行了这部分的get请求
3xx:重定向状态码
3XX 表示浏览器需要执行某些特殊的处理以正确处理请求
301: 永久性重定向。 表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。(什么是永久性重定向? 我的理解是:例如你在浏览器保存的书签,但是此时书签的内容已经重新换成新的URI ,所以你必须把新的uri当做书签才能继续访问当前资源 并且之后的每一次访问都是更新后的URI)
302:临时性重定向 。 请求的资源已经被分配了新的URI,本次访问应使用现在所指的URI进行访问。与301的状态很相似,但302状态码代表的资源不是被永久移动,只是临时性质的。 (什么是临时性? 已经移动的资源对应的uri 将来有可能发生改变)
303:表示请求对应的资源存在着另一个URI,应该使用get方法定向获取请求的资源。
303 与302 都表示临时重定向 。 但区别是303特别明确表示客户端应该使用get方法。
例如,使用post方法访问某个程序 ,执行后的处理结果是希望客户端 能够以get方法重定向到另一个URI上
304:表示客户端发送附带条件的请求时,服务端允许访问请求的资源,但如果发生请求的条件没有满足 ,就会返回304,返回时不包含任何响应的主体部分,304和重定向没有关系
307:临时性重定向。 和302 含义相同 。会遵照浏览器标准 ,不会从post变成get。
4xx:表示客户端错误的状态码
400:表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次发送请求
401:表示发送的请求需要http的认证信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。 如果之前已经发送过请求 ,出现401就表示用户认证失败
403:表示对请求资源的访问被服务器拒绝了,例如没有获得文件系统的访问授权,访问权限出现某些问题
404:表示服务器上无法找到请求的资源 如果服务器端拒绝请求 并且不想说明理由时也可以使用该状态码
5xx:表示服务器本身的错误
500:表示服务器端在执行请求时发生了错误。或者是web应用存在的bug或某些临时的故障
像服务器的超时
502:表示代理服务器从上游服务器中接收到的响应是无效的
503:表示服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求
504: 表示作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
五、http和https之间的区别
https就是在http和tcp之间添加一个安全协议层,那么htttps和http的区别是:
1、https比http更安全。因为https是利用ssl/tls协议传输,包含证书、卸载、流量转发、负载均衡、页面适配等技术,保障了传输过程的安全性。
而http通信是使用明文,不加密,内容可能被盗取或者是窃听。并且http无法验证报文的完整性,可能被篡改
2、使用的端口号不同。https的端口号是443,而http的端口号是80
3、在osi网络模型,http工作在应用层,https的安全传输机制工作在传输层
六、tcp和udp之间的区别
tcp是面向字节流,并且只能是1对1的。是一种面向连接的可靠性传输。通过tcp连接传送的数据,无差错,不丢失,不重复,并且按序到达。
udp是面向报文的,支持1对1,1对多。并且网络出现拥塞不会降低发送速率,会出现丢包现象。是无连接的,不可靠的
七、options请求
具体请看详细文档
1、options请求的官方定义:
OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
用白话说就是:在发生正式的请求之前,先进行一次预检请求。看服务端返回一些信息,浏览器拿到之后,看后台是否允许进行访问。
2、如何产生options请求:
产生options请求的原因包括以下几条:
产生了复杂请求。复杂请求对应的就是简单请求。简单请求的定义是:
请求方法是GET、HEAD或者POST,并且当请求方法是POST时,Content-Type必须是application/x-www-form-urlencoded, multipart/form-data或着text/plain中的一个值。
请求中没有自定义HTTP头部。
所谓的自定义头部,在实际的项目里,我们经常会遇到需要在header头部加上一些token或者其他的用户信息,用来做用户信息的校验。
发生了跨域。
3、options请求有什么作用
官方将头部带自定义信息的请求方式称为带预检(preflighted)的跨域请求。
在实际调用接口之前,会首先发出一个options请求,检测服务端是否支持真实的请求进行跨域的请求。
真实请求在options请求中,通过request-header将 Access-Control-Request-Headers与Access-Control-Request-Method发送给后台,另外浏览器会自行加上一个Origin请求地址。服务端在接收到预检请求后,根据资源权限配置,在response-header头部加入access-control-allow-headers(允许跨域请求的请求头)、access-control-allow-methods(允许跨域请求的请求方式)、access-control-allow-origin(允许跨域请求的域)。
另外,服务端还可以通过Access-Control-Max-Age来设置一定时间内无须再进行预检请求,直接用之前的预检请求的协商结果即可。浏览器再根据服务端返回的信息,进行决定是否再进行真实的跨域请求。这个过程对于用户来说,也是透明的。
另外在HTTP响应头,凡是浏览器请求中携带了身份信息,而响应头中没有返回Access-Control-Allow-Credentials: true的,浏览器都会忽略此次响应。
总结:
只要是带自定义header的跨域请求,在发送真实请求前都会先发送OPTIONS请求,浏览器根据OPTIONS请求返回的结果来决定是否继续发送真实的请求进行跨域资源访问。所以复杂请求肯定会两次请求服务端。
4、options请求如何避免
1:使用代理,避开跨域。
2:将复杂跨域请求更改为简单跨域请求。
3:不使用带自定义配置的header头部。