HTTP及相关知识

浏览器输入URL并回车的过程以及相关协议,DNS查询过程。

在浏览器输入URL,按下回车会经历那些流程?

1、DNS域名解析,得到IP地址
DNS解析流程:
(1).在主机查询DNS缓存,如果没有就会给本地的DNS发送查询请求
(2).本地的DNS服务器向根域名服务器发送查询请求,根域名服务器返回该域名的一级域名服务器
(3).该本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址

2、解析出IP地址后,根据IP地址和默认端口80和服务器建立连接
3、浏览器发出读取文件(URL中域名后边部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
4、服务器对浏览器的请求作出响应,并把对应的html文本发送给浏览器
5、释放TCP连接(四次挥手断开连接)
6、浏览器解析该HTML文本并显示内容

过程中用到的协议以及作用
1、域名解析用到DNS协议
2、DNS服务器是基于UDP的,因此会用到UDP协议
3、得到IP地址后,浏览器会与服务器建立HTTP连接,用到HTTP协议
4、http协议生成GET请求报文,将该报文传给TCP层处理,用到了TCP协议
5、如果用到了HTTPS协议还会对HTTP协议内容进行加密
6、TCP层若有需要会对HTTP数据报分片,分片依据路径MTU和MSS
7、TCP的数据报会发送给IP层,用到IP协议
8、IP层通过路由选择,将数据发送给目的端口
9、以太网协议需要知道目的IP的物理地址,需要用到ARP协议

用到了网络中的哪些层,每一层的作用

1.DNS协议,HTTP协议,HTTPS协议属于应用层
应用层是体系结构中的最高层。应用层确定进程之间通信的性质满足用户的需要。这里所说的进程就是指正在运行的程序。应用层不仅需要提供应用进程需要的信息交换,而且还要作为相互作用的应用进程的用户代理,来完成一些为进行语义上有意义的交换所必须的功能。

2.TCP/UDP属于传输层
传输层的任务就是负责主机中两个进程间的通信。因特网的传输层可使用两种不同的协议;即面向连接的传输控制协议TCP和无连接的用户数据报协议UDP。面向连接的服务能够提供可靠的交付,两种方式都各有其优点
3.IP协议和ARP协议属于网络层
网络层负责为分组交换网上的不同主机提供通信。在发送数据时,网络层将传输层产生的报文段或用户数据报封装成分组或者包进行传送。在TCP/IP体系中,分组也叫作IP数据报。网络层的另一个任务就是选择合适的路由,使源主机传输层传下来的分组能够交付到目的主机。

4.数据链路层
当发送数据时,数据链路层的任务是将在网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送以帧为单位的数据。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制以及流量控制等信息)。控制信息使接收端能够知道一个帧从那个比特开始到那个比特结束。控制信息还使接收端能够检测到所收到的帧中有没有差错。

5.物理层
物理层的任务就是透明的传送比特流。在物理层上所传输的数据的单位是比特。传递信息所利用的一些物理媒介,如双绞线、同轴电缆、光缆等,并不是在物理层之内而是在物理层的下面。因此也有人把物理媒体当做第0层。

9、HTTP1.0、1.1、2.0之间的区别

http 1.0
1、链接无法复用,即不支持持久链接:
http 1.0 规定浏览器与服务器保持较短时间的链接,浏览器每次请求都和服务器经过三次握手和慢启动(基本思想是当TCP开始传输数据或发现数据丢失并开始重发时,首先慢慢的对网路实际容量进行试探,避免由于发送了过量的数据而导致阻塞)建立一个TCP链接,服务器完成请求处理后立即断开TCP链接,而且不跟踪每个浏览器的历史请求。
注意:由于http 1.0每次建立TCP链接对性能的影响实在是太大,http1.1实现持久化链接之后,又反向移植到http 1.0上,只是默认是没有开启持久链接的,通过http的header部分的 Connection: KeepAlive 来启用)
2、线头阻塞(Head of Line (HOL) Blocking)
请求队列的第一个请求因为服务器正忙(或请求格式问题等其他原因),导致后面的请求被阻塞。

http 1.1
1、支持持久链接(在request和response中的header中的connection是close或者Keep-Alive进行控制)
一个TCP链接可以传送多个http请求和相应,减少了TCP建立链接和关闭链接的消耗。另外http1.1允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能 够区分出每次请求的响应内容。

2、支持http管道
不使用管道的http请求,在使用持久链接时,必须严格满足先进先出的队列顺序(FIFO),即发送请求,等待响应完成,再发送客户端队列中的下一个请求。管道可以让我们把 FIFO 队列从客户端(请求队列)迁移到服务器(响应队列),即客户端可以并行,服务端串行。客户端可以不用等待前一个请求返回,发送请求,但服务器端必须顺序的返回客户端的请求响应结果。
缺点:
a. 一个请求响应阻塞,就会阻塞后续所有请求
b. 并行处理请求时,服务器必须缓冲管道中的响应,从而占用服务器资源,如果有个响应非常大,则很容易形成服务器的受攻击面;
c. 响应失败可能终止 TCP 连接,从页强迫客户端重新发送对所有后续资源的请求,导致重复处理;
d. 由于可能存在中间代理,因此检测管道兼容性,确保可靠性很重要;
e. 如果中间代理不支持管道,那它可能会中断连接,也可能会把所有请求串联起来。

3、使用多个TCP链接
http1.1 在客户端排队所有请求,然后通过一个TCP持久链接,一个接一个的发送请求(如果有http管道还必须顺序等待服务端的顺序返回结果)。但实际中,浏览器的开发时不会这么笨,浏览器允许我们打开N个TCP链接(大多说浏览器是6个TCP链接,这个数字越大,客户端和服务器的资源占用越多,这个数据也只是感觉安全的数字而已)。
带来的好处:

  1. 客户端可以并行发送最多 N个请求;
  2. 服务器可以并行处理最多 N个请求;
  3. 第一次往返可以发送的累计分组数量(TCP cwnd)增长为原来的 N 倍。
    代价:
    1.更多的套接字会占用客户端、服务器以及代理的资源,包括内存缓冲区和 CPU时钟周期;
    2.并行 TCP 流之间竞争共享的带宽;
    3.由于处理多个套接字,实现复杂性更高;
    4.即使并行 TCP 流,应用的并行能力也受限制。
    因此使用多个TCP链接只是权宜之计,后续的http 2.0支持多路复用,很好的解决了上述问题。
    4、 http 1.1 增加了请求头和响应头来扩充功能
    举例:
    a. 支持Host请求:
    b. Connection: 请求头的值为Connection时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close 时,客户端通知服务器返回本次请求结果后关闭连接
    c. 支持断点续传:
    d.身份认证:
    e.状态管理:
    f. 缓存处理:

5、域名分区
域名分区是思想是将原来集中到一个服务器上的资源分布到多个服务器上,这样就可以突破浏览器的链接限制(一般是6个),提高并行能力。
代价:

  1. 每多一台主机都要多一次的 DNS 查询,每多一个套接字都会多消耗两端的一些资源;
    2.必须手工分离一台主机上的资源到多台;.
    实际实践中,效果并不是很明显,反而导致被滥用。
    6、http的header的优化
    目前所有的header请求都是以没有经过压缩的纯文本的形式发送(通常会有600`1000字节),而通常使用的http请求body却很少(10~200字节),和header相比,显得很少,特别是在使用了cookie之后,这样的矛盾就更加突出,因此要减少header的数据。
    7、减少连接次数
    即将需要多次才能获取的文件或资源组合并成一个,通过一次网络请求获取。这样减少了协议的开销,间接地将服务器端的管道思维移植到了客户端。缺点:增加复杂性,更缓存带来负担,页面的分步显示,改成一次显示,在网络慢的时候影响用户体验。
    8、嵌入小的文件
    即将资源嵌入文档(通过URI嵌入图片,音频或PDF),可以减少请求次数。嵌入资源作为页面的返回一部分一次返回,即如果在多个页面中都嵌入同样的资源,那么这个资源将会随着每个页面的加载而被加载,从而增大每个页面的总体大小,如果嵌入资源被更新,客户端只能重新获取有效的资源。
    实践:一般只考虑嵌入1~2KB一下的资源
    参照建议:
  2. 如果文件很小,而且只有个别页面使用,可以考虑嵌入;
    2.如果文件很小,但需要在多个页面中重用,应该考虑集中打包;
  3. 如果小文件经常需要更新,就不要嵌入了;
  4. 通过减少 HTTP cookie 的大小将协议开销最小化。

http 2.0
HTTP 2.0把解决性能问题的方案内置在了传输层,通过多路复用来减少延迟,通过压缩 HTTP首部降低开销,同时增加请求优先级和服务器端推送的功能。
1、支持多路复用
多路复用允许同时通过单一的 HTTP 2.0 连接发起多重的请求-响应消息,即所有HTTP 2.0 连接都是持久化的,而且客户端与服务器之间也只需要一个连接即可,所有数据流共用同一个连接 ,减少了因http链接多而引起的网络拥塞(在 HTTP1.1 协议中,同一时间,浏览器会针对同一域名下的请求有一定数量限制),解决了慢启动针对突发性和短时性的http链接低效的问题。
2、将通信的基本单位缩小为帧
即应用层(HTTP)和传输层(TCP or UDP)之间增加一个二进制分帧层,因此在多向请求和响应时,客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来,解决了http 1.*的对手阻塞问题。
3、首部压缩
http 2.0支持DEFLATE和HPACK 算法的压缩。
4、服务端推送
指客户端请求之前发送数据的机制,在 HTTP 2.0 中,服务器可以对客户端的一个请求发送多个响应。
5、请求优先级
HTTP 2.0 使用一个31比特的优先值,0表示最高优先级, 2(31)-1表示最低优先级,服务器端就可以根据优先级,控制资源分配,优先处理和返回最高优先级的请求帧给客户端。

10、HTTP与HTTPS之间的区别,HTTPS链接建立的过程,了解对称加密算法和非对称加密算法不?

一、Http和Https的区别
  Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
开销:Https通信需要证书,而证书一般需要向认证机构购买;
Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

二、对称加密与非对称加密
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
解释这里的密匙:(A,B,C,D)转换成(摸左耳朵,摸右耳朵,放左手,放右手)”
为什么叫对称加密?
一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。他们之间的关系如下:
明文 <-> 密钥 <-> 密文

而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
但是此时交换的两个公钥不一定正确

11、HTTP请求有哪些,多说点。Post和get区别。

HTTP请求的常用方法有:GET方法、POST方法、HEAD方法、PUT方法、DELETE方法、CONNECT方法、OPTIONS方法、TRACE方法。

Post和get区别

  1. GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密)
  2. GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源)
  3. GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
  4. GET可以被保存为书签,POST不可以。这一点也能感受到。
  5. GET能被缓存,POST不能
  6. GET只允许ASCII字符,POST没有限制
  7. GET会保存再浏览器历史记录中,POST不会。这点也能感受到。

总之,两者之间没有本质区别,区别就在于数据存储的位置。各自有适用环境,根据需求选择合适的方法即可。

12、HTTP常见响应状态码

1.100-199信息响应
100 Continue: 服务器通知浏览器之前一切正常,请客户端继续请求,如果请求结束,可忽略;
101 Switching Protocal: 针对请求头的Upgrade返回的信息。表明服务器正在切换到指定的协议。
103 Early Hints: 此状态代码主要用于与Link链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源

2.200-299成功响应
200 OK: 请求成功
201 Created: 常用于POST,PUT 请求,表明请求已经成功,并新建了一个资源。并在响应体中返回路径。
202 Accepted: 请求已经接收到,但没有响应,稍后也不会返回一个异步请求结果。 该状态码适用于等待其他进程处理或者批处理的场景。
203 No-Authoritative Information: 表明响应返回的元信息(meta-infomation)和最初的服务器不同,而是从本地或者第三方获取的。
主要用于其他资源的镜像和备份。除了前面的情况,首选还是200。
204 No Content: 请求没有数据返回,但是头信息有用。用户代理(浏览器)会更新缓存的头信息。
205 Reset Content: 告诉用户代理(浏览器)重置发送该请求的文档。
206 Partical Content: 当客户端使用Range请求头时,返回该状态码。

用户代理:代替用户运行的软件,如web浏览器,或者邮件阅读器。

3.300-399重定向消息
300 Multiple Choice: 返回多个响应,需要浏览器或者用户选择;
301 Moved Permanently: 请求资源的URL被永久的改变,新的URL会在响应的Location中给出。
浏览器到新的URL重新请求资源,因为有些客户端会把请求方式method改成GET。所以该状态码建议GET和HEAD方法中使用。
搜索引擎会更新地址到资源的链接(SEO中‘link-judge’被发送到新的URL)。
302 Found: 请求资源的URL被暂时修改到Location提供的URL。未来可能还会有新的修改。
浏览器会根据新的URL重新请求资源。有些客户端会把方法method改为GET,建议在GET和HEAD方法中使用。
搜索引擎不会更改URL到资源的。
303 See Other: 服务通过返回的响应数据指导客户端通过GET方法去另一个URL获取资源。
通常用于POST或者PUT的请求返回结果,重定向到信息提示页面或者进度展示页面。
重定向页面的方法是GET方法。
304 Not Modified: 资源未变更。服务器根据请求头判断,需要资源未修改,只返回响应头;否则将资源一起返回。
发生场景:1)请求方法安全(如GET,HEAD请求)
2)条件请求并且使用了If-None-Match或者If-Modified-Since 的请求头
如果想使用200状态码达到相同304效果,需要强制缓存,需要额外的请求头:Cache-Control, Expires, Vary
307 Temporary Redirect: 临时重定向。基本和302相同。
唯一的区别是这个状态码严格禁止浏览器到新URL请求资源时修改原来的请求方式和请求体。
就是说原来使用POST,这次还是要使用POST。
如果想要用PUT方法去修改一个服务器上没有的资源,可以用303状态码
如果想要把一个POST方法改为GET,请使用303。
308 Permanent Redirect: 永久重定向。基本和301相同。但是严格禁止修改请求方式和请求体。

  1. 400-499 客户端错误响应
    400 Bad Request: 请求语法有问题,服务器无法识别。
    没有host请求头字段,或者设置了超过一个的host请求头字段。
    401 UnAuthorized: 客户端未授权该请求。缺乏有效的身份认证凭证,一般可能是未登陆。登陆后一般都解决问题。
    403 Forbidden: 服务器拒绝响应。权限不足。
    404 Not Found: URL无效或者URL有效但是没有资源。
    405 Method Not Allowed: 请求方式Method不允许。但是GET和HEAD属于强制方式,不能返回这个状态码。
    406 Not Acceptable: 资源类型不符合服务器要求。
    407 Proxy Authorization Required: 需要代理授权。
    408 Request Timeout:服务器将不再使用的连接关闭。响应头会有Connection: close。
    426 Upgrade Required: 告诉客户端需要升级通信协议。

  2. 500-599 服务器错误响应
    500 Internal Server Error: 服务器内部错误,未捕获。
    502 Bad Gateway: 服务器作为网关使用时,收到上游服务器返回的无效响应。
    503 Service Unavailable: 无法服务。一般发生在因维护而停机或者服务过载。
    一般还会伴随着返回一个响应头Retry-After: 说明恢复服务的估计时间。
    504 Gateway Timeout: 网关超时。服务器作为网关或者代理,不能及时从上游服务器获取响应返回给客户端。
    505 Http Version Not Supported: 发出的请求http版本服务器不支持。如果请求通过http2发送,服务器不支持http2.0,就会返回该状态码。

13、重定向和转发区别

1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址
3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变
4、重定向是两次request,转发只有一次请求
5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

14、cookie和session区别。

1、数据存放位置不同:
cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全程度不同:
cookie不是很安全,别人可以分析存放在本地的COOKIE并进COOKIE欺骗,考虑到安全应当使用session。
3、性能使用程度不同:
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据存储大小不同:
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。
5、会话机制不同
session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。
cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

posted @ 2020-04-06 22:41  冰糖雪梨园  阅读(161)  评论(0)    收藏  举报