做Web开发,不会Http真的不行
更新时间:2020/11/5 14:00:31 作者:永佳软件
Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注
现在面试门槛越来越高,很多开发者对于网络知识这块了解的不是很多,遇到这些面试题会手足无措。本篇文章知识主要集中在HTTP这块。文中知识来自《图解HTTP》与维基百科,若有错误请大家指出。文章会持续更新。
了解Web及网络基础
对端传输
发送端在层与层间传输数据时,没经过一层都会被加上首部信息,接收端每经过一层都会删除一条首部
多种协议作用
IP协议,TCP协议和DNS服务在使用HTTP协议过程中发挥的作用
简单的HTTP协议
请求报文和响应报文
客户端像服务器发起请求时会生成一段请求报文,请求报文是由请求方法,URL,协议版本,可选的请求首部字段和内容实体构成。
请求报文
接收到请求的服务器,会将请求内容的处理结构以响应的形式返回。响应报文基本上由协议版本,状态码,用以解释状态的原因短语,可选的响应首部字段以及实体主体构成。
响应报文
HTTP是不保存状态的协议和Cookie的简单介绍
HTTP协议对于发送的请求和响应不做持久化处理。这时候引入了Cookie技术用于状态管理。Cookie对用与登录的状态管理,没有Cookie这个技术的话,因为HTTP不保存状态,每次打开新网页都必须再次登录。
Cookie会根据响应报文中的Set-Cookie字段来通知客户端自动保存Cookie。下次请求时会自动发送Cookie,服务器会比对数据得到状态结果。
Cookie
Post和Get的区别
先引入副作用和幂等的概念。
副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。
幂等指发送M和N次请求(两者不相同且都大于1),服务器上资源的状态一致。注册10个和11个帐号是不幂等的,对文章进行更改10次和11次是幂等的。
在规范的应用场景上说,Get多用于无副作用,幂等的场景,例如搜索关键字。Post多用于副作用,不幂等的场景,例如注册。
在技术上说:
Get请求能缓存,Post不能
Post相对Get安全一点点,因为Get请求都包含在URL里,且会被浏览器保存历史纪录,Post不会,但是在抓包的情况下都是一样的。
Post可以通过requestbody来传输比Get更多的数据,Get没有这个技术
URL有长度限制,会影响Get请求,但是这个长度限制是浏览器规定的,不是RFC规定的
Post支持更多的编码类型且不对数据类型限制
常见状态码
常见状态码
2XX成功
200OK,表示从客户端发来的请求在服务器端被正确处理
204Nocontent,表示请求成功,但响应报文不含实体的主体部分
206PartialContent,进行范围请求
3XX重定向
301movedpermanently,永久性重定向,表示资源已被分配了新的URL
302found,临时性重定向,表示资源临时被分配了新的URL
303seeother,表示资源存在着另一个URL,应使用GET方法丁香获取资源
304notmodified,表示服务器允许访问资源,但因发生请求未满足条件的情况
307temporaryredirect,临时重定向,和302含义相同
4XX客户端错误
400badrequest,请求报文存在语法错误
401unauthorized,表示发送的请求需要有通过HTTP认证的认证信息
403forbidden,表示对请求资源的访问被服务器拒绝
404notfound,表示在服务器上没有找到请求的资源
5XX服务器错误
500internalsevererror,表示服务器端在执行请求时发生了错误
503serviceunavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
HTTP首部
通用首部
指请求报文和响应报文都可以使用的字段
Cache-Control
no-cache指客户端不缓存过期资源
no-store指不进行缓存
max-age指缓存资源的缓存时间比指定的值小,那么客户端就接受缓存资源,且缓存服务器不对资源有效性进行再次确认
Connection指控制不再转发给代理的首部字段(Hop-by-hop),管理持久连接
close指服务器像明确断开连接
Keep-Alive指保存持久连接,HTTP/1.1前默认连接是非持久性的,如需要保存持久连接,需要增加此字段
Upgrade可以用来指定一个完全不同的通信协议,对于这个字段,服务器可以返回101状态码
请求首部字段
Accept指用户代理能够处理的媒体类型及媒体类型的相对优先级
Accept-Encoding指用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序
Authorization指用来告知服务器,用户代理的认证信息
Host当一个IP下存在多个域名时,帮助服务器知道要请求的具体主机
User-Agent会讲创建请求的浏览器和用户代理名称等信息传达给服务器
HTTPS
HTTPS是HTTP建立在SSL/TLS安全协议上的。
在iOS中,客户端本地会存放着CA证书,在HTTPS请求时,会首先像服务器索要公钥,获得公钥后会使用本地CA证书验证公钥的正确性,然后通过正确的公钥加密信息发送给服务器,服务器会使用私钥解密信息。
SSL/TLS握手阶段分为五步:
第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Clientrandom),以及客户端支持的加密方法。
第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Serverrandom)。
第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premastersecret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premastersecret)。
第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(sessionkey),用来加密接下来的整个对话过程。
HTTPS相对于HTTP性能上差点,因为多了SSL/TLS的几次握手和加密解密的运算处理,但是加密解密的运算处理已经可以通过特有的硬件来加速处理。