07、Nginx 实战:Nginx基础Http原理

1Http协议概述

HTTP全称HyperText Transfer Protocol中文名为超文本传输协议

1.1.什么是超文本?

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

1.2.什么是URL?

URL简称统一资源定位符,用来唯一标识万维网中的某一个文档。URL由协议、主机(域名)和端口(默认为80)以及文件名及其路径组成。
https://search.jd.com/Search?keyword=%E�Linux &enc=utf-8 &wq=5%AD%A9linu &pvid=0e5157a69 (&为分隔符,表示参数)
 

1.3.什么是超文本传输协议?

是一种按照URL指示,将超文本文档从一台主机(Web服务器)传输到另一台主机(浏览器)的应用层协议,以实现超链接的功能。(从web界面下载文件---即通过web界面将服务器的文件下载到本地)

2Http工作原理

 

用户通过Internet浏览点击URL;www.baidu.com,浏览器分别执行如下动作:

1.浏览器分析超链接中的URL地址,获取到域名
2.浏览器向NDS服务器请求解析www.baidu.com的IP地址
3.NDS将解析出的IP地址返回给浏览器
4.浏览器通过IP地址+端口号(80端口)与服务器建立TCP连接 TCP为传输层协议---即端口
5.浏览器请求文档:get /index.html
6.服务器响应,将文档index.html发给浏览器
7.浏览器显示index.html中的内容 
8.最后释放TCP连接

3Http协议版本

http1.0协议使用的是短连接:建立一次tcp的连接,发起一次http的请求,结束,tcp断开。
http1.1协议使用的是长连接:建立一次tcp的连接,发起多次http的请求,结束,tcp断开。

4Http请求响应

4.1.http请求报文的方法

get     获得请求文件信息的数据内容(下载)
post    用户提交数据至服务器端存储(上传)

4.2.http返回状态码(Status-Code), 以3位数字组成

200     成功请求
301     永久重定向(redirect) 
302     临时重定向(redirect) 
304     浏览器缓存
403     请求不到首页或权限被拒绝
404     请求的资源不存在
500     服务器内部错误,程序代码错误
502     找不到后端的资源
504     请求超时

4.3.用户访问网站携带的参数,以及服务端返回的参数

#1.概况
Request URL: http://10.0.0.7/index.html         请求的URL地址
Request Method: GET                             请求的方法(获取)
Status Code: 304 Not Modified                   返回的状态
Remote Address: 10.0.0.7:80                     请求的主机地址和端口
Referrer Policy: no-referrer-when-downgrade  ---从https协议降为http协议时,不传递Referrer 报头。但是反过来的话不受影响。通常也会当作浏览器的默认安全策略。
#2.客户端请求的头部信息
Accept: text/html,                请求的类型(如果浏览器不知道请求的是什么类型,默认以下载的方式)
Accept-Encoding: gzip, deflate                  是否进行压缩
Accept-Language: zh-CN,zh;q=0.9                 请求的语言
Cache-Control: no-cache                          缓存
Connection: keep-alive                          TCP长连接
Host: www.oldboyedu.com                         请求的域名
If-Modified-Since: Fri, 04 May 2018 08:13:44 GMT# 修改的时间
User-Agent: Mozilla/5.0                         请求浏览器的工具
"=== 请求一个空行 ==="
"=== 请求内容主体 ===" 

#3.服务端响应的头部信息

HTTP/1.1 304 Not Modified                       返回服务器的http协议,状态码
Date: Fri, 14 Sep 2018 09:14:28 GMT             返回服务器的时间(GMT时间)+8小时=传统时间
Server: Apache/2.4.6 (CentOS) PHP/5.4.16        返回服务器使用的软件(Apache php)
Connection: Keep-Alive                          TCP长连接
Keep-Alive: timeout=5, max=100                  长连接的超时时间
"=== 返回一个空行 ==="
"=== 返回内容主体 ==="

4.4.Http相关术语pv、ip、uv

假设公司有一座大厦,大厦有100人,每个人有一台电脑和一部手机,上网都是通过nat转换出口,每个人点击网站2次, 请问对应的pv,uv,ip分别是多少
PV:页面浏览量, 400
uv:独立的客户, 200
ip:独立IP, 1个

5Http访问流程

 

5.1.http协议原理总结

1.用户输入域名->浏览器跳转->浏览器缓存->Hosts文件->DNS解析( 递归查询 | 迭代查询 )
    客户端向服务端发起查询->递归查询
    服务端向服务端发起查询->迭代查询
2.由浏览器向服务端发起TCP连接(三次握手)
    客户端  -->请求包连接-syn=1 seq=x           服务端
    服务端  -->向应客户端syn=1 ack=x+1 seq=y    客户端
    客户端  -->建立连接  ack=y+1 seq=x+1        服务端
3.客户端发起http请求:
    1.请求的方法是什么: Get 获取
    2.请求的Host主机是: www.oldboyedu.com
    3.请求的资源是什么: /index.html
    4.请求的端口是什么: 默认http是80  https 443
    5.请求携带的参数是: 属性(请求的类型、压缩、认证、浏览器信息、等等)
    6.请求最后的空行
4.服务端响应的内容是
    1.服务端响应使用的WEB服务软件
    2.服务端响应请求文件的类型
    3.服务端响应请求的文件是否进行压缩
    4.服务端响应请求的主机是否进行长连接
5.客户端向服务端发起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  -->      服务端

5.2.用户访问网站集群架构流程

1.客户端发起http请求,请求会先抵达前端的防火墙
2.防火墙识别用户身份,正常的请求通过内部交换机通过tcp连接后端的负载均衡,传递用户的http请求
3.负载接收到请求,会根据请求的内容进行下发任务,通过tcp连接后端的web,转发发用户的http请求
4.web接收到用户的http请求后,会根据用户请求的内容进行解析,解析分为如下:
    静态请求:web直接返回给负载均衡->防火墙->用户
    动态请求:web向后端的动态程序建立TCP连接,将用户的动态http请求传递至动态程序->由动态程序进行解析
5.动态程序在解析的过程中,如果碰到查询数据库请求,则优先与缓存建立tcp连接,并发起数据查询操作。
6.如果缓存没有对应的数据,动态程序再次向数据库建立tcp连接,并发起查询操作。
7.最后数据由, 数据库->动态程序->缓存->web服务->负载均衡->防火墙->用户。

5.3.面试时建议按照如下五层,进行分层讲解给面试官。

 

6常见HTTP状态码大全

1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。

代码 说明
http状态码 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
http状态码 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx (成功)
表示成功处理了请求的状态代码。
代码 说明
http状态码 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
http状态码 201 (已创建) 请求成功并且服务器创建了新的资源。
http状态码 202 (已接受) 服务器已接受请求,但尚未处理。
http状态码 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
http状态码 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
http状态码 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
http状态码 206 (部分内容) 服务器成功处理了部分 GET 请求。

3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

代码 说明
http状态码 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
http状态码 301 (永久跳转) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
http状态码 302 (临时跳转) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
http状态码 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
http状态码 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
http状态码 305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
http状态码 307 (内部跳转) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。

代码 说明
http状态码 400 (错误请求) 服务器不理解请求的语法。
http状态码 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
http状态码 403 (禁止)服务端返回不了首页给客户端。
http状态码 404 (未找到) 服务器找不到请求的网页。
http状态码 405 (方法禁用) 禁用请求中指定的方法。
http状态码 406 (不接受) 无法使用请求的内容特性响应请求的网页。
http状态码 407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
http状态码 408 (请求超时) 服务器等候请求时发生超时。
http状态码 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
http状态码 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
http状态码 411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
http状态码 412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
http状态码 413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
http状态码 414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
http状态码 415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
http状态码 416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
http状态码 417 (未满足期望值) 服务器未满足”期望”请求标头字段的要求。

5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

代码 说明
http状态码 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
http状态码 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
http状态码 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
http状态码 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
http状态码 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
http状态码 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。