①网络配置-②获取MAC地址-③DNS域名解析-④TCP链接创建-⑤HTTP GET 报文发送给服务器-⑥服务器生成HTTP 响应报文-⑦浏览器接收数据-⑧提取渲染git
若是已经有主机信息既不须要这一步骤【获取网络配置信息】github
①DHCP 请求报文:源端口:68,目标端口:67【默认UDP数据报信息,长度超过 512 字节时使用 TCP】;源ip:0.0.0.0;目标地址:255.255.255.255【IP数据报】;放入MAC帧【数据帧】中;【广播数据合成】数据库
②将上述数据广播到全部交换机链接的设备;浏览器
③DHCP服务器接收到广播数据帧,生成DHCP ACK报文,包含:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码缓存
④该帧的目的地址是请求主机的 MAC 地址,由于交换机具备自学习能力,以前主机发送了广播帧以后就记录了 MAC 地址到其转发接口的交换表项,所以如今交换机就能够直接知道应该向哪一个接口发送该帧。安全
⑤主机收到该帧后,不断分解获得 DHCP 报文。以后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。服务器
主机经过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机须要知道网站的域名对应的 IP 地址。网络
主机生成一个 DNS 查询报文,该报文具备 53 号端口,由于 DNS 服务器的端口号是 53。工具
该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。学习
该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。
DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,须要使用 ARP 协议【广播接收MAC地址】。
主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具备广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给全部的链接设备,包括网关路由器。
网关路由器接收到该帧后,不断向上分解获得 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,所以就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
知道了网关路由器的 MAC 地址以后,就能够继续 DNS 的解析过程了。
网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
由于路由器具备内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,所以路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
到达 DNS 服务器以后,DNS 服务器抽取出 DNS查询报文,并在 DNS 数据库中查找待解析的域名。
找到 DNS 记录以后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,而后放入 IP 数据报中,经过路由器反向转发回网关路由器,并通过以太网交换机到达主机。
有了 HTTP 服务器的 IP 地址以后,主机就可以生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
在生成 TCP 套接字以前,必须先与 HTTP 服务器进行三次握手来创建链接【TCP链接创建】。生成一个具备目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
HTTP 服务器收到该报文段以后,生成 TCP SYN ACK 报文段,发回给主机。
链接创建以后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。【数据传输】
浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,以后进行渲染,显示 Web 页面。
服务器返回的 响应报文 中第一行为状态行,包含了状态码以及缘由短语,用来告知客户端请求的结果。
200 OK
204 No Content :请求已经成功处理,可是返回的响应报文不包含实体的主体部分。通常在只须要从客户端往服务器发送信息,而不须要返回数据时使用。
206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。
301 Moved Permanently :永久性重定向
302 Found :临时性重定向
303 See Other :和 302 有着相同的功能,可是 303 明确要求客户端应该采用 GET 方法获取资源。
注:虽然 HTTP 协议规定 30一、302 状态下重定向时不容许把 POST 方法改为 GET 方法,可是大多数浏览器都会在 30一、302 和 303 状态下的重定向把 POST 方法改为 GET 方法。
304 Not Modified :若是请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,若是不知足条件,则服务器会返回 304 状态码。
307 Temporary Redirect :临时重定向,与 302 的含义相似,可是 307 要求浏览器不会把重定向请求的 POST 方法改为 GET 方法。
400 Bad Request :请求报文中存在语法错误。
401 Unauthorized :该状态码表示发送的请求须要有认证信息(BASIC 认证、DIGEST 认证)。若是以前已进行过一次请求,则表示用户认证失败。
403 Forbidden :请求被拒绝。
404 Not Found:没有找到页面。
500 Internal Server Error :服务器正在执行请求时发生错误。
503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,如今没法处理请求。
GET 用于获取资源,而 POST 用于传输实体主体。
GET 和 POST 的请求都能使用额外的参数,可是 GET 的参数是以查询字符串出如今 URL 中,而 POST 的参数存储在实体主体中。
不能由于 POST 参数存储在实体主体中就认为它的安全性更高,由于照样能够经过一些抓包工具(Fiddler)查看。
由于 URL 只支持 ASCII 码,所以 GET 的参数中若是存在中文等字符就须要先进行编码。例如 中文
会转换为 %E4%B8%AD%E6%96%87
,而空格会转换为 %20
。POST 参数支持标准字符集。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2
安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。
GET 方法是安全的,而 POST 却不是,由于 POST 的目的是传送实体主体内容,这个内容多是用户上传的表单数据,上传成功以后,服务器可能把这个数据存储到数据库中,所以状态也就发生了改变。
安全的方法除了 GET 以外还有:HEAD、OPTIONS。
不安全的方法除了 POST 以外还有 PUT、DELETE。
幂等的 HTTP 方法,一样的请求被执行一次与连续执行屡次的效果是同样的,服务器的状态也是同样的。换句话说就是,幂等方法不该该具备反作用(统计用途除外)。
全部的安全方法也都是幂等的。
在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
GET /pageX HTTP/1.1 是幂等的,连续调用屡次,客户端接收到的结果都是同样的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1
POST /add_row HTTP/1.1 不是幂等的,若是调用屡次,就会增长多行记录:
POST /add_row HTTP/1.1 -> Adds a 1nd row POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1 是幂等的,即便不一样的请求接收到的状态码不同:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404
若是要对响应进行缓存,须要知足如下条件:
为了阐述 POST 和 GET 的另外一个区别,须要先了解 XMLHttpRequest:
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个经过 URL 来获取数据的简单方式,而且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
HTTP 有如下安全性问题:
HTTPS 并非新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通讯,再由 SSL 和 TCP 通讯,也就是说 HTTPS 使用了隧道进行通讯。
经过使用 SSL,HTTPS 具备了加密(防窃听)、认证(防假装)和完整性保护(防篡改)。
对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不一样的密钥。
公开密钥全部人均可以得到,通讯发送方得到接收方的公开密钥以后,就可使用公开密钥进行加密,接收方收到通讯内容后使用私有密钥解密。
非对称密钥除了用来加密,还能够用来进行签名。由于私有密钥没法被其余人获取,所以通讯发送方使用其私有密钥进行签名,通讯接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。
HTTPS 采用混合的加密机制,使用非对称密钥加密用于传输对称密钥来保证传输过程的安全性,以后使用对称密钥加密进行通讯来保证通讯过程的效率。(下图中的 Session Key 就是对称密钥)
经过使用 证书 来对通讯方进行认证。
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方均可信赖的第三方机构。
服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份以后,会对已申请的公开密钥作数字签名,而后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一块儿。
进行 HTTPS 通讯时,服务器会把证书发送给客户端。客户端取得其中的公开密钥以后,先使用数字签名进行验证,若是验证经过,就能够开始通讯了。
SSL 提供报文摘要功能来进行完整性保护。
HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改以后,同时从新计算 MD5 的值,通讯接收方是没法意识到发生了篡改。
HTTPS 的报文摘要功能之因此安全,是由于它结合了加密和认证这两个操做。试想一下,加密以后的报文,遭到篡改以后,也很难从新计算报文摘要,由于没法轻易获取明文。