超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协做式和超媒体信息系统的应用层协议。HTTP 是 WWW 万维网通讯的基础,被普遍使用,最多见的当你浏览一个网页时,浏览器和服务器之间就会经过 HTTP 进行数据的发送和接收。因此 HTTP 是一种基于请求/响应的协议。css
根据 HTTP 的协议版本,发展历程大体分为:HTTP/0.9
、HTTP/1.0
、HTTP/1.1
、 HTTP/2.0
和 HTTP/3.0
。其中 HTTP/1.1
版本是使用最普遍的协议。html
HTTP/0.9linux
最先版本是 1991 年发布的 0.9 版。该版本极其简单,只有一个命令GET
。没有 Header
等描述信息,服务器发送完毕,即关闭 TCP
链接。nginx
HTTP/1.0web
1996 年 5 月,HTTP/1.0 版本发布,内容大大增长。增长了不少指令,好比增长了 POST
指令,其余的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。json
HTTP/1.1浏览器
因为 HTTP1.0
协议中每一个 TCP
只能发送一个请求,请求完毕后链接就关闭。形成 TCP
新建链接成本比较搞。因此 1997 年 1 月,HTTP/1.1
版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP
协议,一直用到了20年后的今天,直到如今仍是最流行的版本。缓存
主要增长了持久化链接、管道机制。引入了持久链接(persistent connection),即 TCP
链接默认不关闭,能够被多个请求复用,不用声明Connection: keep-alive
。管道机制(pipelining),即在同一个 TCP
链接里面,客户端能够同时发送多个请求。这样就进一步改进了 HTTP
协议的效率。安全
HTTP/2.0服务器
该版本的特色是:
HTTP/1.1
版本中,支持文本和二进制的数据体,在 HTTP/2.0
中则是一个完全的二进制协议,头信息和数据体都是二进制,而且统称为"帧"(frame):头信息帧和数据帧。二进制协议的一个好处是,能够定义额外的帧。HTTP/3.0
在 HTTP/3.0
中为提升 Web 应用性能,HTTP/3.0 将 TCP 协议更换为基于 UDP 的谷歌 QUIC`。更多的内容能够参照这其它文章了解。
Uniform Resource Locator
全称统一资源定位符,简称 URL
。用于惟一标识网络上的资源,它是 WWW 的统一资源定位标志,就是指网络地址。
URL 基本格式
通用的格式:scheme://host[:port#]/path/…/[?query-string] [#anchor]
名称 | 功能 |
---|---|
scheme | 传送协议,常见的有:http、https、ftp |
// | 层级 URL 标记符号,固定不变 |
host | 服务器,一般为域名或 ip |
port | 端口号 |
path | 资源路径 |
query-string | 发给服务器的查询参数 |
anchor | 片断、锚点,以“#”字符为起点 |
举个例子,URL = www.andoter.com:80/news/index.…
一个 HTTP
请求报文的通常格式由请求行、请求头部和请求数据组成。
请求行由三部分组成:请求方法、URL、协议版本。
GET /img/bd_logo1.png?qua=high&where=super HTTP/1.1
Referer: https://www.baidu.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Sec-Fetch-Dest: image
复制代码
在上面的示例中:
在 HTTP/1.1
版本中定义了常见的一组请求方法。
方法名 | 功能 |
---|---|
GET |
GET 方法请求一个指定资源的表示形式. 使用 GET 的请求应该只被用于获取数据。 |
HEAD |
HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。 |
POST |
POST 方法用于将实体提交到指定的资源,一般致使在服务器上的状态变化或反作用。 |
PUT |
PUT 方法用请求替换目标资源的全部当前表示。 |
DELETE |
DELETE 方法删除指定的资源。 |
CONNECT |
CONNECT 方法创建一个到由目标资源标识的服务器的隧道。 |
OPTIONS |
OPTIONS 方法用于描述目标资源的通讯选项。 |
TRACE |
TRACE 方法沿着到目标资源的路径执行一个消息环回测试。 |
PATCH |
PATCH 方法用于对资源应用部分修改。 |
虽然 HTTP
的请求方式有多种,可是咱们在实际应用中经常使用的也就是 GET
和 POST
,其余请求方式也均可以经过这两种方式间接的来实现。
请求头部一般用于添加一些附加信息,格式为KV 键值对—键: 值
,注意冒号后面有一个空格。
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
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie:
Host: www.baidu.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
复制代码
常见的请求头。
名称 | 功能 |
---|---|
Accept |
浏览器可接受的 MIME 类型,能够多个值,用, (英文逗号)分开 |
Accept-Encoding |
浏览器可以进行解码的数据编码方式,好比 gzip |
Accept-Charset |
浏览器可接受的字符集 |
Accept-Language |
浏览器所但愿的语言种类,当服务器可以提供一种以上的语言版本时要用到 |
Authorization |
受权信息,用于设置身份认证信息 |
Connection |
表示是否须要持久链接。若是 Servlet 看到这里的值为 Keep-Alive ,或者看到请求使用的是 HTTP 1.1 (默认进行持久链接),它就能够利用持久链接的优势。 |
Content-Type |
MediaType ,便是 Internet Media Type ,互联网媒体类型;也叫作 MIME 类型,在 http 协议消息头中,使用 Content-Type 来表示具体请求中的媒体类型信息。常见的类型。 |
Content-Length |
表示请求消息正文的长度 |
Cookie |
Cookie 信息 |
Host |
请求的主机和端口号 |
If-Modified-Since |
只有当所请求的内容在指定的日期以后又通过修改才返回它,不然返回 304 “Not Modified” 应答。 |
Referer |
标识请求引用自哪一个地址,好比你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
User-Agent |
浏览器类型 |
Cache-Control |
指定请求和响应遵循的缓存机制,请求时的缓存指令包括 no-cache 、no-store 、max-age 、max-stale 、min-fresh 、only-if-cached |
请求体主要是针对 POST
请求而言,根据不一样的应用场景,常见的 POST
请求提交的数据类型有如下 3 种。
application/json
最多见的类型,愈来愈多的应用使用 application/json
,用来告诉服务端消息主体是序列化的 json
字符串。
multipart/form-data
将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既能够上传键值对,也能够上传文件。必须让 form
表单的 enctype
等于 multipart/form-data
。
application/x-www-form-urlencoded
浏览器的原生 form
表单,若是不设置 enctype
属性,那么最终就会以 application/x-www-form-urlencoded
方式提交数。
一个 HTTP
影响消息由响应状态行、影响头、空行和响应正文组成。
状态行由:协议版本、状态码、状态码描述组成。
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 02 Mar 2020 15:23:27 GMT
Content-Type: application/json
复制代码
上面的例子中:
常见的状态码有:
状态码 | 功能描述 |
---|---|
1XX (提示信息) | 表示请求已接收,继续处理 |
2XX (成功) | 表示请求已被成功接收、理解、接收 |
3XX (重定向) | 表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向 |
4XX (客户端错误) | 表示请求有语法错误或者请求没法实现 |
5XX (服务器错误) | 表示服务器未能实现合法的请求 |
响应头部一样是键值对的形式。
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type,X-Agent,X-Token,X-Legacy-Token,X-Legacy-Uid,X-Legacy-Device-Id,X-Legacy-New-Token,X-Request-Id
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, PATCH
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Connection: close
Content-Encoding: gzip
Content-Type: application/json
Date: Mon, 02 Mar 2020 15:23:27 GMT
Server: nginx/1.10.2
Set-Cookie: QINGCLOUDELB=6c217b5deeccb67c0d51e4d6f319ad279a8d3a749e334706eff5b9d6e96d83ee|Xl0k8|Xl0k8; path=/; HttpOnly
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Request-Id: c3d8f9f05c9911eab9dd8f862fae4482
复制代码
响应头部和请求头部通用的 Header
有:Accept
、Content-length
、Content-Type
、Content-Encoding
等。响应头部特殊的 Header
有:
名称 | 功能描述 |
---|---|
Connection |
针对该连接的全部预期的选项 |
Date |
此条消息被发送时的日期和时间 |
Expires |
指定一个日期/时间,超过该时间此回应过时 |
Last-Modified |
请求对象的最后修改时间 |
Server |
服务器名称 |
Vary |
告知下游的代理服务器如何对以后的请求协议头进行匹配,以决定是否可以使用已缓存的响应内容而不是从新从原服务器请求新的内容 |
响应体就是响应的消息体,若是是纯数据就是返回纯数据,若是请求的是HTML页面,那么返回的就是 HTML
代码,若是是 JS
就是 JS
代码,如此之类。
在进行网络请求流程分析是,咱们能够先了解下 OSI
模型。OSI
的全程是Open Systems Interconncection,即开放系统互联,它由ISO(International Organization for Standardization)制定。OSI是网络通讯的一种通用框架,它分为七层,而且定义了在每一层上数据的处理方法。
OSI 七层网络模型:
这里借用博客深刻浅出-网络七层模型中的一张图来更详细了解下。
当咱们在浏览器中输入 https://www.baidu.com
点击 Enter
后浏览器给咱们展示百度的首页,那这中间发生了哪些过程,最终给咱们展示出一个渲染好的网页。大体的过程能够归纳为以下:
www.baidu.com
这个网址进行 DNS
域名解析,获得对应的 IP
地址IP
,找到对应的服务器,发起 TCP
的三次握手TCP
链接后发起 HTTP
请求HTTP
请求,浏览器获得 html
代码html
代码,并请求 html
代码中的资源(如 js、css
图片等)在这个过程当中,有两个常见的概念:DNS 解析
和 TCP 的三次握手
。
DNS(Domain Name System)
,翻译过来就是域名和 IP
地址相互映射的系统。这里又能够细分为:权威 DNS、递归 DNS(又称为 Local DNS) 和 公共 DNS。
DNS 解析过程
Local DNS
发起 www.baidu.com
的访问请求Local DNS
收到请求后,从 Root Hints
获取根域名服务器地址,并向 Root DNS Server
发起解析请求,Root DNS Server
返回 com
顶级域名服务器 IP
地址Local DNS
向 COM DNS Server
发起域名解析请求,COM DNS Server
返回 .com
二级域名服务器 IP
地址Local DNS
向 百度 DNS Server
发起域名解析请求,CSDN DNS Server
返回最终的 www.baidu.com
的 IP
地址Local DNS
将递归查询获取的 IP
地址返回给终端基于前面的知识,在传输层和网络层中,常见的是采用 TCP/IP
的协议进行通讯,TCP
协议提供可靠的链接服务,采用三次握手创建一个可靠链接。
这里须要了解 TCP
报文格式中的 6 中标志位:
三次握手
所谓三次握手(Three-Way Handshake)就是指创建一个 TCP
链接时,须要客户端和服务端总共发送 3 个包以确认链接的创建。
第一次握手:Client
将标志位 SYN
置为 1,随机产生一个值 seq=J
,并将该数据包发送给 Server
,Client
进入 SYN_SENT
状态,等待 Server
确认。
第二次握手:Server
收到数据包后由标志位 SYN=1
知道 Client
请求创建链接,Server
将标志位 SYN
和 ACK
都置为 1,ack=J+1
,随机产生一个值 seq=K
,并将该数据包发送给 Client
以确认链接请求,Server
进入 SYN_RCVD
状态。
第三次握手:Client
收到确认后,检查 ack
是否为 J+1
,ACK
是否为 1,若是正确则将标志位 ACK
置为 1,ack=K+1
,并将该数据包发送给 Server
,Server
检查 ack
是否为 K+1
,ACK
是否为 1,若是正确则链接创建成功,Client
和 Server
进入 ESTABLISHED
状态,完成三次握手,随后 Client
与 Server
之间能够开始传输数据了。
四次挥手
所谓四次挥手(Four-Way Wavehand)就是指断开一个 TCP
链接时,须要客户端和服务端总共发送 4 个包以确认链接的断开。
第一次挥手:Client
发送一个 FIN
,用来关闭 Client
到 Server
的数据传送,Client
进入 FIN_WAIT_1
状态。 第二次挥手:Server
收到 FIN
后,发送一个 ACK
给 Client
,确认序号为收到序号+1(与 SYN
相同,一个 FIN
占用一个序号),Server
进入 CLOSE_WAIT
状态。 第三次挥手:Server
发送一个 FIN
,用来关闭 Server
到 Client
的数据传送,Server
进入 LAST_ACK
状态。 第四次挥手:Client
收到 FIN
后,Client
进入 TIME_WAIT
状态,接着发送一个 ACK
给 Server
,确认序号为收到序号+1,Server
进入 CLOSED
状态,完成四次挥手。
IPv4
是英语Internet Protocol version 4
的缩写,又称互联网通讯协议第四版。支持的 IP
地址数量:2^32(约 4×10^9)。IPv6
是英文 Internet Protocol Version 6
即互联网协议第6版的缩写,对 IPv4
进行数量上的扩充,支持地址数量:2^128(约3.4×10^38)。
更多文章:
TCP
是面向链接的可靠字节流传输,在数据传输前经过三次握手创建链接,而且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。缺点是效率低,占用资源。
UDP
面向非链接不可靠的字节流传输,可是速度快、比 TCP
稍微安全。占用资源相对较少。适用于对网络通信质量要求不高的时候,要求网络通信速度能尽可能的快,好比长视频流。
参照连接