前言
本文主要是为了记录平时阅读<<HTTP权威指南>>的一些知识点的。 把它们抽离出来,记录在本篇文章中,方便平时的理解
URI(Uniform Resource Identifier,统一资源标识符)
URI
的作用是指示http协议去获取对应服务器上的数据。它有两种形式,分别是URL(Uniform Resource Locator 统一资源定位符)
和URN(Uniform Resource Name 统一资源名)
。
我们当前的所用的几乎所有的URI
都是URL
形式,URN
由于缺少架构支撑,目前还只能在实验阶段。所以之后我们说的URI
指的都是URL
。
URL
格式
根据RFC 1738,URL的格式为以下:
“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”
1 | //翻译 |
组成
一般来说,URL由三部分组成:
- 协议(scheme):指明访问资源使用的协议类型
- 服务器(host:port):服务器地址
- 本地资源(url-path):访问的资源在服务器的路径
HTTP协议
HTTP报文
- 起始行:内容主要是
http version,http status,method,url
等 - 首部字段:
request Headers & response Headers
- 主体:真正传输的数据
HTTP连接
TCP协议
HTTP只是一个应用层协议,本身并不关注数据的传输,负责传输数据的就是协议就是用的传输层TCP/IP协议。
TCP(Transmission Control Protocol),意为:传输控制协议。TCP可以给我们带来通用的、可靠的传输协议。
TCP传输的数据有以下几点特点:
- 无差错: 不会不传,漏传,多传。
- 按序传输:传输的报文顺序不会出错。
- 未分段的数据流:可以在任意时间以任意大小传输
TCP协议的可靠性如何保证?
那么,TCP是如何保证自己传输的数据是可靠的呢?
-
校验和:
- 发送端:原码相加,将高位叠加到低位,取反,得到反码求和结果,加入校验和字段
- 接收端:将所有原码相加,高位叠加,如全为1,则正确
- 结果:如果校验和出错,此数据包会被放弃。
-
确认应答和序列号:
- 序列号:所有数据包会依序编号
- 确认应答:接收方接收到数据之后就会确认
-
超时重传:数据包传出之后,会启动一个计时器,一旦数据传输超时,TCP就会重新发送超时的数据包。
注意:超时以500ms为单位,每次判定超时重发的超时时间都是500ms的整数倍且重发时间按照指数增长,计算方式为
2^重发次数*500ms
-
连接管理:三次握手和四次挥手
-
流量控制:TCP连接的两端都有接收数据的一个缓冲区,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。如果数据发送过快,就控制流量的发送速度且把改变的速度发到发送端
-
拥塞控制:当前网络拥堵时,传送的数据过慢会导致超时,然后TCP会进行重发,会造成网络更加拥堵,所以此时会减少发送数据速率。 这里和流量控制不一样的地方在于,流量控制是为了接收端能及时接收到数据,而拥塞控制是为了降低网络堵塞的程度
拥塞控制主要通过以下几个算法
- 慢开始算法
- 拥塞避免
- 快重传
- 快恢复
三次握手
TCP的三次握手其实就是对服务端状态和客户端状态做一个确认,这也是对TCP可靠性的一个支撑。接下来说一下三次握手的过程:
- 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
四次挥手
TCP的四次挥手用于释放TCP连接,具体过程如下:
- 客户端发送数据包给服务端并进入终止等待1
FIN-WAIT-1
状态 - 服务端接收数据包,然后返回一个数据包给客户端并进入半关闭
CLOSE-WAIT
状态,客户端接收到数据包进入终止等待2FIN-WAIT-2
状态 - 服务端发送数据包给客户端并进入最后确认
LAST-ACK
状态 - 客户端发送数据包给服务端,然后进入时间等待
TIME-WAIT
状态,在经过2MSL
(MSL
是指一个网络片段的最大存活时间,2MSL
刚好是一个发送和返回的最大时间)之后,客户端进入关闭CLOSED
状态,服务端接收到数据包之后立马进入关闭CLOSED
状态
滑动窗口技术
TCP中实际的传输数据方式。要了解滑动窗口技术,我们首先得了解窗口机制。窗口实际上就是数据传输的管道。窗口大小跟数据传输量成正相关。
滑动窗口技术实质上就是指通过动态控制数据窗口大小来调节两台主机间的数据传输速率,上面的流量控制和拥塞控制实际上都是通过滑动窗口技术来完成的。
Web页面的结构组件
Web不只有浏览器和服务器,还有一些其它的重要的程序。
主要有以下一些:
- 代理:代理就是在浏览器和服务器之间的一层中间实体,它的作用在于对http请求进行封装/拦截/过滤/监控。
- 缓存:作用就是把请求到的数据保存到内存/本地中,使得用户请求数据的数据如果没有变化时可以不用与服务端进行请求连接,而可以直接从本地/内存里取已有的数据
- 网关:资源处理器/协议转换器,可以用来对请求进行响应或者对协议进行处理。
- 隧道:使得用户可以通过http程序访问非http协议的程序
- agent代理:代表用户对http发起请求的程序,目前我们的web浏览器就是一种agent代理。爬虫程序也是agent代理
HTTPS
首先,我们都知道HTTP请求其实是明文传输的,但是这样的话一些隐私的信息就很容易被别人知道。所以为了保护隐私信息,推出了HTTPS,通俗的讲,HTTPS其实就是在HTTP连接中新增了一层安全层面的处理。
HTTP的连接过程是这样的:发送端 --> HTTP --> TCP --> IP。
而HTTPS其实就是在HTTP --> TCP这里加了一层SSL层来对数据进行加密保护。
服务器证书(Server Certificates)
要想了解HTTPS,我们还得先了解一下服务器证书是什么。
服务器证书是一个显示了组织的名称、地址、服务器 DNS 域名以及其他信息的 X.509 v3 派生证书(参见图 14-17)。你和你所用的客户端软件可以检查证书,以确 保所有的信息都是可信的。
它是组成Web服务器的SSL安全功能的唯一的数字标识。通过相互信任的第三方组织获得,并为用户提供验证您Web站点身份的手段。服务器证书包含详细的身份验证信息,如服务器内容附属的组织、颁发证书的组织以及称为公开密钥的唯一的身份验证文件。这意味着服务器证书确保用户关于web服务器内容的验证,同时意味着建立的HTTP连接是安全的。
HTTPS证书包含了哪些内容
浏览器如何校验证书
网景公司提出的一种 Web 服务器证书有效性算法是大部分浏览器有效性验证技术的基础。验证步骤如下所述
日期检测
首先,浏览器检查证书的起始日期和结束日期,以确保证书仍然有效。如果证书过期了,或者还未被激活,则证书有效性验证失败,浏览器显示一条错误信息。
签名颁发者可信度检测。
每个证书都是由某些证书颁发机构(CA)签发的,它们负责为服务器担保。证书有不同的等级,每种证书都要求不同级别的背景验证。比如,如果申请某个电子商务服务器证书,通常需要提供一个营业的合法证明。
任何人都可以生成证书,但有些 CA 是非常著名的组织,它们通过非常清晰的流 程来验证证书申请人的身份及商业行为的合法性。因此,浏览器会附带一个签 名颁发机构的受信列表。如果浏览器收到了某未知(可能是恶意的)颁发机构
签发的证书,那它通常会显示一条警告信息。有些证书会携带到受信 CA 的有效 签名路径,浏览器可能会选择接受所有此类证书。换句话说,如果某受信 CA 为 “Sam 的签名商店”签发了一个证书,而 Sam 的签名商店也签发了一个站点证 书,浏览器可能会将其作为从有效 CA 路径导出的证书接受。
签名检测
一旦判定签名授权是可信的,浏览器就要对签名使用签名颁发机构的公开密钥,并将其与校验码进行比较,以查看证书的完整性。
站点身份检测
为防止服务器复制其他人的证书,或拦截其他人的流量,大部分浏览器都会试着 去验证证书中的域名与它们所对话的服务器的域名是否匹配。服务器证书中通常 都包含一个域名,但有些 CA 会为一组或一群服务器创建一些包含了服务器名称 列表或通配域名的证书。如果主机名与证书中的标识符不匹配,面向用户的客户 端要么就去通知用户,要么就以表示证书不正确的差错报文来终止连接。
整体请求过程
HTTPS的请求过程大致可以分为两个部分,一个是证书验证,一个是数据传输,具体的交互过程如下图所示:
加密验证和数据传输的具体过程
待添加具体内容