Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP #15

Open
emilyzfive opened this issue May 12, 2021 · 0 comments
Open

HTTP #15

emilyzfive opened this issue May 12, 2021 · 0 comments

Comments

@emilyzfive
Copy link
Owner

浏览器输入URL后发生的事

DNS 解析域名,找到对应IP地址;
浏览器与 IP 地址对应的 web 服务器建立 TCP 连接;
浏览器获取 HTML 代码;
渲染页面;
窗口关闭时,浏览器终止与服务器的连接。

五层模型

应用层
传输层
网络层
数据链路层
物理层

物理层:把电脑连接起来的物理手段

数据链路层:确定了 0 和 1 的分组方式,(电信号分组方式),以太网协议为主导,一组电信号构成一个数据包,叫做帧,每一帧包含标头(Head)和数据(Data)

数据包必须从一块网卡,传送到另一块网卡,网卡的地址,就是 MAC 地址,网卡出厂的时候就有标识
广播的发送方式,向本网络内所有计算机发送,如果接受方的 MAC 地址和自身的相同,泽接受这个数据包,否则丢弃

网络层:广播的方式仅限于子网络,导致了网络层的诞生,网络层的作用是引进一套新地址,用来区分不同的计算机是否属于同一个子网络。于是每台计算机有了两个地址,一是 MAC 地址,另一个是网址,两者之间没有联系,网络地址是管理员分配的。

规定网络地址的协议叫 IP 协议,它所定义的地址,叫 IP 地址

子网掩码,用来判断两个 IP 地址,是否属于同一个子网络

数据包从一台计算机发送到另一台计算机,需要知道对方的两个地址,一是 MAC 地址,二是 IP 地址,通常情况下,IP 地址是已知的,(DNS 协议)那怎么知道 MAC 地址呢?如果两台主机不在同一个子网络,只能把数据包交给网关去处理,接收方的地址将是网关的 MAC 地址。如果在同一子网络,则使用 ARP 协议得到对方的 MAC 地址。

ARP 协议是发出一个数据包,包含要查询的主机 IP 地址,对方 MAC 地址填的是 FF:FF:FF:FF,广播,子网络的所有主机会收到这个数据包,如果 IP 地址和自身相同,则报告自己的 MAC 地址。

传输层:数据包到底供哪个程序(进程)使用?传输层就是建立“端口到端口”的通信。相比之下,网络层是建立“主机到主机”的通信

在数据包中加入端口信息,UDP 协议实现的,简单,缺点是可靠性差,一旦发出,不知道对方是否收到。
tcp 协议解决了这个问题,加入了确认机制

应用层:应用程序收到传输层的数据,五花八门,必须事先规定好格式,否则无法解读,应用层的作用,就是规定应用程序的数据格式。

image

TCP 三次握手

客户端发送 syn 包(syn = j)到服务器,请求建立连接;
服务器收到 syn 包,向客户端发送 ack 包(ack = j + 1),同时发送一个自己的 syn 包(syn = k);
客户端收到服务器的 ack + syn 包,向服务器发送确认包 ack(ack = k + 1)

TCP 四次挥手

  1. 客户端发送一个 FIN 段,包含自己当前的序列号 K,还包含一个 ACK 表示确认对方最近一次发过来的数据
  2. 服务端收到后,发送 ACK 包(ACK = K+ 1),表明收到了上一个包。此时上层的应用被告知另一端发起了关闭操作
  3. 服务端发起自己的 FIN 段
  4. 客户端确认

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,自己是否现在关闭发送数据通道,需要上层应用来决定,因此,自己的ACK和FIN一般都会分开发送。

HTTP 状态码

1XX 信息

100 Continue 收到了请求初始部分,客户端应该继续请求
101 Switching Protocols(切换协议)

2XX 成功

200 OK
201 Created(已创建) 资源已创建完毕
202 Accepted(已接受)请求已接受,但服务器尚未处理
204 No Content(没有内容)

3XX 重定向

301 Moved Permanently(永久移除) 请求的URL已移走
302 Found(已找到)所请求的页面已经临时转移至新的url
304 Not Modified(未修改)客户端的缓存资源是最新的, 要客户端使用缓存 If-Modified-Since

4XX 客户端错误

400 Bad request 参数错误
401 unauthorized 没有权限
403 Forbidden 请求被服务器拒绝了
404 Not found 没有找到该资源
405 Method Not Allowed
409 Conflict(冲突)

5XX 服务器错误

500 Internal server error 服务器挂了
502 Bad Gateway(网关故障)
503 Service Unavailable(未提供此服务)
504 Gateway Timeout(网关超时)

HTTP 请求头和响应头

HTTP Header 详解:https://kb.cnblogs.com/page/92320/

request header

accept 设接受的内容类型(application/json)
accpet-encoding 设置接受的编码格式(gzip, deflate, br)
accept-language 设置接受的语言类型(zh-CN)
cookie 可以向服务器带信息
content-type 设置请求体类型
referer 发起请求的页面地址(一般用于防盗链)
user-agent 打点用,设备信息
if-modified-since 设置过期时间
connection 请求完成后是关闭还是保持链接
cache-control
If-None-Match
host 想访问的主机名

response header

access-control-allow-origin 指定哪些站点可以参与跨站资源共享
status 状态码
content-type
content-length
content-encoding 标明应答报文属于哪种压缩格式
date 服务器发送资源时,服务器的日期和时间
expries 设置响应体过期时间
last-modified 请求资源的最后修改时间,下次请求时,如果服务器上当前资源的修改时间大于这个时间,就返回新的资源内容
server 服务器名称
set-cookie 设置 http cookie

强缓存和协商缓存

强缓存通过 expires 和 cache-control 来控制,用来表示资源的缓存时间

from disk cache
from memory cache

强缓存不会向服务器发送请求,直接从缓存中读取资源,network 是 200

客户端向缓存数据库请求数据,缓存数据库有数据且未失效,则返回数据,如果缓存数据失效,客户端再向服务器发起请求,服务器返回数据和缓存规则,客户端将缓存数据和规则存入缓存数据库

协商缓存,是由服务器来确定资源是否可用,涉及 header 字段:[etag,if-none-match]、[if-modified-since,last-modified]

常用的 HTTP 请求方法

get post delete path option

HTTP 发展历程

从 http/0.9 到 http/2.0 经历了 多个TCP连接-->keep-alive-->管道化-->多路复用
最早没有 keep-alive 一次请求完成会关闭本次的 tcp 连接,下个请求要重新建立,造成性能损耗

keep-alive:解决的核心问题是,一定时间内,多次请求复用同一 tcp 连接,但还是 串行的文件创输(下一次请求需要等上一次结果返回再进行),同域并行请求限制带来阻塞(6-8个)

管道化:建立在持久连接之上,把所有请求一并发给服务器,但是服务器还是需要按照顺序一个一个响应,仍有阻塞问题,若上一个响应迟迟不返回,后面的响应都会被阻塞

多路复用:在多路复用之前所有的创输都是基于文本的,在多路复用中是基于二进制分帧。
image

HTTP/1.1 的优缺点

优点:

  1. 增加了持久性连接,也就是多个请求和响应可以利用同一个 TCP 连接,而不是每一次请求响应都要新建一个 TCP 连接,减少建立连接和关闭连接的消耗和延迟。
    connection: keep-alive
  2. 增加管道机制,请求可以同时发出,但响应必须按照请求发出的顺序依次返回,性能在一定程度上得到了改善。
  3. 分块传输,不用等数据完全处理完成再返回,服务器产生部分数据,就发送部分数据
  4. 增加 host 字段,使一个服务器可以用来创建多个站点。
  5. 错误提示更友好:新引入 warning 头域,增加错误或警告信息描述,还增加了 24 个状态码(100,101,301
  6. 带宽优化,http/1.1在请求消息中引入了 range 头域,它允许请求资源的某个部分。
    206(Partial Content)

缺点:
队头堵塞,虽然持久性连接,但每个请求的响应扔需要排队;
技术不成熟,管道机制默认关闭;
浪费资源,携带大量冗余头信息;

HTTP/2.0 新特性

一个完整的请求或响应称为一个数据流 stream,流中被传输的数据就是二进制帧,每个帧会标识出该帧属于哪个流。流中的二进制分帧都是被并行传输的,无需按顺序等待

二进制分帧:在应用层和传输层之间增加一个二进制分帧层,改善传输性能,实现低延迟和高吞吐

多路复用:连接共享,允许通过单一的 HTTP/2 连接发起多重的请求-响应消息,基于二进制分帧的特性

首部压缩

服务器推送:服务器可以对客户端的一个请求发送多个响应

HTTPS 工作原理

HTTPS = HTTP + SSL/TLS(信息加密,完整性校验,身份校验)
由 HTTP 直接和 TCP 通信,演变成先和 SSL 通信,再由 SSL 和 TCP 通信

image

如何解决跨域

同源:域名、协议、端口均为相同
cors jsonp

资料

HTTP 的15个常见知识点复习
HTTP2 中的多路复用

互联网协议一
互联网协议二

强缓存和协商缓存
三次握手,四次挥手

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant