【面试】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协议。

 

posted @ 2019-10-21 14:37  一枚路过的小码农  阅读(167)  评论(0编辑  收藏  举报