http

27 阅读16分钟

1. GET和POST的请求的区别

PostGet都是Http请求的方法,两者主要的局别有以下:

  • **应用场景:**GET请求是一个幂等的请求,一般应用于请求一些网络资源。而Post则不是幂等请求,一般用于客户端与服务端的数据交互等。

  • **是否缓存:**因为应用场景的不同,所以浏览器一般会GET请求的资源,而Post不会被缓存

  • **发送报文的格式:**Get请求一般会将参数携带在Url上,请求实体上为空,而Post请求主要参数部分都放在请求实体上。

  • **安全性:**Get请求的参数是在URL上,这种方式相对于Post请求来说,是不安全的。因为请求的 url 会被保留在历史记录中。

  • **请求长度:**浏览器由于对 url 长度的限制,因此对Get请求会有限制。

2. 常见的HTTP请求头和响应头

HTTP Request Header 常见的请求头:

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Language:浏览器当前设置的语言
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

HTTP Responses Header 常见的响应头:

  • Date:表示消息发送的时间,时间的描述格式由rfc822定义
  • server:服务器名称
  • Connection:浏览器与服务器之间连接的类型
  • Cache-Control:控制HTTP缓存
  • content-type:表示后面的文档属于什么MIME类型

3. 常见的HTTP请求方法

  • GET:向服务器获取数据
  • POST 将实体提交到指定的资源,通常会造成服务器资源的修改;
  • PUT:上传文件,更新数据;
  • DELETE:删除服务器上的对象;
  • HEAD:获取报文首部,与GET相比,不返回报文主体部分;
  • OPTIONS:询问支持的请求方法,用来跨域请求;
  • CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;
  • TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。

4. HTTP 1.0 和 HTTP 1.1 之间有哪些区别?

  • **连接方面:**Http1.0使用的是非持久连接,而Http1.1使用的是持久连接。Http1.1使用持久连接来使得多个Http请求复用同一个TCP请求,避免了使用非持久连接每次都需要建立连接所需要的延迟。

  • **资源请求方面:**Http1.0不支持只请求资源某个部分和不支持断点续传功能,Http1.1请求头引用range,它允许只请求资源的某个部分,可以让开发者充分利用资源和宽带

  • 缓存方面Http1.0中主要使用着If-Modified-Since、Expires来做为缓存判断的标准,Http1.1引用了更多的缓存控制策略,例如Etag、If-Unmodified-Since、If-Match、If-None-Match

  • http1.1 中新增了 host 字段,用来指定服务器的域名

  • http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等

5.HTTP 1.1 和 HTTP 2.0 的区别

  • **二进制编码:**Http2.0是一个二进制协议,头信息和数据体都是二进制。也可以成为头信息帧和数据帧。而Http1.1则是头信息必须是文本,而数据体可以是文本也可以是二进制

  • 多路复用: HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"【1】的问题。

  • **数据流:**HTTP/2 使用了数据流的概念,因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。

  • 头信息压缩: HTTP/2 实现了头信息压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。HTTP/2 对这一点做了优化,引入了头信息压缩机制。

  • **服务器推送:**HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。

7.HTTP和HTTPS协议的区别

  • HTTPS协议需要CA证书,费用较高;而HTTP协议不需要;

  • HTTP协议是超文本传输协议,信息是明文传输的,HTTPS则是具有安全性的SSL加密传输协议;

  • 使用不同的连接方式,端口也不同,HTTP协议端口是80,HTTPS协议端口是443;

  • HTTP协议连接很简单,是无状态的;HTTPS协议是有SSL和HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP更加安全。

8.当在浏览器中输入 Google.com 并且按下回车之后发生了什么?

  • 解析URL::先对URL进行解析,分析所需要使用的传输协议和请求的资源的路径。判断URL内是否有非法字符,是否需要转义等等。
  • **缓存的判断:**判断是否在缓存中,如果存在则直接使用,否则重新向服务端发起请求
  • **DNS解析:**通过一系列的域名解析获取URL的域名的IP地址
  • **获取MAC地址:**浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址。
  • **TCP三次握手:**通过3次握手实现TCP连接
  • HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。
  • **返回数据:**通过服务端返回数据,获取所需要的资源与数据
  • **渲染页面:**根据返回数据与资源,进行页面的渲染
  • **TCP的四次挥手:**通过四次挥手断开Http连接

9.对Keep-alive的理解

对于Http1.0的默认情况下是每次请求/应答,都需要客户端和服务端建立一个连接,完成后断开连接,也被称为短连接。而当使用Keep-alive模式的时候,使得客户端和服务端的连接长期有效。避免了每次都需要重新建立连接。

  • Http1.0默认是短连接,默认是没有Keep-alive模式的,如想实现长连接,则需要手动配置Connection:keep-alive,如想关闭长连接,则Connection:close

  • Http1.1默认是长连接模式。数据传输完成了保持TCP连接不断开,等待在同域名下继续用这个通道传输数据。如果需要关闭,需要客户端发送Connection:close首部字段。

Keep-Alive的建立过程:

  • 客户端向服务器在发送请求报文同时在首部添加发送Connection字段
  • 服务器收到请求并处理 Connection字段
  • 服务器回送Connection:Keep-Alive字段给客户端
  • 客户端接收到Connection字段
  • Keep-Alive连接建立成功

10.Http请求报文的内容

Http的请求报文主要有四大部分:1.请求行、2.请求头部、3.空行、4.请求体

jpZfvF.md.png

解析:

  • 请求行内容:Http请求方法 + 空格 + Url + 空格 + Http版本协议,例如:GET /index.html HTTP/1.1
  • 请求头部信息:就是头部信息,有关键字/值对形成。例如Accept,Connection,Accept-Language,User-Agent,Host等相关配置
  • 请求体:post,put等所携带的数据信息

11.Http的响应报文信息

Http的响应报文主要有四大部分:1.响应行、2.响应头部、3.空行、4.响应体

jpefit.md.png

  • 响应行内容:Http版本协议 + 空格 + 状态码 + 空格 + 状态码原因短语,例如:HTTP/1.1 200 OK
  • 响应头部信息:就是头部信息,有关键字/值对形成。例如Date、serve、Content-Type等相关配置
  • 响应体:http请求返回的相关数据。

12.HTTP协议的优点和缺点

HTTP 是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。它使用 TCP 作为传输层协议,保证了数据传输的可靠性。

优点:

  • **简单快速:**HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
  • **无连接:**无连接就是限制每次连接只处理一个请求
  • **无状态:**HTTP 协议是无状态协议,这里的状态是指通信过程的上下文信息。在服务器不需要先前信息时它的应答就比较快。
  • **灵活:**HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。

缺点:

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

13. 什么是HTTPS协议?

HTTPS是一种计算机网络安全传输协议。HTTPS是通过HTTP进行通信,并且通过SSL/TLS进行加密传输数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。 HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而HTTPS协议的TLS/SSL具有身份验证、信息加密和完整性校验的功能

SSL/TLS的工作原理

SSL/TLS被称为安全传输层协议,是介于HTTP和TCP之间的一层安全协议,并不会影响原有的TCP和HTTP。

SSL/TLS主要以来的三大算法:散列函数Hash、非对称加密、对称加密

  • 散列函数Hash:验证信息的完整性。该函数的特点是单向不可逆,对输入数据非常敏感,输出的长度固定,任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性。

  • 非对称加密:实现身份认证和秘钥协商。非对称加密的方法是,我们拥有两个秘钥,一个是公钥,一个是私钥。公钥是公开的,私钥是保密的。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。

  • 对称加密:采用协商的秘钥对数据加密,即对称加密的方法是,双方使用同一个秘钥对数据进行加密和解密。

HTTPS的握手过程

  1. 客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。

  2. 服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。

  3. 客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服务器。并且还会提供一个前面所有内容的 hash 的值,用来供服务器检验。

  4. 服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验。

  5. 客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息

HTTPS的优点如下:

  • 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;

  • 使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据安全性;

  • HTTPS是现行架构下最安全的解决方案,虽然不是绝对的安全,但是大幅增加了中间人攻击的成本;

HTTPS的缺点如下:

  • HTTPS需要做服务器和客户端双方的加密个解密处理,耗费更多服务器资源,过程复杂;

  • HTTPS协议握手阶段比较费时,增加页面的加载时间;

  • SSL证书是收费的,功能越强大的证书费用越高;

  • HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本;

  • SSL证书需要绑定IP,不能再同一个IP上绑定多个域名。

HTTP的状态码

j9c18s.md.png

  1. 2XX(Success 成功状态码)
  • 200 OK:200 OK表示客户端发来的请求被服务器端正常处理了。
  • 204 No Content:该状态码表示客户端发送的请求已经在服务器端正常处理了,但是没有返回的内容,响应报文中不包含实体的主体部分。
  1. 3XX (Redirection 重定向状态码)
+ `301 Moved Permanently`:永久重定向,该状态码表示请求的资源已经被分配了新的 URI,以后应使用资源指定的 URI。
+ `302 Found`:临时重定向,该状态码表示请求的资源被分配到了新的 URI,希望用户(本次)能使用新的 URI 访问资源。
+ `304 Not Modified`:浏览器缓存相关。 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
+ `307 Temporary Redirect`:307表示临时重定向。 该状态码与 302 Found 有着相同含义,尽管 302 标准禁止 POST 变成 GET,但是实际使用时还是这样做了。

3. 4XX (Client Error 客户端错误状态码)

  • 400 Bad Request:该状态码表示请求报文中存在语法错误。
  • 401 Unauthorized:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。若之前已进行过一次请求,则表示用户认证失败
  • 403 Forbidden:该状态码表明请求资源的访问被服务器拒绝了
  • 404 Not Found:该状态码表明服务器上无法找到请求的资源。
  • 405 Method Not Allowed:该状态码表示客户端请求的方法虽然能被服务器识别,但是服务器禁止使用该方法。
  1. 5XX (Server Error 服务器错误状态码)
  • 500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误。
  • 502 Bad Gateway:该状态码表明扮演网关或代理角色的服务器,从上游服务器中接收到的响应是无效的。
  • 503 Service Unavailable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
  • 504 Gateway Timeout:该状态码表示网关或者代理的服务器无法在规定的时间内获得想要的响应。

同样是重定向,307,303,302的区别?

302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码⼜出来了两个303307303明确表示客户端应当采⽤get⽅法获取资源,他会把POST请求变为GET请求进⾏重定向。 307会遵照浏览器标准,不会从post变为get

DNS域名系统的浅谈

DNS是(Domain Name System)的简称,是一种提供主机名到IP地址的转换服务,也就是常说的域名系统。它是有一个由分层的DNS服务器组成的分布式数据库,定义了主机如何查询这个分布式数据库的方式的一种应用程协议。它的作用是让人更好更快的访问互联网,而不用去记住那些不易记住的IP地址。

DNS的查询过程

  • 浏览器缓存中查询:首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
  • **本地DNS服务器缓存:**将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
  • 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
  • 本地DNS服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
  • 本地DNS服务器向权威域名服务器发送请求,域名服务器返回对应的结果

OSI的七层协议

jt2ao4.md.png

TCP的三次握手和四次挥手

TCP的三次握手:

  1. 客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。

  2. 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。

  3. 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。

TCP的四次挥手

  1. 若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。

  2. 服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。

  3. 服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。

  4. 客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态

为什么有四次挥手: 因为 TCP 的连接是双向的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代 表不能再向对方发送数据,连接处于的是半释放的状态。