HTTP协议基础

一、网站访问流程

1.客户端请求域名解析-DNS
2.客户端与服务端进行三次握手,建立TCP连接
3.客户端发送HTTP请求报文
4.服务端发送HTTP响应报文
5.客户端与服务端进行四次挥手,拆除TCP连接

url与uri

url:统一资源定位符-表示域名部分
uri:统一资源标识符-表示资源请求部分

二、HTTP协议报文结构

Curl---文本HTTP请求工具
用法:curl domain #以文本形式显示指定域名的响应文件
参数

-L 追踪HTTP重定向
-v 显示HTTP请求信息
-H 指定参数添加至HTTP请求头
-s 静默请求(不显示请求过程)
-o 文件名 将请求结果写入指定文件
-I 仅返回HTTP Response头部信息
-i 返回HTTP Response头部信及页面内容

用例:curl -vLH host:domain IP_address

[root@web01 ~]# curl -vLH host:jd.com 182.92.169.193 
* About to connect() to 182.92.169.193 port 80 (#0)
*   Trying 182.92.169.193...
* Connected to 182.92.169.193 (182.92.169.193) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host:jd.com
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx
< Date: Wed, 01 Dec 2021 02:43:43 GMT
< Content-Type: text/html
< Content-Length: 138
< Connection: keep-alive
< Location: https://www.aspenhan.com/
< 
...
[root@Blog-Han ~]# curl -IL jd.com
HTTP/1.1 301 Moved Permanently
Date: Wed, 13 Dec 2023 13:31:29 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.jd.com
Server: jfe
Cache-Control: no-cache

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Dec 2023 13:31:30 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
......

1.HTTP请求报文

  • 请求行
    1.请求方法:Get/Post
    2.请求内容
    3.协议信息
Get-获取信息
Post-提交信息
> GET / HTTP/1.1     #GET-请求方法 /-请求内容 HTTP/1.1-请求协议及版本
  • 请求头
    1.用户客户端信息
    2.请求的服务端虚拟主机配置文件
    3.接受信息
> User-Agent: curl/7.29.0   #请求客户端信息
> Host: jd.com              #请求的服务端虚拟主机配置文件
> Accept: */*               #接受信息
  • 空行

  • 请求主体:Get请求不存在请求主体,Post请求存在请求主体

    2.HTTP响应报文

  • 起始行
    1.协议信息
    2.状态码(状态码列表见附件)

< HTTP/1.1 302 Moved Temporarily  #HTTP/1.1-协议信息 302 Moved Temporarily-状态码
  • 响应头
    1.Web服务程序
    2.响应时间(格林威治时间)
    3.响应数据信息类型
    4.响应数据的容量
    5.TCP连接类型
    6.指定跳转地址
    7.证书有效期(HTTPS特性)
长链接:客户端请求数据传输完成后,等待一段时间,等待时间结束以前没有任何数据传输后,再断开TCP连接
短链接:客户端请求数据传输 完成后,立即断开TCP连接
< Date: Fri, 26 Jul 2019 07:19:37 GMT  #请求响应时间(格林威治时间)
< Content-Type: text/html              #响应数据信息类型
< Content-Length: 165                  #响应数据的容量
< Connection: keep-alive               #TCP连接类型
< Location: http://www.jd.com          #指定跳转地址
  • 空行
  • 响应主体:HTML代码信息
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>JengineD/1.7.2.1</center>
</body>
</html>

[root@web01 /etc/nginx/conf.d]# curl -v jd.com
* About to connect() to jd.com port 80 (#0)
*   Trying 120.52.148.118...
* Connected to jd.com (120.52.148.118) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: jd.com
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
< Date: Fri, 26 Jul 2019 07:19:37 GMT
< Content-Type: text/html
< Content-Length: 165
< Connection: keep-alive
< Location: http://www.jd.com
< Server: jfe
< 
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>JengineD/1.7.2.1</center>
</body>
</html>
* Connection #0 to host jd.com left intact

三、资源信息

1、静态资源

  • 定义:将网站的代码文件信息、图片、视频、音频、附件等信息直接传输给用户,用户收到信息由浏览器进行解析,显示在浏览器页面上
  • 优势:便于被搜索引擎收录

2、动态资源

  • 定义:由动态数据处理网站代码文件信息处理完并且和数据库进行交互后,将结果传输给用户
  • 优势
    1.动态调整页面显示信息,便于维护
    2.可以与数据库交互
    3.提供用户交换功能

四、网站的度量方式

IP:独立IP数量-用户访问网站的源IP地址数量
PV:页面访问量-同一用户针对同一网站不同页面的访问数量
UV: 记录用户独立访客数量(利用cookie和session)

cookie:网站分配给用户的标识信息
session:网站记录每个用户的会话信息

五、测量HTTP请求各阶段耗时

示例:
curl https://www.baidu.com -so /dev/null -w'\ndns_resolution: %{time_namelookup}\nconnect_time: %{time_connect}\nappconnect_time: %{time_appconnect}\npretransfer_time: %{time_pretransfer}\nstarttransfer_time: %{time_starttransfer}\ntotal_time: %{time_total}\n'
curl 域名 \
> -so /dev/null \
> -w '
> dns_resolution: %{time_namelookup}
> connect_time: %{time_connect}
> appconnect_time: %{time_appconnect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}\n
  • %{time_namelookup}DNS解析所需的时间
  • %{time_connect}TCP连接所需的时间
  • %{time_appconnect}SSL/SSH等连接/握手所需的时间
  • %{time_pretransfer}从请求开始到文件传输即将开始所需的时间
  • %{time_starttransfer}从请求开始到第一个字节被客户端接收所需的时间
  • %{time_total}整个请求所需的时间
[root@web01 ~]# curl https://www.baidu.com \
> -so /dev/null \
> -w '
> dns_resolution: %{time_namelookup}
> connect_time: %{time_connect}
> appconnect_time: %{time_appconnect}
> pretransfer_time: %{time_pretransfer}
> starttransfer_time: %{time_starttransfer}
> total_time: %{time_total}\n'

dns_resolution: 0.004
connect_time: 0.009
appconnect_time: 0.125
pretransfer_time: 0.125
starttransfer_time: 0.131
total_time: 0.131

六、HTTP状态码列表

状态码 含义 说明
100 继续 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分
101 切换协议 请求者已要求服务器切换协议,服务器已确认并准备切换
200 服务器成功返回网页 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
201 已创建 请求成功并且服务器创建了新的资源
202 已接受 服务器已接受请求,但尚未处理
203 非授权信息 服务器已成功处理了请求,但返回的信息可能来自另一来源
204 无内容 服务器成功处理了请求,但没有返回任何内容
205 重置内容 服务器成功处理了请求,但没有返回任何内容
206 部分内容 服务器成功处理了部分 GET 请求
300 多种选择 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择
301 永久跳转 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
302 临时跳转 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
303 查看其它位置 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
304 未修改 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容
305 使用代理 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
307 临时重定向 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
400 请求错误 服务器不理解请求的语法
401 未授权 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应
403 禁止访问 服务器拒绝请求
404 服务器找不到请求的页面 服务器找不到请求的网页
405 方法禁用 禁用请求中指定的方法
406 不接受 无法使用请求的内容特性响应请求的网页
407 需要代理授权 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
408 请求超时 服务器等候请求时发生超时
409 冲突 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息
410 已删除 如果请求的资源已永久删除,服务器就会返回此响应
411 需要有效长度 服务器不接受不含有效内容长度标头字段的请
412 未满足前提条件 服务器未满足请求者在请求中设置的其中一个前提条件
413 请求实体过大 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力
414 请求的URI过长 请求的 URI(通常为网址)过长,服务器无法处理
415 不支持的媒体类型 请求的格式不受请求页面的支持
416 请求范围不符合要求 如果页面无法提供请求的范围,则服务器会返回此状态代码
417 未满足期望值 服务器未满足”期望”请求标头字段的要求
500 内部服务器错误 服务器遇到错误,无法完成请求
501 尚未实施 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码
502 错误网关 后端服务不可用或没有完成响应的网关服务器
503 服务当前不可用 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态
504 网关超时 服务器作为网关或代理,但是没有及时从上游服务器收到请求
505 HTTP版本不受支持 服务器不支持请求中所用的 HTTP 协议版本

表格内容转载自:oldboy博客

附:思维导图