006.HTTP协议概述
HTTP协议
1. http协议介绍
超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。HTTP遵循经典的C/S模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于TCP/IP层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像UDP那样静默的丢失消息
-
超文本
包含有超链接(Link)和各种多媒体元素标记(Markup)的文本,这些超文本之间彼此链接,形成Web,因此又被称为网页(Web Page),这些链接用URL表示。HTML是最常见的超文本标记语言
-
URL
HTTP 请求的内容通称为"资源"。"资源"这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个URI来进行标识。一般情况下,资源的名称和位置由同一个 URL(统一资源定位符,它是 URI 的一种)来标识,URL由协议、主机、端口(默认为80)和文件路径四部分组成
统一资源定位符的语法(URL)
-
方案或协议
http://www.example.com:80/path/index.html?key1=value1&key2=value2#Documenthttp://告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, mailto: 协议指示浏览器打开邮件客户端;ftp:协议指示浏览器处理文件传输 -
主机
http://
www.example.com:80/path/index.html?key1=value1&key2=value2#Documentwww.example.com既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求 -
端口
http://www.example.com
:80/path/index.html?key1=value1&key2=value2#Document:80是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443),则通常省略端口号 -
路径
http://www.example.com:80
/path/index.html?key1=value1&key2=value2#Documentpath/index.html是 Web 服务器上资源的路径。如果没有指定访问路径,那将会直接访问WEB服务器的根,此时服务器反馈到客户端的文件就是管理员指定的默认网页文件 -
查询
http://www.example.com:80/path/index.html
?key1=value1&key2=value2#Document?key1=value1&key2=value2是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者 -
片段
http://www.example.com:80/path/index.html?key1=value1&key2=value2
#Document#Document是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。例如,在 HTML 文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器
2. http工作原理
- 用户输入域名->浏览器跳转->浏览器缓存->Hosts文件->DNS解析(递归查询|迭代查询)
客户端向服务端发起查询->递归查询
服务端向服务端发起查询->迭代查询
- 浏览器向服务端发起TCP连接(三次握手)
客户端 -->请求包连接 syn=1 seq=x --> 服务端
客户端 <--响应客户端 syn=1 ack=x+1 seq=y <-- 服务端
客户端 -->建立连接 ack=y+1 seq=x+1 --> 服务端
- 客户端发起http请求
1. 请求的方法:GET获取
2. 请求的Host主机:www.baidu.com
3. 请求的资源:/index.html
4. 请求的端口:默认http是80、https是443
5. 请求携带的参数:属性(请求的类型、压缩、认证、浏览器信息等)
6. 请求最后的空行
- 服务端响应的内容
1. 服务端使用的WEB服务软件版本
2. 服务端响应请求文件的类型
3. 服务端响应请求的文件是否进行压缩
4. 服务端响应请求的主机是否进行长连接
- 客户端向服务端发起TCP断开(四次挥手)
客户端 -->断开请求 fin=1 seq=x --> 服务端
客户端 <--响应断开 fin=1 ack=x+1 seq=y <-- 服务端
客户端 <--断开连接 fin=1 ack=x+1 seq=z <-- 服务端
客户端 -->确认断开 fin=1 ack=z+1 seq=sj --> 服务端
3. 访问网站分析
-
浏览器分析超链接中的URL
-
DNS请求
PC向DNS服务器发出DNS QUERY请求
www.qq.com的A记录,DNS的A记录表示将域名绑定到IP![访问网站分析-1]()
-
DNS回复
DNS服务器回复DNS response,解析出
www.qq.com域名对应的2条A记录![访问网站分析-2]()
-
TCP三次握手
PC获取到
www.qq.com的IP地址后,向该IP发起TCP三次握手![访问网站分析-3]()
-
HTTP GET请求
在TCP三次握手的连接上,PC向
www.qq.com服务器发起GET请求主页![访问网站分析-4]()
-
服务器响应
www.qq.com服务器回应浏览器HTTP/1.1 200 OK,返回主页数据包 -
TCP四次挥手
完成数据交互过程,TCP四次挥手断开连接
长连接与短连接
短连接:HTTP 1.0,一次TCP连接只能发起一次http请求
长连接:HTTP 1.1,在一次TCP连接中,可以发起多次http请求

打开百度的首页可以看到浏览器请求了58个资源,如果以短连接的方式发起58个requests,那需要发起58次TCP连接,而长连接仅需要在一次TCP连接里,发起58次http请求即可
HTTP 1.1 一次请求对应一次响应,HTTP 2.0 从串行请求变成了并行请求,批量执行请求与响应
4. http请求与响应
- http请求
Request URL: https://www.baidu.com/ # 请求得URL地址
Request Method: GET # 请求方法
Status Code: 200 OK # 状态码
Remote Address: 14.215.177.38:443 # 请求的主机地址和端口
scheme: https # 请求的协议
accept: text/html # 请求的资源类型
accept-encoding: gzip, deflate, br # 压缩
accept-language: zh-CN,zh;q=0.9 # 语言
cache-control: no-cache # 缓存
pragma: no-cache # 无缓存
user-agent: Chrome/108.0.0.0 Safari/537.36 # 客户端来源设备
- http响应
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8 # 返回内容的类型和字符集
Date: Mon, 19 Dec 2022 14:31:47 GMT # 返回服务器时间,GMT表示需要在此时间基础上+8小时
Server: BWS/1.1 # 使用的web软件版本
Location: https://www.baidu.com/ # http重定向
Referer: https://www.baidu.com/ # 记录上一网页的地址
cookie # 会话共享
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能
- 响应状态码
| 状态码 | 含义 |
|---|---|
| 200 | 访问成功 |
| 301 | 永久跳转 |
| 302 Moved Temporarily | 临时跳转 |
| 304 From memory cache | 本地缓存 |
| 307 | 内部跳转 |
| 304 Not Modified | 本地缓存 |
| 400 | 客户端错误 |
| 401 | 认证错误 |
| 403 | 找不到主页、权限不足 |
| 404 Not Found | 找不到该页面 |
| 500 | 服务端错误 |
| 502 | 找不到后端主机 |
| 503 | 服务器过载 |
| 504 | 请求超时 |
-
http相关术语
pv:页面浏览量;一次浏览产生了多少个http请求就代表产生了多少个pv
uv:独立设备;uv指同一时间网站被多少个硬件设备访问
ip:独立ip;ip指同一时间访问网站的公网ip数量
NGINX
nginx基本概述
Nginx是一个开源、高性能、可靠的Web服务、代理服务,Nginx是一个轻量级的服务,它本身只保留http和核心模块的代码,用户可以根据自身需求扩充安装相应的代码功能模块。Nginx采用Epool网络模型,Apache采用Select模型
- Select:当用户发起一次请求,select模型就会进行一次遍历扫描,导致性能不佳
- Epool:当用户发起一次请求,epool模型会直接处理,高效且无连接限制。服务器本身能够处理的最大端口数是65535,且一个连接可能会打开多个文件描述符,因此,连接数还是会收到一定限制,并且还需要对文件描述符做一定调整
常见的几个Web服务软件:Nginx、Apache、IIS、lighttpd、Tengine、openresty;Tomcat、Jboos、resin
Nginx安装
示例:yum安装
[root@web01 ~]# yum install -y yum-utils
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@web01 ~]# yum-config-manager --enable nginx-mainline
[root@web01 ~]# yum install -y nginx
[root@web01 ~]# nginx -v # 验证nginx是否安装成功
[root@web01 ~]# nginx -V # 查看nginx的编译参数
无论使用yum安装或编译安装nginx,nginx的安装都有对应的编译参数,只不过yum安装的nginx是官方将源码包先编译后,再封装成的rpm包
示例:编译安装
[root@web01 ~]# wget http://nginx.org/download/nginx-1.22.1.tar.gz
[root@web01 ~]# tar -xzf nginx-1.22.1.tar.gz -C /opt/
[root@web01 ~]# cd /opt/nginx-1.22.1/
[root@web01 ~]# cd /opt/nginx-1.22.1/
[root@web01 ~]# yum install -y gcc pcre-devel openssl-devel
[root@web01 nginx-1.22.1]# ./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/lcoal/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module
[root@web01 nginx-1.22.1]# make && make install
[root@web01 nginx-1.22.1]# ln -s /usr/local/nginx/nginx /usr/bin/nginx
编译安装参数文档:在不明白参数选项有什么作用的情况下,可以通过此参考手册查询
编译安装示例:首次编译安装nignx的情况下,可参考官方提供的示例选项





浙公网安备 33010602011771号