Web基础入门-http协议

HTTP协议

http:超文本传输协议

超文本

包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接,形成网状(Web),因此又被 称为网页(Web Page)。这些链接使用URL表示。最常见的超文本格式是超文本标记语言HTML。

  • html文件 ->包含各种各样的元素(URL链接)->形成WebPage简称web页面
  • 说白了 就是远程将服务器上的内容下载传输到浏览器中 将内容展示在浏览器中

什么是URL

## 网址的整体就叫URL  URL由以下三部分组成↓
http://    www.blackgoatking.com:80   /1625053527.html
协议       主机(域名):端口             站点目录下的文件名

URL:统一资源定位符(每一个URL都是唯一的)
URL组成:协议、主机(域名)和端口、文件名
URI:/1625053527.html

超文本传输协议工作原理

小胖学Linux day48~49:Web基础入门-http协议_服务器

## 当我们在浏览器中输入:http://www.blackgoatking.com/1625053527.html 后发生了以下内容↓
1.浏览器请求DNS服务器
    - 本地DNS(local DNS) 优先级比远程DNS高
        如果本地DNS中有www.blackgoatking.com的域名解析则将本地DNS指定的IP地址返回给浏览器
    - DNS服务器
        找13个根域:
            .com
            .cn
            .org
            .edu
            .xyz
            .net
            .gov
             ...
        递归查询
            1.在对应的根域里找到对应的域名
            blackgoatking.com
            2.根据域名前的www主机名找到这个主机对应的A记录 也就是IP地址
            www.blackgoatking.com --> A记录:39.104.203.184
        迭代查询
            服务器查找
2.DNS将域名解析成IP地址(39.104.203.184)返回给浏览器
3.浏览器与该IP地址的80端口(nginx)建立TCP/IP连接
    - 连接过程俗称 三次握手
4.发送GET请求  请求下载 /1625053527.html 到浏览器中
    /var/www/doc 目录下找到 1625053527.html
5.服务端将 /var/www/doc目录下找到 1625053527.html 返回给浏览器
6.断开TCP/IP连接
    - 断开连接过程俗称 四次挥手
7.浏览器展示web页面(超文本传输协议,将html页面下载到浏览器中)

## 通俗理解↓
浏览器:单身狗
DNS:婚介所中介
URL:姑娘照片
IP地址:手机号
TCP/IP建立连接:打电话(三次握手)
断开TCP/IP连接:挂电话(四次挥手)
### 单身狗(浏览器) 通过 婚介所中介(DNS) 看到各种姑娘(URL) 的照片 看中了一个姑娘后 问婚介所中介要到了对应姑娘的电话(IP) 然后单身狗会和心仪的姑娘打电话(TCP/IP建立连接) 交流一番后就挂电话(断开TCP/IP连接)
静态请求 :当你的请求 不需要去访问数据库就能返回请求时 就是动态请求
动态请求 :当你的请求 需要去访问数据库才能返回请求时 就是动态请求

静态页面 :没有访问数据库 即便页面内的内容会动 甚至小游戏网站可以存档 那是因为浏览器就有存数据的功能
动态页面 :访问数据库

# 当你访问一个网站时 它的网站会变成以下内容 每个&后面就等于是传递了一个参数
https://www.baidu.com/
s?ie=utf8
&;f=8
&;rsv_bp=1
&;tn=baidu
&;wd=%E6%9B%BE%E5%BF%97%E9%AB%98%E7%BF%94
&;oq=%25E6%259B%25BE%25E8%2580%2581%25E6%25B9%25BF
&;rsv_pq=f865f8990001586e
&;rsv_t=ab36Jk%2Ba1Jpw9wdHyY0ARobg0ghcOw9FYXOWMNGAhYXuzSg1irXvqbY7DwY
&;rqlang=cn
&;rsv_enter=1
&;rsv_dl=tb
&;rsv_btype=t
&;inputT=8396
&;rsv_sug3=54
&;rsv_sug1=42
&;rsv_sug7=100
&;rsv_sug2=0
&;rsv_sug4=8396

分析浏览器中的请求响应信息

小胖学Linux day48~49:Web基础入门-http协议_服务端_02

### 浏览量F12 Network内容详情
## General
# 1.请求的URL
Request URL: http://10.0.0.8/
# 2.请求方法:GET
Request Method: GET
# 3.状态码
Status Code: 200 OK      2xx 3xx 4xx 5xx ...
# 4.远端地址
Remote Address: 10.0.0.8:80
# 5.referrer规则
Referrer Policy: no-referrer-when-downgrade
   - referrer:记录从哪里跳转到你的网站

## 响应头部信息
# 1.响应信息的单位,bytes(字节)
Accept-Ranges: bytes
# 2.连接方式:长链接(当你在同一个网页中浏览内容 不跳转到其他链接 就是同一个长链接)
Connection: Keep-Alive
# 3.响应的主体的长度(大小):2633
Content-Length: 2633
# 4.响应主体的类型是text/html 字符集是UTF-8
Content-Type: text/html; ;charset=UTF-8
# 5.访问的日期
Date: Thu, 26 May 2022 03:29:36 GMT
# 6.标签
ETag: "a49-56b5ce607fe00"
# 7.长链接的超时时间和最大连接数
Keep-Alive: ;timeout=5;max=100
# 8.上一次修改时间
Last-Modified: Fri, 04 May 2018 08:13:44 GMT
# 9.服务端信息
Server: Apache/2.4.6 (CentOS) PHP/5.4.16

## 请求头部信息
# 1.允许请求的主体类型
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,appli
cation/signed-exchange;v=b3
# 2.压缩
Accept-Encoding: gzip, deflate
# 3.允许的语言
Accept-Language: zh,en-US;q=0.9,en;q=0.8,zh-TW;q=0.7,zh-CN;q=0.6
# 4.缓存,没有开启缓存
Cache-Control: no-cache
# 5.连接方式:长链接
Connection: keep-alive
# 6.请求的服务端IP
Host: 10.0.0.8
# 7.没有缓存
Pragma: no-cache
# 8.浏览器向服务端发送的成功信号
Upgrade-Insecure-Requests: 1
# 9.客户端信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/73.0.3683.103 Safari/537.36

HTTP请求方法

## 常见请求方法
GET:读取一个页面
POST:明文提交数据,读取页面
DELETE:调用后端接口删除功能的页面
PUT:调用后端,存储、上传功能页面

## 了解即可
CONNECT:代理服务器
HEAD:读取web页面的头部信息
TRACE:测试服务器请求
OPTION:查询特定选项

HTTP状态码

200:页面访问成功

301:永久重定向(网页跳转) :无论你做出什么更改 都跳转到你指定的网页
302:临时重定向(网页跳转) :当你关闭nginx时 无法访问
# 重定向:当你输入www.baidu.com时是默认的80端口 重定向会帮你跳转到https:// 也就是443端口
304:浏览器缓存
307:内部重定向(内部网页跳转)

400:请求错误 客户端错误  Bad request 需要去排查客户端的报错
401:网站上的认证失败
403:权限不足(站点目录权限问题 Selinux没关)
404:找不到页面(站点目录出问题)

500:服务器内部错误(代码问题,服务器的问题)
502:Bad Gateway,后端服务报错(查看哪台服务器上的日志出现502,就检查该服务器后端的服务)
503:服务器过载,访问评率过快
504:后端服务超时(查看哪台服务器上的日志出现504,就检查该服务器后端的服务)

HTTP及架构请求访问流程

小胖学Linux day48~49:Web基础入门-http协议_服务端_03

# 在浏览器中输入http://blog.driverzeng.com
1.浏览器向local DNS发起域名解析请求,本地DNS(/etc/hosts)文件中没有
2.浏览器向DNS根域服务器发起请求,解析域名blog.driverzeng.com
3.DNS进行递归查询和迭代查询:
    客户端向服务端发起查询 - > 递归查询
    服务端向服务端发起查询 - > 迭代查询
    
    .com根域服务器发起查询
    .com根域服务器 -> .driverzeng.com
    .driverzeng.com -> blog.driverzeng.com A记录 39.104.203.184
    将 A记录:39.104.203.184返回给浏览器

4.浏览器和39.104.203.184所在服务器的80端口建立TCP/IP连接
    防火墙的规则不允许你的IP地址访问该服务器的80端口,则拒绝连接,报错返回给用户
    防火墙的规则允许你的IP地址访问该服务器的80端口,则放行
        - 建立连接(TCP/IP 三次握手)
                   syn(建立连接信号)
        客户端 ---------------------> 服务端
                 syn+ack(我收到建立连接的请求了)
        服务端 ---------------------> 客户端
                 ack(告诉服务端,我知道你收到建立连接的请求了)
        客户端 ---------------------> 服务端

5.向服务端的web服务发起http请求(负载均衡)
    - 请求头部信息
        1)请求的方法是什么: GET获取
        2)请求的Host主机是: blog.driverzeng.com
        3)请求的资源是什么: /index.html
        4)请求的端端口是什么: 默认http是80 https是443
        5)请求携带的参数是什么: 属性(请求类型、压缩、认证、浏览器信息、等等)
        6)请求最后的空行

6.将请求根据调度算法(rr 轮询)将请求下发给后端的web服务器
7.读取web服务器上的nginx配置文件,找到站点目录
8.找到对应的代码文件
    - 静态请求:
        1) web服务器将静态求情下发到共享存储服务器上,找到对应的静态资源返回给用户
        2) 不会去调用数据库和缓存 从服务器上或者文件服务器上找到静态资源直接返回给用户
   
    - 动态请求:
        1)将请求发送给后端代码,处理
        2)先找数据库的缓存(Redis,memcache)
        3)如果缓存中有数据,则直接将数据返回给用户
        4)如果缓存没有数据,则找后端数据库
        5)从数据库中取出数据后,先存入缓存一份,然后在返回给用户

9.返回对应的状态码和响应头部信息给浏览器
10.断开TCP/IP连接
    - 四次挥手

11.浏览器展示网站页面

三次握手

小胖学Linux day48~49:Web基础入门-http协议_服务端_04

四次挥手

小胖学Linux day48~49:Web基础入门-http协议_html_05

简单理解CDN

CDN:分布式静态缓存服务器

CDN位于防火墙和负载平衡之间 如果你的服务器有CDN 
请求的数据如果存在于CDN 那么直接由CDN返回你要的静态数据 不需要访问后端的其他服务端了

静态资源:html,css,js,mp3,mp4,avi,jpg.png...
1.提升了网站访问速度
2.减少后端服务器的压力

分布式
世界各地都有各种各样的CDN 例如 当你是国内服务器 而访问的客户都是美国人 那么 你可以买一个美国的CDN
将你的静态资源直接存在这个美国CDN内 这样 当美国用户访问你的网站时 直接就是由CDN返回资源给用户 提高效率

HTTP相关术语

PV:独立页面浏览量(一条日志,一个请求)
UV:独立设备
IP:独立的IP地址

假设公司有一座大厦,大厦有100人,每个人有一台电脑和一部手机,上网都是通过nat转换出口,每个人用每个设备点击网站2次, 请问对应的pv,uv,ip分别是多少?

pv:100 * 2 * 2 = 400
uv:100 * 2
IP:1

SOA松耦合架构

## 开发网站为了解耦,做出SOA架构

# 面向服务架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

# 比如一个电商公司(淘宝),他的网站页面功能会有很多 比如
注册  登录  首页  详情页  购物车  价格标签  留言
客服  支付中心  物流  仓储信息  订单相信  图片  ... 各种页面功能
# 在企业中 把这些功能 全拆分成各个功能模块 这样 当一个功能出问题时 其他功能不会出问题 还能正常访问

小胖学Linux day48~49:Web基础入门-http协议_服务端_06