HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)
,HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范php
HTTP 主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol)。html
超连接
的跳转。请求方
,把接到二进制数据包的一方称为应答方
。说到 HTTP,不得不提的就是 TCP/IP 网络模型,通常是五层模型。以下图所示web
可是也能够分为四层,就是把链路层和物理层都表示为网络接口层面试
还有一种就是 OSI 七层网络模型,它就是在五层协议之上加了表示层和会话层算法
而 HTTPS 的全称是 Hypertext Transfer Protocol Secure
,从名称咱们能够看出 HTTPS 要比 HTTPS 多了 secure 安全性这个概念,实际上, HTTPS 并非一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 TLS/SSL 所作的工做。chrome
也就是说,HTTPS 就是身披了一层 SSL 的 HTTP。数据库
那么,HTTP 和 HTTPS 的主要区别是什么呢?跨域
http://
开头,而 HTTPS 在地址栏上的协议是以 https://
开头http://www.cxuanblog.com/
https://www.cxuanblog.com/
复制代码
HTTP 中包括许多方法,Get 和 Post 是 HTTP 中最经常使用的两个方法,基本上使用 HTTP 方法中有 99% 都是在使用 Get 方法和 Post 方法,因此有必要咱们对这两个方法有更加深入的认识。浏览器
www.cxuanblog.com
其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源,而 post 方法通常用于 <form> 表单
的提交,至关因而把信息提交给服务器,等待服务器做出响应,get 至关于一个是 pull/拉的操做,而 post 至关因而一个 push/推的操做。/test/demo_form.asp?name1=value1&name2=value2
复制代码
而 post 方法是把参数放在请求体 body 中的,这对用户来讲不可见。缓存
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
复制代码
get 请求的 URL 有长度限制,而 post 请求会把参数和值放在消息体中,对数据长度没有要求。
get 请求会被浏览器主动 cache,而 post 不会,除非手动设置。
get 请求在浏览器反复的 回退/前进
操做是无害的,而 post 操做会再次提交表单请求。
get 请求在发送过程当中会产生一个 TCP 数据包;post 在发送过程当中会产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 post,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
无状态协议(Stateless Protocol)
就是指浏览器对于事务的处理没有记忆能力。举个例子来讲就是好比客户请求得到网页以后关闭浏览器,而后再次启动浏览器,登陆该网站,可是服务器并不知道客户关闭了一次浏览器。
HTTP 就是一种无状态的协议,他对用户的操做没有记忆能力。可能大多数用户不相信,他可能以为每次输入用户名和密码登录一个网站后,下次登录就再也不从新输入用户名和密码了。这其实不是 HTTP 作的事情,起做用的是一个叫作 小甜饼(Cookie)
的机制。它可以让浏览器具备记忆
能力。
若是你的浏览器容许 cookie 的话,查看方式 chrome://settings/content/cookies
也就说明你的记忆芯片通电了...... 当你想服务端发送请求时,服务端会给你发送一个认证信息,服务器第一次接收到请求时,开辟了一块 Session 空间(建立了Session对象),同时生成一个 sessionId ,并经过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应; 客户端收到响应后,在本机客户端设置了一个 **JSESSIONID=XXXXXXX **的 Cookie 信息,该 Cookie 的过时时间为浏览器会话结束;
接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 而后,服务器经过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,获得这次请求的 sessionId。这样,你的浏览器才具备了记忆能力。
还有一种方式是使用 JWT 机制,它也是可以让你的浏览器具备记忆能力的一种机制。与 Cookie 不一样,JWT 是保存在客户端的信息,它普遍的应用于单点登陆的状况。JWT 具备两个特色
客户端
,而不是服务端内存中。也就是说,JWT 直接本地进行验证就能够,验证完毕后,这个 Token 就会在 Session 中随请求一块儿发送到服务器,经过这种方式,能够节省服务器资源,而且 token 能够进行屡次验证。单个节点的域
或者它的子域
中有效。若是它们尝试经过第三个节点访问,就会被禁止。使用 JWT 能够解决这个问题,使用 JWT 可以经过多个节点
进行用户认证,也就是咱们常说的跨域认证
。TCP 和 UDP 都位于计算机网络模型中的运输层,它们负责传输应用层产生的数据。下面咱们就来聊一聊 TCP 和 UDP 分别的特征和他们的区别
UDP 的全称是 User Datagram Protocol
,用户数据报协议。它不须要所谓的握手
操做,从而加快了通讯速度,容许网络上的其余主机在接收方赞成通讯以前进行数据传输。
数据报是与分组交换网络关联的传输单元。
UDP 的特色主要有
TCP 的全称是Transmission Control Protocol
,传输控制协议。它可以帮助你肯定计算机链接到 Internet 以及它们之间的数据传输。经过三次握手来创建 TCP 链接,三次握手就是用来启动和确认 TCP 链接的过程。一旦链接创建后,就能够发送数据了,当数据传输完成后,会经过关闭虚拟电路来断开链接。
TCP 的主要特色有
下面为你罗列了一些 TCP 和 UDP 的不一样点,方便理解,方便记忆。
TCP | UDP |
---|---|
TCP 是面向链接的协议 | UDP 是无链接的协议 |
TCP 在发送数据前先须要创建链接,而后再发送数据 | UDP 无需创建链接就能够直接发送大量数据 |
TCP 会按照特定顺序从新排列数据包 | UDP 数据包没有固定顺序,全部数据包都相互独立 |
TCP 传输的速度比较慢 | UDP 的传输会更快 |
TCP 的头部字节有 20 字节 | UDP 的头部字节只须要 8 个字节 |
TCP 是重量级的,在发送任何用户数据以前,TCP须要三次握手创建链接。 | UDP 是轻量级的。没有跟踪链接,消息排序等。 |
TCP 会进行错误校验,并可以进行错误恢复 | UDP 也会错误检查,但会丢弃错误的数据包。 |
TCP 有发送确认 | UDP 没有发送确认 |
TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK | 无握手协议 |
TCP 是可靠的,由于它能够确保将数据传送到路由器。 | 在 UDP 中不能保证将数据传送到目标。 |
TCP 三次握手和四次挥手也是面试题的热门考点,它们分别对应 TCP 的链接和释放过程。下面就来简单认识一下这两个过程
在了解具体的流程前,咱们须要先认识几个概念
消息类型 | 描述 |
---|---|
SYN | 这个消息是用来初始化和创建链接的。 |
ACK | 帮助对方确认收到的 SYN 消息 |
SYN-ACK | 本地的 SYN 消息和较早的 ACK 数据包 |
FIN | 用来断开链接 |
SYN:它的全称是 Synchronize Sequence Numbers
,同步序列编号。是 TCP/IP 创建链接时使用的握手信号。在客户机和服务器之间创建 TCP 链接时,首先会发送的一个信号。客户端在接受到 SYN 消息时,就会在本身的段内生成一个随机值 X。
SYN-ACK:服务器收到 SYN 后,打开客户端链接,发送一个 SYN-ACK 做为答复。确认号设置为比接收到的序列号多一个,即 X + 1,服务器为数据包选择的序列号是另外一个随机数 Y。
ACK:Acknowledge character
, 确认字符,表示发来的数据已确认接收无误。最后,客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y + 1。
若是用现实生活来举例的话就是
小明 - 客户端 小红 - 服务端
在链接终止阶段使用四次挥手,链接的每一端都会独立的终止。下面咱们来描述一下这个过程。
FIN_WAIT_1
状态。当客户端处于 FIN_WAIT_1 状态时,它会等待来自服务器的 ACK 响应。FIN_WAIT_2
状态,而后等待来自服务器的 FIN
消息TIME_WAIT
状态。处于 TIME_WAIT 状态的客户端容许从新发送 ACK 到服务器为了防止信息丢失。客户端在 TIME_WAIT 状态下花费的时间取决于它的实现,在等待一段时间后,链接关闭,客户端上全部的资源(包括端口号和缓冲区数据)都被释放。仍是能够用上面那个通话的例子来进行描述
HTTP 1.0 是在 1996 年引入的,从那时开始,它的普及率就达到了惊人的效果。
HTTP 1.1 是 HTTP 1.0 开发三年后出现的,也就是 1999 年,它作出了如下方面的变化
keep-alive
来设置Range
来实现。HTTP 2.0 是 2015 年开发出来的标准,它主要作的改变以下
头部压缩
,因为 HTTP 1.1 常常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却常常只有几十字节,因此致使头部偏重。HTTP 2.0 使用 HPACK
算法进行压缩。二进制格式
,HTTP 2.0 使用了更加靠近 TCP/IP 的二进制格式,而抛弃了 ASCII 码,提高了解析效率强化安全
,因为安全已经成为重中之重,因此 HTTP2.0 通常都跑在 HTTPS 上。多路复用
,即每个请求都是是用做链接共享。一个请求对应一个id,这样一个链接上能够有多个请求。这个问题比较开放,由于 HTTP 请求头有不少,这里只简单举出几个例子,具体的能够参考个人另外一篇文章
HTTP 标头会分为四种,分别是 通用标头
、实体标头
、请求标头
、响应标头
。分别介绍一下
通用标头主要有三个,分别是 Date
、Cache-Control
和 Connection
Date
Date 是一个通用标头,它能够出如今请求标头和响应标头中,它的基本表示以下
Date: Wed, 21 Oct 2015 07:28:00 GMT
复制代码
表示的是格林威治标准时间,这个时间要比北京时间慢八个小时
Cache-Control
Cache-Control 是一个通用标头,他能够出如今请求标头
和响应标头
中,Cache-Control 的种类比较多,虽说这是一个通用标头,可是又一些特性是请求标头具备的,有一些是响应标头才有的。主要大类有 可缓存性
、阈值性
、 从新验证并从新加载
和其余特性
Connection
Connection 决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络链接。Connection 有两种,一种是持久性链接
,即一次事务完成后不关闭网络链接
Connection: keep-alive
复制代码
另外一种是非持久性链接
,即一次事务完成后关闭网络链接
Connection: close
复制代码
HTTP1.1 其余通用标头以下
实体标头是描述消息正文内容的 HTTP 标头。实体标头用于 HTTP 请求和响应中。头部Content-Length
、 Content-Language
、 Content-Encoding
是实体头。
Content-Length 实体报头指示实体主体的大小,以字节为单位,发送到接收方。
Content-Language 实体报头描述了客户端或者服务端可以接受的语言。
Content-Encoding 这又是一个比较麻烦的属性,这个实体报头用来压缩媒体类型。Content-Encoding 指示对实体应用了何种编码。
常见的内容编码有这几种: gzip、compress、deflate、identity ,这个属性能够应用在请求报文和响应报文中
Accept-Encoding: gzip, deflate //请求头
Content-Encoding: gzip //响应头
复制代码
下面是一些实体标头字段
Host
Host 请求头指明了服务器的域名(对于虚拟主机来讲),以及(可选的)服务器监听的 TCP 端口号。若是没有给定端口号,会自动使用被请求服务的默认端口(好比请求一个 HTTP 的 URL 会自动使用 80 做为端口)。
Host: developer.mozilla.org
复制代码
上面的 Accpet
、 Accept-Language
、Accept-Encoding
都是属于内容协商的请求标头。
Referer
HTTP Referer 属性是请求标头的一部分,当浏览器向 web 服务器发送请求的时候,通常会带上 Referer,告诉服务器该网页是从哪一个页面连接过来的,服务器所以能够得到一些信息用于处理。
Referer: https://developer.mozilla.org/testpage.html
复制代码
If-Modified-Since
If-Modified-Since 一般会与 If-None-Match 搭配使用,If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可经过确认首部字段 Last-Modified
来肯定。
大白话说就是若是在 Last-Modified
以后更新了服务器资源,那么服务器会响应 200,若是在 Last-Modified
以后没有更新过资源,则返回 304。
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
复制代码
If-None-Match
If-None-Match HTTP 请求标头使请求成为条件请求。 对于 GET 和 HEAD 方法,仅当服务器没有与给定资源匹配的 ETag
时,服务器才会以 200 状态发送回请求的资源。 对于其余方法,仅当最终现有资源的ETag
与列出的任何值都不匹配时,才会处理请求。
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
复制代码
Accept
接受请求 HTTP 标头会通告客户端其可以理解的 MIME 类型
Accept-Charset
accept-charset 属性规定服务器处理表单数据所接受的字符集。
经常使用的字符集有: UTF-8 - Unicode 字符编码 ; ISO-8859-1 - 拉丁字母表的字符编码
Accept-Language
首部字段 Accept-Language 用来告知服务器用户代理可以处理的天然语言集(指中文或英文等),以及天然语言集的相对优先级。可一次指定多种天然语言集。
请求标头咱们大概就介绍这几种,后面会有一篇文章详细深挖全部的响应头的,下面是一个响应头的汇总,基于 HTTP 1.1
Access-Control-Allow-Origin
一个返回的 HTTP 标头可能会具备 Access-Control-Allow-Origin ,Access-Control-Allow-Origin
指定一个来源,它告诉浏览器容许该来源进行资源访问。
Keep-Alive
Keep-Alive 表示的是 Connection 非持续链接的存活时间,能够进行指定。
Server
服务器标头包含有关原始服务器用来处理请求的软件的信息。
应该避免使用过于冗长和详细的 Server 值,由于它们可能会泄露内部实施细节,这可能会使攻击者容易地发现并利用已知的安全漏洞。例以下面这种写法
Server: Apache/2.4.1 (Unix)
复制代码
Set-Cookie
Set-Cookie 用于服务器向客户端发送 sessionID。
Transfer-Encoding
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。
HTTP /1.1 的传输编码方式仅对分块传输编码有效。
X-Frame-Options
HTTP 首部字段是能够自行扩展的。因此在 Web 服务器和浏览器的应用上,会出现各类非标准的首部字段。
首部字段 X-Frame-Options
属于 HTTP 响应首部,用于控制网站内容在其余 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
下面是一个响应头的汇总,基于 HTTP 1.1
这道题也是一道常常会考的面试题。那么下面咱们就来探讨一下从你输入 URL 后到响应,都经历了哪些过程。
你应该访问不到的,对不对~
hosts
文件是否有配置 ip 地址,若是找到,直接返回。若是找不到,就向网络中发起一个 DNS 查询。首先来看一下 DNS 是啥,互联网中识别主机的方式有两种,经过
主机名
和IP 地址
。咱们人喜欢用名字的方式进行记忆,可是通讯链路中的路由却喜欢定长、有层次结构的 IP 地址。因此就须要一种可以把主机名到 IP 地址的转换服务,这种服务就是由 DNS 提供的。DNS 的全称是Domain Name System
域名系统。DNS 是一种由分层的 DNS 服务器实现的分布式数据库。DNS 运行在 UDP 上,使用 53 端口。
DNS 是一种分层数据库,它的主要层次结构以下
通常域名服务器的层次结构主要是以上三种,除此以外,还有另外一类重要的 DNS 服务器,它是 本地 DNS 服务器(local DNS server)
。严格来讲,本地 DNS 服务器并不属于上述层次结构,可是本地 DNS 服务器又是相当重要的。每一个 ISP(Internet Service Provider)
好比居民区的 ISP 或者一个机构的 ISP 都有一台本地 DNS 服务器。当主机和 ISP 进行链接时,该 ISP 会提供一台主机的 IP 地址,该主机会具备一台或多台其本地 DNS 服务器的 IP地址。经过访问网络链接,用户可以容易的肯定 DNS 服务器的 IP地址。当主机发出 DNS 请求后,该请求被发往本地 DNS 服务器,它起着代理的做用,并将该请求转发到 DNS 服务器层次系统中。
首先,查询请求会先找到本地 DNS 服务器来查询是否包含 IP 地址,若是本地 DNS 没法查询到目标 IP 地址,就会向根域名服务器发起一个 DNS 查询。
注意:DNS 涉及两种查询方式:一种是
递归查询(Recursive query)
,一种是迭代查询(Iteration query)
。《计算机网络:自顶向下方法》居然没有给出递归查询和迭代查询的区别,找了一下网上的资料大概明白了下。若是根域名服务器没法告知本地 DNS 服务器下一步须要访问哪一个顶级域名服务器,就会使用递归查询;
若是根域名服务器可以告知 DNS 服务器下一步须要访问的顶级域名服务器,就会使用迭代查询。
在由根域名服务器 -> 顶级域名服务器 -> 权威 DNS 服务器后,由权威服务器告诉本地服务器目标 IP 地址,再有本地 DNS 服务器告诉用户须要访问的 IP 地址。
HTTP-GET
请求,包括其中的 URL,HTTP 1.1 后默认使用长链接,只须要一次握手便可屡次传输数据。咱们上面描述了一下 HTTP 的工做原理,下面来说述一下 HTTPS 的工做原理。由于咱们知道 HTTPS 不是一种新出现的协议,而是
因此,咱们探讨 HTTPS 的握手过程,其实就是 SSL/TLS 的握手过程。
TLS 旨在为 Internet 提供通讯安全的加密协议。TLS 握手是启动和使用 TLS 加密的通讯会话的过程。在 TLS 握手期间,Internet 中的通讯双方会彼此交换信息,验证密码套件,交换会话密钥。
每当用户经过 HTTPS 导航到具体的网站并发送请求时,就会进行 TLS 握手。除此以外,每当其余任何通讯使用HTTPS(包括 API 调用和在 HTTPS 上查询 DNS)时,也会发生 TLS 握手。
TLS 具体的握手过程会根据所使用的密钥交换算法的类型
和双方支持的密码套件
而不一样。 咱们以RSA 非对称加密
来讨论这个过程。整个 TLS 通讯流程图以下
hello
消息来发起握手过程。这个消息中会夹带着客户端支持的 TLS 版本号(TLS1.0 、TLS1.二、TLS1.3)
、客户端支持的密码套件、以及一串 客户端随机数
。Certificate
报文,报文中包含公开密钥证书。最后服务器发送 ServerHelloDone
做为 hello
请求的响应。第一部分握手阶段结束。加密阶段
:在第一个阶段握手完成后,客户端会发送 ClientKeyExchange
做为响应,这个响应中包含了一种称为 The premaster secret
的密钥字符串,这个字符串就是使用上面公开密钥证书进行加密的字符串。随后客户端会发送 ChangeCipherSpec
,告诉服务端使用私钥解密这个 premaster secret
的字符串,而后客户端发送 Finished
告诉服务端本身发送完成了。Session key 其实就是用公钥证书加密的公钥。
实现了安全的非对称加密
:而后,服务器再发送 ChangeCipherSpec
和 Finished
告诉客户端解密完成,至此实现了 RSA 的非对称加密。文章参考:
Recursive and Iterative DNS Queries
HTTP/1.0 AND 1.1, WHAT ARE THE DIFFERENCES?
TCP 3-Way Handshake (SYN, SYN-ACK,ACK)
TCP vs UDP: What's the Difference?