【面试】HTTP协议
浏览器输入url按回车后经历了什么?
1.首先,解析url,检测url地址是否合法;
2.浏览器先查看浏览器缓存--系统缓存--路由器缓存,如果缓存中有,则直接显示页面内容,如果没有,则执行第三步;
【浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;】
【操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录;】
【路由器缓存:如果上述两个步骤均不能成功获取DNS记录,则继续搜索路由器缓存;】
【ISP缓存:若上述均失败,继续向ISP搜索;】
3.在发送HTTP请求前,需要域名解析(DNS解析),获取相应的IP地址;
4.浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手;
5.握手成功后,浏览器向服务器发送HTTP请求,发送数据包;
6.服务器处理收到的请求,将数据返回至浏览器;
7.浏览器收到HTTP响应;
8.浏览器解码响应,如果响应可以缓存,则存入缓存;
9.浏览器发送请求获取嵌入在HTML中的资源(html,css,js,图片,音乐...),对于未知资源,会弹出对话框;
10.浏览器发送异步请求;
11.页面全部渲染完毕;
Http协议中有哪些请求方式?
Get:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器;
Post:用于传输信息给服务器,主要功能与Get类似,但一般推荐使用Post;
Put:传输文件,报文主体中包含文件内容,保存到对应的URI位置;
Head:获得报文首部,与Get类似,只是不返回报文主体,一般用于验证URI是否有效;
Delete:删除文件,与Put相反,删除对应URI位置的文件;
Options:查询响应URI支持的HTTP方法。
Get与Post的区别?
百度标准答案如下:
1.Get重点从服务器上获取资源,Post重点在向服务器发送数据;
2.Get请求在URL中参数的长度是有限制的,而Post没有;对于参数的数据类型,Get只接受ASCII字符,而Post没有限制;
3.Get参数通过URL传递,Post参数放在Request Body中,相对于Get,Post安全性更高些。
这些是比较表面的答案,拿所谓的安全性来说的话,Get参数在URL地址上,直接暴露,Post参数放在Body中,按F12也就直接暴露了,所以没啥安全性可言;
但Get和Post有一个重大区别,简单来说:
Get产生一个TCP数据包,Post产生两个TCP数据包;
即:对于Get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
对于Post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)。
cookies机制和session机制的区别?
cookies数据保存在客户端,session数据保存在服务器端;
cookies可以减轻服务器压力,但是不安全,容易进行cookies欺骗;
session比较安全,但是占用服务器资源。
HTTP和HTTPS区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计SSL(Secure Sockets Layer)协议将HTTP协议传输的数据进行加密,即HTTPS。简单来说HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,相较HTTP协议更安全。
HTTP和HTTPS区别如下:
1.HTTPS协议需要到CA申请证书,一般免费证书比较少,因而需要一定的费用;
2.HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议;
3.HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者默认是80,后者默认是443;
4.HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,比HTTP安全。
HTTP协议组成?
请求报文和响应报文
请求报文:
请求行:包含请求方法,URI,HTTP版本信息;
请求头部字段;
请求内容实体;
响应报文:
状态行:包含HTTP版本,状态码,状态码原因短语;
响应头部字段;
响应内容实体。
常见的HTTP CODE?
- 2XX 成功
200(OK):客户端发过来的数据被正常处理;
204(Not Content):正常响应没有实体;
206(Partial Content)访问请求,返回部分数据,响应报文中的Content-Range指定实体内容;
- 3XX 重定向
301(Moved Permanently):永久重定向;
302(Found):临时重定向;
303(See Other):和302类似,但必须使用Get方法;
- 4XX 客户端错误
400(Bad Request):请求报文语法错误;
401(unauthorized):需要认证;
403(Forbidden):服务器拒绝访问对应的资源;
404(Not Found):服务器上无法找到资源;
- 5XX 服务器端错误
500(Internal Server Error):服务器故障;
503(Service Unavailable):服务器超负载或者正在停机维护。
什么是HTTP协议无状态协议?怎么解决?
无状态协议是指对于事物处理没有记忆功能。
解决办法:通过cookies,或者session会话保存。
HTTP优化?
TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能,而后者是HTTP1.1协议所支持的新功能,目前被大多数浏览器所支持;
内容缓存:将经常用到的内容缓存起来,那么客户端就可以直接在内存中获取相应的数据了;
压缩:将文本数据进行压缩,减少带宽;
SSL加速:使用SSL协议对HTTP协议进行加密,在通道内加密并加速;
TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端的响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
HTTP1.1新版本的特性?
默认持久连接节省通信量:只要客户端服务端任意一端没有明确提出断开TCP连接,就可以发送多次HTTP请求;
管线化:客户端可以同时发出多个HTTP请求,而不用一个一个等待响应;
断点续传:实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输。
HTTPS工作原理
- 首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
- 客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
- 消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
- 发送给服务端,此时只有服务端(RSA私钥)能解密。
- 解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
HTTP协议的特征?
支持客户/服务器模式;
简单快速;
灵活;
无连接;
无状态。
关于localStorage?
localStorage是HTML5中新增的一个特性,这个特性主要用来作为本地存储使用的,解决了cookies存储空间不足的问题(cookies中每条cookies的存储空间为4K),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同;
优势:
localStorage扩展了cookies的4K限制;
localStorage可以将第一次请求的数据直接存储在本地,这个相当于一个5M大小的针对于前端页面的数据库,相比于cookies可以节约带宽(较高版本的浏览器才支持)。
局限:
浏览器大小不统一,IE8以上的版本才支持localStorage这个属性;
目前所有浏览器都会把localStorage的值类型设定为String类型,对于我们常见的JSON类型需要转换;
localStorage在浏览器的隐私模式下是不可读取的,不能被爬虫抓到;
localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,导致页面变卡。
localStorage与sessionStorage的唯一区别就是localStorage属于永久性存储而sessionStorage属于当会话结束的时候,sessionStorage中的键值对会被清空。
TCP三次握手?
1.客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器确认;
2.服务器端在收到SYN的数据包后,必须确认SYN,即发送ACK标志,同时,自己也将会向客户端发送一个SYN标志;
3.客户端在接收到服务器端的SYN+ACK包后,自己会向服务器发送ACK包,完成三次握手。那么客户端和服务器正式建立了连接,开始传输数据。
四次挥手?
1.客户端发送带有FIN标志的数据包告诉服务器准备断开通信;
2.服务器发送一个带有ACK标志的应答信息使客户端明白服务器还有数据要发送;
3.当服务器数据传输完成后,发送带有FIN标志的数据包,通知客户端断开连接;
4.客户端接收FIN标志后发送ACK进行确认,同时把自己设置为TIME_WAIT状态并启动定时器。
三次握手为什么不能改为两次握手?
三次握手中的每一次都是必须的。如果是两次握手,在第二次结束后,服务器并不能保证客户端已经收到了第二次的请求,如此一来的话,服务器会一直保存着这个通信进程,因为TCP通信都是占用端口的,造成了一定资源的浪费,所以,就一定要让客户端发送ACK的确认请求。
关闭的时候为什么是四次挥手?
四次挥手不能像三次握手一样,三次握手可以将SYN+ACK一起发送,ACK用于确认信息,SYN却是用来建立联机的;四次挥手中ACK不能和FIN一起发送,ACK只是告诉客户端确认收到了,等我将数据发送完毕之后会向其发送FIN的标志,所以四次挥手是不能改变的。
TCP、UDP协议的区别?
TCP:TCP提供可靠的、面向连接的服务,传输形式是字节流,但传输效率慢,所需资源多。要求通信数据可靠的场景如文件传输、邮件传输等使用TCP协议;
UDP:UDP提供不可靠、无连接的服务,传输形式是数据报文段,传输效率高,所需资源少。要求通信速度的场景如QQ语音等可使用UDP协议。