HTTP 协议
Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信的。HTTP是现代全球因特网中使用的公共语言。
HTTP 协议概述
- HTTP(HyperText Transfer Protocol) 超文本传输协议
- HTTP 是一种能够获取如 HTML 这样的网络资源的 protocol (通讯协议)。
- 是一种 client客户端 - server服务器 同时要遵守的协议
- 请求通常是由像浏览器这样的接受方发起的
- HTTP 协议中规定了请求数据和响应数据的格式(报文)
请求报文
- 请求报文
- 浏览器再向服务器发送请求的时候,会携带的数据
- 该数据是特定格式的字符串
- 可以使用 chrome 监视请求并查看请求报文
- 请求报文格式
请求行
- 请求方法(常见的 GET 和 POST)
- 请求路径
- 协议版本
GET / HTTP/1.1
GET /index.html HTTP/1.1
请求头
- 浏览器在向服务器发送请求的时候携带了附加信息
- 由键值对组成
- 如果需要设置请求头,使用setRequestHeader方法来设置
键 | 值 |
---|---|
Host | 请求的主机 |
Cache-Control | 控制缓存(例如:max-age=60 缓存 60 秒) |
Accept | 客户端想要接收的文档类型,逗号分隔 |
User-Agent | 标识什么客户端帮你发送的这次请求 |
Referer | 这次请求的来源 |
Accept-Encoding | 可以接受的压缩编码 |
请求体
- GET 请求没有请求体
- POST 请求有请求体,请求体就是发送给服务器的数据
响应报文
响应报文组成
- 响应行
- 协议版本
HTTP/1.1 200 OK
// 需要注意的是200,它表示状态码
// 状态码:
// - 描述了请求过程中所发生的情况
// - 每个状态码的第一位数字都用于描述状态的一般类别("成功"、"出错"等)
// - 常见状态码
// - 200 - 成功
// - 404 - 请求的资源部存在
// - 500 - 服务器内部错误
响应头
- 服务器返回响应的时候携带了附加信息
- 由键值对组成
键 | 值 |
---|---|
Date | 响应时间 |
Server | 服务器信息 |
Content-Type | 响应体的内容类型 |
Content-Length | 响应的内容大小 |
响应体
- 返回的主体内容,如果请求的是网页返回网页的内容,如果请求的是图片返回图片的内容
Ajax请求遵循 HTTP协议
本质上 XMLHttpRequest 就是 JavaScript 在 Web 平台中发送 HTTP 请求的手段,所以我们发送出去的请求任然是 HTTP 请求,同样符合 HTTP 约定的格式:
// 设置请求报文的请求行
xhr.open('GET', '/Time')
// 设置请求头
xhr.setRequestHeader('Accept', 'text/plain')
// 设置请求体
xhr.send(null)
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
// 获取响应状态码
console.log(this.status)
// 获取响应状态描述
console.log(this.statusText)
// 获取响应头信息
console.log(this.getResponseHeader('Content-Type')) // 指定响应头
console.log(this.getAllResponseHeaders()) // 全部响应头
// 获取响应体
console.log(this.responseText) // 文本形式
console.log(this.responseXML) // XML 形式
}
}
URL
URL(Uniform Resource Locator),统一资源定位符,通俗点来说就是表示网络当中某一个网页的完整访问地址,它具有一定的格式:协议://主机地址[:端口]/路径?查询字符串#锚点
- 协议
- http
- https
- 主机地址
- IP地址
- 域名
- 端口
- http请求,默认端口80
- https请求,默认端口443
- MySQL默认端口3306
- 访问一个网页的时候,默认端口可以省略
- 路径
- 服务器文件夹上的资源(html/css/images/js/接口)
- 参数(查询字符串)
- ? 后面的部分,是键值对的形式(id=1&page=1)
IP 地址
- 作用就是标识一个网络设备(计算机、手机、电视)在某一个具体的网络当中的地址。
- 设备在某一个网络中的地址,目前最常见的格式:[0-255].[0-255].[0-255].[0-255] 即为四个 0-255 的数字组成。
- 在同一个网络中,计算机的IP是不允许相同的,都是唯一的
- 127.0.0.1 是本地回环地址
单个网络情况
在单个局域网下,结构非常简单,就是我们所连接的网络设备(网关)给我们分配了一个地址,在这个范围之内我们都可以通过这个地址找到我们的这个设备。
如果设备没有连接任何网络情况下,我们会有一个本地回环地址 127.0.0.1
多个网络情况
但是当一个设备同时处于多个网络下(比如同时连接了有线网卡和无线网卡),就会变得稍微复杂一点:
域名
由于 IP 地址都是没有规律的一些数字组成的,很难被人记住,不利于广泛传播,所以就有人想出来要给 IP 起名字(别名)。
域名是需要花钱注册的
购买到域名需要解析到你的web服务器,即让他和服务器IP对应上
顶级域名
.com: 商业机构
.cn: 中国国家、地区域名 .hk,
.gov: 政府网站。
.org: 机构。
.edu: 教育网站。
.net: 网络服务商。
.mil: 军事。
特殊的域名
localhost
含义为本地主机,对应127.0.0.1 。这是一个保留域名,主要用于本地测试。
端口
计算机本身是一个封闭的环境,就像是一个大楼,如果需要有数据通信往来,必须有门,这个门在术语中就叫端口,每一个端口都有一个编号,每台计算机只有 65536 个端口(0-65535)
一般我们把“占门”的过程叫做监听
端口号的作用,是标示计算机内的某个软件
可以通过在命令行中运行: netstat -an
命令监视本机端口使用情况
在请求网络资源时,默认端口可以省略
DNS
DNS: Domain Name System 域名系统。在DNS服务器中保存了域名和IP的映射关系。主要工作是将域名转换为IP地址,因为我们通过浏览器访问网站时,实际上是去找对应的IP地址。
比如:
域名 | IP |
---|---|
baidu.com | 202.22.35.66 |
sina.com | 45.22.45.45 |
通过宽带运营商提供的服务器解析一个域名背后对应的 IP,这个过程叫做 DNS 寻址,帮你完成 DNS 寻址过程的服务器叫做 DNS 服务器。
通俗的将,DNS服务器能够通过你输入的域名返回该域名对应的IP。然后我们通过IP去访问网络上的资源。
浏览器DNS缓存
当我们在浏览器输入域名后,浏览器首先并不是向DNS服务器发起请求,解析其对应的IP的,而是先看浏览器缓存中是否有缓存,如果有,则使用缓存中保存的IP去请求网络资源的。
- windows下查看dns缓存:
- ipconfig /displaydns
- ipconfig /displaydns > c:/dnscache.txt 将dns缓存导入到c:/dnscache.txt文件
- windows下清除dns缓存
- ipconfig /flushdns
- 清除谷歌浏览器缓存
- chrome://net-internals/#dns
hosts 文件
操作系统在发起对 DNS 服务器的查询请求之前,会优先检查本机的 hosts 文件。如果这个文件中包含了对当前需要解析的域名的配置,则不再发起对 DNS 服务器的请求,直接使用 hosts 文件中的配置。
文件所在路径:
- Windows:C:\Windows\System32\drivers\etc\hosts
- macOS:/etc/hosts
注意:
- 本机的 hosts 文件配置只能到影响本机的 DNS 寻址
- 只有以管理员权限运行的编辑器才有权利修改 hosts 文件
发起TCP请求
客户端在向服务器发请求之前,会先向服务器发送TCP请求,过程可以理解为:
- 客户端:hello,你在吗?
- 服务器:嗯,我在
- 客户端:好的,我知道了
此过程又称之为客户端和服务器三次握手。
访问网站时请求响应流程
我们在浏览器输入一个网址后,按下回车,最后看到一个页面,这个过程是怎样的?
- 用户打开浏览器
- 地址栏输入我们需要访问的网站网址(URL)
- 检测浏览器DNS缓存,看是否有域名和IP的对应关系
- 检查本机的 hosts 文件,看是否有域名和IP的对应关系
- 浏览器通过 DNS 服务器 获取即将访问的网站 IP 地址
- 浏览器发起一个对这个 IP地址的 请求
- 服务端监听指定的 端口 的服务器软件接收到这个请求,进行相应的处理
- 服务端将处理完的结果返回给客户端浏览器(响应)
- 浏览器将服务端返回的结果呈现到界面上
静态网站和动态网站
静态网站
- Apache 实现的功能,浏览器请求对应的文件 → Apache 负责读取文件 → 将文件内容响应给客户端浏览器
- Apache 将网页文件(纯文本)原封不动的返回给浏览器
- 无法满足让网页内容动起来(随着数据动态变化)的需求
动态网站
- 不再将 HTML 固定写死,每次用户请求时,动态执行一段代码,临时生成一个用户想要的 HTML 页面。
- 动态网站指的也就是每次请求时服务端动态生成 HTML 返回给用户的这种网站。
- 实现动态网站的技术有很多,例如:JSP、ASP.NET、PHP、Node.js 等等。