HTTP 是什么?
HTTP 是一种网络协议,而且是无状态的超文本协议,基于 Tcp/Ip 协议的应用层协议。
HTTP get 和 post 的区别
-
get 是从服务器上获取数据,post 是向服务器传送数据。
-
get 传送的数据量较小,不能大于 2KB。post 传送的数据量较大,一般被默认为不受限制。
-
get 安全性非常低,post 安全性较高。但是执行效率却比 Post 方法好。
-
安全性:get 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中,值和表单内各个字段一一对应,在 URL 中可以看到。post 是通过 HTTP post 机制,将表单内各个字段与其内容放置在 HTML HEADER 内一起传送到 ACTION 属性所指的 URL 地址。用户看不到这个过程。
-
效率:get 产生一个 TCP 数据包;post 产生两个 TCP 数据包。对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
-
报文
请求报文
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。 规范把 HTTP 请求分为三个部分:
-
状态行
-
请求头
-
消息主体
响应报文
HTTP 响应与 HTTP 请求相似,HTTP 响应也由 3 个部分构成,分别是:
-
状态行
-
响应头 (Response Header)
-
响应正文
HTTP 响应状态码

1XX: 通知
1XX 系列响应代码仅在与 HTTP 服务器沟通时使用。
2XX: 成功
2XX 系列响应代码表明操作成功了。
3XX: 重定向
3XX 系列响应代码表明:客户端需要做些额外工作才能得到所需要的资源。它们通常用于 GET 请求。他们通常告诉客户端需要向另一个 URI 发送 GET 请求,才能得到所需的表示。那个 URI 就包含在 Location 响应报头里。
4XX: 客户端错误
这些响应代码表明客户端出现错误。不是认证信息有问题,就是表示格式或 HTTP 库本身有问题。客户端需要自行改正。
5XX: 服务端错误
这些响应代码表明服务器端出现错误。一般来说,这些代码意味着服务器处于不能执行客户端请求的状态,此时客户端应稍后重试。有时,服务器能够估计客户端应在多久之后重试。并把该信息放在 Retry-After 响应报头里。
URI 和 URL 的区别
-
统一资源定位符 (uniform resource locator URL)
-
统一资源标识符 (uniform resource identifier URI)
可以这样理解 URI 表示的是一个抽象的地址,URL 表示的是一个详细的地址。 抽象的地址:湖南省长沙市(这是一个抽象的地址,相当于 URI) 详细的地址:湖南省长沙市雨花区香樟路 22 号(这是一个详细的地址,相当于 URL) 为什么 URL 是 URI 的子集,雨花区的香樟路 22 号(URL)属于湖南省长沙市(URI), 那么放到 web 上 www.csdn.net 是一个 URI(它只说明了服务器的地址,没有具体到文件是什么类型) 那么 www.csdn.net/image/logo.… 这样一来 URL 和 URI 的区别就很清晰了
Keep-Alive 持久连接
HTTP 协议采用 “请求 - 应答” 模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求 / 应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP 协议为无连接的协议);
当使用 Keep-Alive 模式(又称持久连接、连接重用)时,Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。
-
HTTP Keep-Alive 简单说就是保持当前的 TCP 连接,避免了重新建立连接。
-
HTTP 长连接不可能一直保持,例如 Keep-Alive: timeout=5, max=100,表示这个 TCP 通道可以保持 5 秒,max=100,表示这个长连接最多接收 100 次请求就断开。
从输入 URL 到页面加载完成的过程
-
首先做 DNS 解析,通过域名获得 IP 地址。
-
接下来是 TCP 握手,应用层会下发数据给传输层,这里 TCP 协议会指明两端的端口号,然后下发给网络层。网络层中的 IP 协议会确定 IP 地址,并且指示了数据传输中如何跳转路由器。然后包会再被封装到数据链路层的数据帧结构中,最后就是物理层面的传输了。
-
TCP 握手结束后会进行 TLS 握手,然后就开始正式的传输数据。
-
数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上,这时假设服务端会响应一个 HTML 文件。
-
首先浏览器会判断状态码是什么,如果是 200 那就继续解析,如果 400 或 500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错。
-
浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件。
-
文件解码成功后会正式开始渲染流程,先会根据 HTML 构建 DOM 树,有 CSS 的话会去构建 CSSOM 树。如果遇到 script 标签的话,会判断是否存在 async 或者 defer ,前者会并行进行下载并执行 JS,后者会先下载文件,然后等待 HTML 解析完成后顺序执行,如果以上都没有,就会阻塞住渲染流程直到 JS 执行完毕。遇到文件下载的会去下载文件,这里如果使用 HTTP 2.0 协议的话会极大的提高多图的下载效率。
-
初始的 HTML 被完全加载和解析后会触发 DOMContentLoaded 事件。
-
CSSOM 树和 DOM 树构建完成后会开始生成 Render 树,这一步就是确定页面元素的布局、样式等等诸多方面的东西。
-
在生成 Render 树的过程中,浏览器就开始调用 GPU 绘制,合成图层,将内容显示在屏幕上了。
-
四次挥手断开连接。
简单的讲一次完整的 http 连接就是从 url 输入到页面加载的全过程
1. DNS域名解析: 浏览器将URL解析出相对应的IP地址和端口号。
1. 从本地浏览器的DNS缓存中查找
2. 在系统DNS缓存中查找
3. 从路由器DNS缓存中查找
4. 网络运营商DNS缓存中查找
5. 递归搜索
2. TCP三次握手建立连接。
3. TLS握手,加密传输。
4. 发送HTTP请求,服务器响应请求返回数据文件。
5. 浏览器解析文件,渲染生成页面。
6. 四次挥手断开连接。
Cookie 和 Session
Cookie
Cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个 Cookie。客户端会把 Cookie 保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认用户状态。
如果没有设置 Cookie 失效日期,它们仅保存到关闭浏览器程序为止.
Cookie 存储的数据量很受限制,大多数浏览器支持最大容量为 4K
Cookie 类型
-
普通 cookie: 服务端和 js 都可以创建,都可以访问。
-
HttpOnly cookie: 只能由服务端创建,JS 无法读取。
-
安全的 cookie(https): 服务端和 JS 都可以创建,JS 仅在 HTTPS 下访问。
Session
Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。
区别
- session 在服务器端,cookie 在客户端(浏览器)
- session 默认被存在在服务器的一个文件里(不是内存)
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
- session 可以放在 文件、数据库、或内存中都可以。
- 用户验证这种场合一般会用 session
TLS 协议
TLS 安全传输层
很多应用层协议都存在安全问题。如 http 协议,在传输过程中使用明文信息,传输报文一旦被截获便会泄漏内容;传输过程中报文如果被篡改,无法轻易发现; 为了解决这个问题,就在应用层和传输层之间加入了 SSL/TLS 协议。
什么是 TLS
TLS(Transport Layer Security, 安全传输层)。TLS 是建立在传输层 TCP 协议之上的协议,服务于应用层。前身是 SSL(Secure Socket Layer, 安全套接字层), 它实现了将应用层报文加密后再交由 TCP 进行传输的可能。
TLS 的作用
-
保密。保密通过加密 encryption 实现,所有信息都加密传输,第三方无法嗅探。
-
完整性。通过 MAC 校验机制,一旦被篡改,通信双方会立刻发现。
-
认证。双方认证,双方都可以配备证书,防止身份被冒充。
TLS 实现
TLS 协议分为两部分
-
通信协议: 通过使用客户端和服务端协商后的密钥进行数据加密传输。
-
握手协议: 客户端和服务端进行协商,确定一组用于数据传输加密的密钥串。