前端面试知识点_HTTP


前言

仅用于个人学习总结,有不足还请指出。


1.概念

HTTP(超文本传输协议) 是应用层协议,用于从WWW服务器传输超文本到本地浏览器。
HTTP URL 包括用于查找某资源的详细信息:

http://www.csdn.net:8080/news/index.html?id=1&page=1#name

1.协议部分:http
2.域名:www.csdn.net
3.端口:8080
4.虚拟目录:域名后的第一个‘/’到最后一个’/‘之间的部分:/news/
5.文件名:index.html
6.参数部分:’?‘开始到’#'部分:id=1&page=1(非必须)
7锚:‘#’开始到结束:name(非必须)

2.报文

1.请求报文(Request)

请求报文格式如下:
在这里插入图片描述

分为四个部分:请求行,请求头,空行,请求正文,例子:

POST / HTTP1.1
Host:www.csdn.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

请求行

用于定义本次请求的请求方法,请求地址以及HTTP协议版本

GET /example.html HTTP/1.1 (CRLF)

请求方法:
GET:请求获取Request-URI所标识的资源(无请求正文)
POST:在Request-URI所标识的资源后增加新的数据(有请求正文
HEAD:请求获取由Request-URI所标识的资源的响应消息报头
PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
DELETE: 请求服务器删除Request-URI所标识的资源
TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

请求头

由一系列键值对组成,用于说明服务器要使用的附加信息

:authority: www.google.com.hk    # 请求的域名(对方的服务器地址)
:method: GET                     # 请求方法,一般浏览器访问网站使用GET请求                     
:path: /?gws_rd=ssl              # 请求路径,也就是 https://ww.google.com.hk/ 后面的内容
:scheme: https                   # 请求的协议,这里使用https协议(使用SSL加密的http协议)
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng响应头,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
# 请求文件类型,可以吧这里的文件类型Google一下,因为篇幅太长这里就不做详细介绍了(如text/html是文档/HTML文档的意思)
accept-encoding: gzip, deflate, br  # 压缩类型,支援gzip,deflate,br 压缩方式
accept-language: zh-HK,zh;q=0.9  # 浏览器语言,我的默认语言是 zh-hk (中国-香港)
cache-control: no-cache          # 缓存讯息,这里是 不缓存(no-cache)
pragma: no-cache                 # 缓存来源
sec-fetch-dest: document         # sec-fetch-* 意为如何使用返回的参数
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1     # 不用在意这个东西
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63
# 非常重要的浏览器UA,表明了浏览器的身份:是什么内核,运行在什么系统上
content-encoding: gzip  # 压缩使用Gzip压缩
content-length: 67582   #  HTTP消息长度 67582
content-type: text/html; charset=UTF-8  # 返回文件类型 text/html ,字符编码为 UTF-8
date: Tue, 10 Nov 2020 01:06:54 GMT   # 服务器的时间
server: gws  # 服务器名,这个其实可以自定义,一般用于标示自己用的是什么web服务器
set-cookie: 1P_JAR=2020-11-10-01; expires=Thu, 10-Dec-2020 01:06:54 GMT; path=/; domain=.google.com.hk; Secure; SameSite=none
set-cookie: NID=204=Zl-c80ku7NgAF7VKJt84n2Z4DGob3kh9RCnBCaf21NgeIKVA7GsixU8st4FdJvPODEnS_EYoXKbPOrdhxKI_Si4k2PeLInLNoE5KNlBC1DKyZHP1z0GLesmx8sN-H4hFUe3cvrUDJMyUTq6rTyG8DL4X-rRLcgn1Iy32UlaxFDo; expires=Wed, 12-May-2021 01:06:54 GMT; path=/; domain=.google.com.hk; Secure; HttpOnly; SameSite=none
# set-cookie 是给予cookie
status: 200  # 状态码,非必要
strict-transport-security: max-age=31536000
x-frame-options: SAMEORIGIN
x-xss-protection: 0

请求正文

发送POST请求时才会有请求正文,请求发送的数据

2.响应报文(Response)

响应报文格式如下:
在这里插入图片描述
分为四个部分:响应行,响应头,空行,响应体,例子:

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

响应行

用于定义本次响应的HTTP协议版本,状态码以及文本描述

HTTP/1.1 200 OK

状态码一般由三位数字组成,第一个数字代表响应类别,共五类:
1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求
常见状态码:

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

响应头

与HTTP请求头类似,包括一些列键值对用于说明服务器的一些附加信息。

响应体

响应体式服务器根据客户端的请求返回给客户端的具体数据。

PPPPSSSS:请求报文和响应报文中的空行作用相同,即标注头部的结束。

3.特点

1.客户/服务器模式
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.非持久连接:HTTP1.0每进行一次通信就要断开TCP链接,下次再重新建立TCP链接。HTTP1.1的每次TCP连接可以传送多个HTTP请求和响应(解决了非持久链接的问题)。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

4.其他

4.1 HTTP2.0在HTTP1.1上的改进

1、二进制分帧: HTTP1.1是通过文本的方式传输数据,表现形式具有多样性,而二进制只有0和1两种状态,实现方便且稳定;
2、首部压缩: HTTP1.*中header中带有大量信息(特别是包括cookie时),每次都需要重复发送;HTTP2.0采用头部压缩算法对传输的header进行编码,并在客户端和服务端维护一张索引表来记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。
3、多路复用: HTTP1.1虽然支持并发多个请求,但页面需要请求很多资源时,队头阻塞会导致在达到最大请求时,会阻碍排在后面的请求;HTTP2.0可以同时处理多个消息请求和响应,甚至交错发送数据,避免了队头阻塞问题,提高了传输性能。
4、服务器推送: HTTP1.1中,一个客户端的请求对应一个响应。在HTTP2.0中,服务器可以对一个客户端的请求发送多个响应。如果一个请求是由你的主页发送的,服务器可能会响应主页内容、logo以及样式表,因为他知道客户端会用到这些东西。这样不但减轻了数据传送冗余步骤,也加快了页面响应的速度,提高了用户体验。

4.2 HTTPS

HTTP的不足

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

针对这些缺点,人们提出了HTTPS(HTTPS = HTTP +加密 +认证 +完整性保护

原理

HTTPS即 HTTP 下 加入 SSL 层进行加密。其作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性。

  1. 客户端使用 https url 访问服务器,则要求 web 服务器建立SSL链接
  2. web 服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥+数字签名),传输给客户端
  3. 客户端使用数字认证机构的公开 密钥验证数字签名,从而验证服务器公开密钥的真实性
  4. 客户端和 web 服务器端开始协商 SSL 链接的安全等级,也就是加密等级。
  5. 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
  6. web 服务器通过自己的私钥解密出会话密钥
  7. web 服务器通过会话密钥加密与客户端之间的通信

区别

  • http 是超文本传输协议,信息是明文传输,HTTPS 协议要比 http 协议安全,https 是具有安全性的 ssl 加密传输协议,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
  • http 协议的默认端口为 80,https 的默认端口为 443。
  • http 的连接很简单,是无状态的。https 握手阶段比较费时,会使页面加载时间延长 50%,增加 10%~20%的耗电。
  • https 缓存不如 http 高效,会增加数据开销。
  • Https 协议需要 ca 证书,费用较高,功能越强大的证书费用越高。
  • SSL 证书需要绑定 IP,不能再同一个 IP 上绑定多个域名。

4.3 HTTP跨域请求问题

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。
同源策略,是浏览器对 JavaScript 实施的安全限制,只要协议、域名、端口有任何一个不同,都被当作是不同的域。
跨域原理,即是通过各种方式,避开浏览器的安全限制。

同源策略类别

  • DOM 同源策略 : 禁止对不同源页面的 Dom 元素进行操作,主要是在 iframe 标签加载跨域页面出现。
  • XMLHttpRequest 同源策略 : 禁止使用 XHR 对象对不同源地址发起请求。
  • 存储在浏览器中的数据,如localStroage、Cooke和IndexedDB不能通过脚本跨域访问

解决方案:JSONP

ajax 请求受同源策略影响,不允许进行跨域请求,而 script 标签 src 属性中的链 接却可以访问跨域的 js 脚本,利用这个特性,服务端不再返回 JSON 格式的数据,而是 返回一段调用某个函数的 js 代码,在 src 中进行了调用,这样实现了跨域。

//动态创建 script
var script = document.createElement('script');
// 设置回调函数
function getData(data) {
    console.log(data);
}
//设置 script 的 src 属性,并设置请求地址
script.src = 'http://localhost:3000/?callback=getData';

// 让 script 生效
document.body.appendChild(script);

缺点:JSONP 只支持 get,因为 script 标签只能使用 get 请求; JSONP 需要后端配合返回指定格式的数据

4.4 Session和Cookie的区别

!!!cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

Cookie工作原理:

  1. 客户端第一次发送请求给服务器端;
  2. 服务端创建Cookie(包含用户的信息,对应一个识别码)并将其发送给客户端,客户端会保存cookie文件;
  3. 客户端再次访问服务端时,会自动在请求报文中加入Cookie值发送给服务端;
  4. 服务端接受到报文后,通过Cookie值就能确认用户身份。

Session工作原理:

  1. 客户端第一次访问服务端;
  2. 服务端创建一个sessionId和session形成一个映射关系,session保存在后端数据库,然后将sessionId发送给客户端并保存;
  3. 客户端再次访问服务端时,会自动在请求报文的首部行中加入sessionId;
  4. 服务端根据sessionId去查询Session对象,从而区分不同用户。

Session&Cookie区别:

  1. Cookie数据存放在客户端上,Session数据存放在服务器上;
  2. Cookie不是很安全,攻击者可以分析客户端本地的Cookie进行身份伪装,考虑到安全可以使用Session。
  3. 单个Cookie在客户端的数据大小限制为4k,session过多时会消耗服务器资源

Cookie&sessionStorage&localStorage区别:

  • cookie数据大小不能超过4k;sessionStorage和localStorage的存储比cookie大得多,可以达到5M+
  • cookie设置的过期时间之前一直有效;localStorage永久存储,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage数据在当前浏览器窗口关闭后自动删除
  • cookie的数据会自动的传递到服务器;sessionStorage和localStorage数据保存在本地

总结

以上就是关于HTTP知识点的一些总结,如有不足还请指出!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值