# 关于 HTTP 协议 (opens new window)
# HTTP 简介
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

# HTTP-URL
HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息
URL,全称是 UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个 URL 为例,介绍下普通 URL 的各部分组成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
从上面的 URL 可以看出,一个完整的 URL 包括以下几部分:
- 协议部分:该 URL 的协议部分为“http:”,这代表网页使用的是 HTTP 协议。在 Internet 中可以使用多种协议,如 HTTP,FTP 等等本例中使用的是 HTTP 协议。在"HTTP"后面的“//”为分隔符.
- 域名部分:该 URL 的域名部分为“www.aspxfans.com”。一个 URL 中,也可以使用 IP 地址作为域名使用
- 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口.http 默认端口 80/tcp;https 默认端口 443/tcp 443/udp.参见常见的默认端口 (opens new window)
- 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是“/news/”
- 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名
- 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个 URL 必须的部分
- 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
# HTTP 之请求消息 Request
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:
- 请求行(request line)
- 请求头部(header)
- 空行
- 请求数据
# B/S 架构和 C/S 架构
- B/S 客户端/服务器模式
- C/S 浏览器/服务器模式
# C/S 架构
# B/S 架构

# HTTP 请求
一次完整的 HTTP 请求过程 (opens new window)
DNS 解析
发送 TCP 请求(三次握手)
- 浏览器会选择一个大于 1024 的本机端口向目标 IP 地址的 80 端口发起 TCP 连接请求。经过标准的 TCP 握手流程,建立 TCP 连接。
负载均衡
- 什么叫负载均衡?
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
当一台服务器无法支持大量的用户访问时,将用户分摊到两个或多个服务器上的方法叫负载均衡。
Nginx
浏览器渲染
网页静态资源加载(CDN)
CDN 加速- 内容分发网络.依靠部署在各地的服务器,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度。
# 在浏览器输入 url 访问网址的过程中发生了什么?
输入url到页面渲染发生了什么 (opens new window)
url 组成
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name图中中括号是可选项
- protocol 协议,常用的协议是 http,https
- hostname 主机地址,可以是域名,也可以是 IP 地址
- port 端口 http 协议默认端口是:80 端口,如果不写默认就是:80 端口 ;https 默认的端口号为443/tcp 443/udp
- path 路径 网络资源在服务器中的指定路径
- parameter 参数 如果要向服务器传入参数,在这部分输入
- query 查询字符串 如果需要从服务器那里查询内容,在这里编辑
- fragment 片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置
- 用户在浏览器中输入 url 后,浏览器会先对输入的地址进行解析,比如用的协议是
http还是https - 之后根据域名进行 ip 的寻址
- 寻址先从 DNS 缓存开始,比如 host
- host 没有就访问 dns 服务器,一层一层向上,直至访问到根服务器(IPv4 协议跟服务器全球 13 台)(DNS 解析)
- 寻找到对应的 ip 后服务器再把 ip 地址发送给客户端
- 客户端拿到 ip 地址后向对应 ip 地址的服务器发起请求
- 与服务器建立 tcp 连接(3 次握手)
- SSL/TLS 4 次握手交换信息(数字证书,3 个随机数,加密通信协议)
- Client Hello Server Hello
- SSL/TLS 4 次握手交换信息(数字证书,3 个随机数,加密通信协议)
- 与服务器建立 tcp 连接(3 次握手)
- 成功建立连接后向服务器(代理服务器,CDN 服务器)发送 HTTP 请求.
- 服务器处理请求并返回数据(Http 报文)
- 浏览器解析并渲染出页面
- 根据 HTML 解析生成 DOM 树
- css 解析生成 css 规则树
- JavaScript 资源下载
- 结合 dom 树和 css 规则树进行绘制
- 渲染出页面
