一、http协议介绍
1. 互联网三大基石
-
HTML(HyperTextMarkupLanguage):超文本标记语言
-
HTTP(HyperTextTransferProtocol):超文本传输协议
-
URL(UniformResourceLocation):统一资源定位符
2. URL
通常我们在访问一个网站页面时,请求到的内容通称为"资源"。而”资源“这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个 URI 来进行标识。URL简称统一资源定位符,用来唯一地标识万维网中的某一个资源。URL由协议、主机名称、端口以及文件名几部分构成。深入理解 URL 的组成部分
一个标准的url格式如下:
protocol://host[:port][abs_path]?arg1=value1&arg2=value2
- protocol: http或https,表示要通过哪个协议来定位网络资源;
- host:表示合法的Internet主机域名或者IP地址;
- port:指定一个端口号,为空则使用缺省端口(http是80,https是443);
- abs_path:指定请求资源的路径
- ? 之后的内容是请求参数,用于传递数据给服务器
3. HTML
超文本标记语言。超文本:文本信息、图片、声音、视频、超链接等。一个完整的Html页面可能会包含很多个URL的资源。(反之: 我们也可以理解一个HTML文件是由多个不同的URL资源拼接而成的。)
4.HTTP
HTTP是一个属于应用层的面向对象的超文本传输协议。是一种能够获取如 HTML 这样网络资源的通讯协议。它是在 Web 上进行数据交换的基础。简单理解:HTTP协议就是将用户请求的HTML页面从一台Web服务器传输到客户端浏览器的一种协议。规定了客户端和服务端数据的传输格式。HTTP的概述。由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。
-
1991年推出HTTP/0.9
-
1996年推出HTTP/1.0
-
1999年推出HTTP/1.1
-
2015年推出HTTP/2
目前使用最广泛的还是HTTP/1.1版本
5. 三者关系
一个完整的 HTML 页面是由多个不同的 URL资源组成的;而 HTTP 协议主要是用来传输这种 HTML 页面的.。
二、HTTP工作流程
整个用户访问网站过程就是 DNS-TCP-HTTP
网站请求生命周期分析
1、客户端发送请求
- 在浏览器输入url,譬如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都实现了HSTS机制,服务器自动从http协议重定向到https协议
- 在网页中点击超链接或
javascript
脚本进行url跳转,仅设置href=‘绝对路径’
,浏览器会自动使用当前url的协议、host和port,譬如在https://tieba.baidu.com/index.html
网页中,点击一个超链接/f?kw=chinajoy
, 会自动访问https://tieba.baidu.com/f?kw=chinajoy
2、路由转发
- IP查找:因特网内每个公有IP都是唯一的,域名相当于IP的别名,因为我们无法去记住一大堆无意义的IP地址,但如果用一堆有意义的字母组成,大家就能快速访问对应网站
- DNS解析:通过域名去查找IP,先从本地缓存查找,其中本地的hosts文件也绑定了对应IP,若在本机中无法查到,那么就会去请求本地区域的域名服务器(通常是对应的网络运营商如电信),这个通过网络设置中的LDNS去查找,如果还是没有找到的话,那么就去根域名服务器查找,这里有所有因特网上可访问的域名和IP对应信息(根域名服务器全球共13台),根域名会向顶级域名,二级域名等迭代查找。
- 路由转发:通过网卡、路由器、交换机等设备,实现两个IP地址之间的通信。用到的主要就是路由转发技术,根据路由表去转发报文,还有子网掩码、IP广播等等知识点
3、建立连接
通过TCP协议的三次握手建立连接
4、传输报文
建立连接后,客户端会通过TCP依次、有序的发送一定大小的报文,其中包括了超时重传、阻塞窗口等等概念,用来保证数据包的完整、有序。
- http协议使用的明文传输,所有内容都是直接可读的
- https协议是基于SSL/TLS加密,而SSL/TLS是基于TCP协议的,也就是http协议报文包装成TCP报文进行的加密,使用https协议的话,如果本地没有证书和公钥,那么会从服务器获取证书并且进行验证,流程如下:
-
5.Nginx代理服务器处理,具体要看部署的是什么环境
6. URLConf路由匹配
7. 后续…
三 、HTTP请求报文详解
1. 请求报文格式
http请求报文:由三部分组成,分别是:请求行、请求头、请求体
用fiddler抓包,登录百度请求报文如下
POST https://passport.baidu.com/v2/api/?login HTTP/1.1
Host: passport.baidu.com
Connection: keep-alive
Content-Length: 4794
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://www.baidu.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: iframe
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=EFBF3353B1DD5C2C3F41C1ECCCDF2E4D; PSTM=1624461531; .........
staticpage=https%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&charset=UTF-8&token=a61aff943106a7aca71b7d021f0df935&tpl=mn&subpro=&apiver=v3&tt=1628526378027&codestring=&safeflg=0&u=https%3A%2F%2Fwww.baidu.com%2F&isPhone=&detect=1&gid=50944EC-8600-45E1-ABCD3FBD34B90A86&quick_user=0&logintype=dialogLogin&logLoginType=pc_loginDialog&idc=&loginmerge=true&mkey=&splogin=rate&username=9999999999&password=h06BI6K8JaQWqSK84QsMz3UjxESLpCFP6x7EpjAcLkJj3HEHNe9LDbcTgrQlAM1WW%2Bnix4ifQTbf5gxe%2BQe3RAO1kU
2.请求method
必须为大写,现在一般只使用GET和POST,所有方法的说明如下:
3. 头部字段
请求头 | 描述 |
---|---|
Host | 主机ip地址或域名 |
User-Agent | 客户端相关信息,如操作系统、浏览器等信息 |
Accept | 指定客户端接收的数据类型,如: image/jpg, text/html, application/json |
Accept-Charset | 客户端接收的字符集,如gb2312、iso-8859-1 |
Accept-Encoding | 客户端可接受的内容编码,如gzip |
Accept-Language | 客户端可接受的语言如 zh-CN ,做国际化 |
Authorization | 客户端提供给服务端用户代理的权限认证信息(证书值) |
Cookie | 客户端携带给服务端的cookie信息 |
Referer | 当前文档的URL,即从哪个链接过来的,防止盗链 |
Content-Type | 请求体内容类型,如 application/x-www-form-urlencoded表示form表单 |
Content-Length: | 请求数据长度3799 |
Cache-Control | 缓存机制,如Cache-Control: no-cache 不缓存 |
Pragma | 防止页面被缓存,和Cache-Control: no-cache 作用类似(http1.0) |
Connection | 长链接,一次请求结束后先不四次挥手 Connection: keep-alive |
4. 请求体
get请求一般请求体为空,参数随url一并带过去,post请求参数一般会放在请求体中,k1=value1&k2=value2…,以form表单的形式提交。
5. 请求Connection
Http请求中的长连接与短连接
http1.0 协议使用的是短连接:建立一次tcp的连接,发起一次http的请求,结束,tcp断开。
http1.1 协议使用的是长连接:建立一次tcp的连接,发起多次http的请求,结束,tcp断开。
HTTP协议版本参考
HTTP1.1与HTTP2.0版本速度对比
四、HTTP响应报文详解
1.响应报文格式
http响应:由三部分组成,响应行、响应头和响应体
登录百度响应报文如下
HTTP/1.1 200 OK
Access-Control-Expose-Headers: Trace-ID
Cache-Control: public
Connection: keep-alive
Content-Security-Policy-Report-Only: object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' 'report-sample' wappass.baidu.com:* passport.baidu.com:* wappass.bdimg.com:* passport.bdimg.com:* ppui-static-wap.cdn.bcebos.com:* ppui-static-pc.cdn.bcebos.com:* hm.baidu.com:* fe.bdimg.com:* msg.baidu.com:* pdc.baidu.com:* img.baidu.com:* openapi.baidu.com:* res.wx.qq.com:* qqq.gtimg.cn:* s.bdstatic.com:* ufosdk.baidu.com:* qapm.baidu.com:* libs.baidu.com:* ext.baidu.com:* apps.baidu.com:* s3.pstatp.com:* tb2.bdstatic.com:* b.bdstatic.com:* msg.baidu.com:* www.baidu.com:* po.srf.baidu.com:* pan.baidu.com:* play.baidu.com:* tb1.bdstatic.com:* dup.baidustatic.com:* static.tieba.baidu.com:* gss2.bdstatic.com:* blob: baiduboxapp: bootupbaiduhd: ; report-uri https://report-uri.baidu.com/report?app=passport;
Content-Type: text/html
Date: Mon, 09 Aug 2021 16:26:16 GMT
Expires: 0
Last-Modified: Mon, 09 Aug 2021 16:26:16 16AugGMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: public
Referrer-Policy: no-referrer-when-downgrade, strict-origin-when-cross-origin
Server: BWS
Set-Cookie: logTraceID=ea2a43a15c6befcdc58c1bf6ae9cc9c830c8edd3b4dd736a2a; expires=Tue, 10-Aug-2021 16:26:16 GMT; path=/; domain=passport.baidu.com
Strict-Transport-Security: max-age=31536000
Trace-Id: A0812F01
Tracecode: 15768140410404001290081000
Traceid: 1628526376252891213811655629086689513480
Vary: Accept-Encoding
Content-Length: 1009
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<script type="text/javascript" nonce="zwugn5FXsFrL7hnu">
var href = decodeURIComponent("https:\/\/www.baidu.com\/cache\/user\/html\/v3Jump.html")+"?"
var accounts = '&accounts='
href += "err_no=4&callback=parent.bd__pcbs__r7wy9z&codeString=&isslide=&userName=9999999999&phoneNumber=&mail=&hao123Param=&u=https://www.baidu.com/&tpl=mn&secstate=&gotourl=&authtoken=&loginproxy=&resetpwd=&vcodetype=&lstr=<oken=&bckv=&bcsync=&bcchecksum=&code=&bdToken=&realnameswitch=&setpwdswitch=&bctime=&bdstoken=&authsid=&jumpset=&appealurl=&realnameverifyemail=0&traceid=A0812F01&realnameauthsid=&bind_mobile_token=&upgrade_mobile_token=&upgrade_mobile=&guide_upgrade_mobile=&scscene=&scnewuser=&secauthsid=&secbdstoken=&authid=&errno=&access_token=&expires_in=" + accounts;
if(window.location){
window.location.replace(href);
}else{
document.location.replace(href);
}
</script>
</body>
</html>
2.响应头
响应头 | 描述 |
---|---|
Server | HTTP服务器的软件信息 |
Data | 响应报文时间 |
Expires | 指定缓存过期时间 |
Set-Cookie | 向客户端设置Cookie |
Last-Modified | 资源最后修改时间 |
Content-Type | 响应类型和字符集,如,Content-Type:text/html;charset=utf-8 |
Content-Length | 响应内容长度 |
Keep-Alive: | timeout=5, max=100 长连接的超时时间 |
Connection | keep-alive表示长连接,服务器端可设置时间 |
Location | 指明重定向的新URL位置,如304 |
ETag | 首部字段 ETag 能告知客户端实体标识。服务器会为每份资源分配对应的 ETag |
值。资源改变,Etag值也会变
3.响应体
可以是html文件,也可以是json字符串,具体看用户访问的是什么资源。
4. 响应状态码
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为以下 5 种类型:
类别 | 描述 | |
---|---|---|
1xx | Information(信息状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务端错误状态码) | 服务器处理请求出错 |
以下是常见状态码详细说明
状态码 | 描述 |
---|---|
200 | 表示成功客户端成功接收到了服务端返回的数据,这是最常见的状态码 |
206 | 客户端发完请求后,服务端只是返回了部分数据,就会出现该状态码,例如当下载一个很大的文件时,在没有下载完成前就会出现该状态码 |
301 | 永久重定向(redirect) http–>https |
302 | 临时重定向(redirect) |
304 | 未修改。客户端请求的文档已在其缓存中,文档自缓存以来尚未被修改过。客户端使用文档的缓存副本,而不从服务器下载文档。 |
400 | 客户端请求语法错误,服务端无法理解 |
401 | 服务端开启了用户认证,而客户端没有提供正确的验证信息 |
403 | 服务端不允许客户端访问,或者没有找到默认返回页面(默认所有的web服务器返回的页面都是index.html、也可以调整默认返回页面app.html) |
404 | 客户端请求的资源不存在 (路径写错了;服务端真的没有;) |
413 | 客户端向服务端上传一个比较大的文件,并且文件大小超过了服务端的限制 1MB |
500 | 服务端出现了内部错误,需要进行人为排查故障 (链接数据库类服务异常,会出现500错误) |
502 | 服务器充当代理角色时,后端被代理的服务器不可用或者没有正常回应 |
503 | 服务当前不可用,由于超载或系统维护,服务器暂时的无法处理客户端请求 |
504 | 服务器充当代理角色时,后端的服务端没有按时返回数据,超时了 |
详细请参考:状态码完整版
五、Http相关术语
1 .PV(page view )
PV 即页面浏览量或点击量,是衡量一个网站或网页用户访问量。具体的说,PV 值就是所有访问者在 24 小时(0 点到 24 点)内看了某个网站多少个页面或某个网页多少次。PV 也指页面刷新的次数,每一次页面刷新,就算做一次 PV 流量。度量方法就是从浏览器发出一个对网络服务器的请求(Request),网络服务器接到这个请求后,会将该请求对应的一个网页(Page)发送给浏览器,从而产生了一个 PV。那么在这里只要是这个请求发送给了浏览器,无论这个页面是否完全打开(下载完成),那么都是应当计为 1 个 PV。
2. UV(unique visitor )
UV(Unique Visitor)独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。如果用户不保存cookies访问、清除了cookies或者更换设备访问,计数会加1。00:00-24:00内相同的客户端多次访问只计为1个访客
3. IP
IP即独立公网IP数,是指1天内多少个独立的IP浏览了页面,比如你在家通过拨号上网访问某个网站,此时网站会记录你的公网IP地址。那如果你在公司和很多同事同时访问一个网站,那该网站会记录多少个公网IP呢? (看公司有多少个出口公网地址)
4.并发
并发:指的是同时,我们可以理解为一段时间内(比如10秒),网站支持同时访问的人数,假设10s并发值如果为500时,一天能达到多少PV? 500 * 6 * 60 * 24 = 4320000
5. 扩展延伸
1.请计算如下题的 IP、PV、UV、并发
假设公司有一座大厦,大厦有100人,每个人有一台电脑和一部手机,上网都是通过NAT转换,每个人刷新网站10次,请问对应的 pv,uv,ip,并发分别是多少。
PV:页面浏览量 100人 * 2设备 * 10次刷新 = 2000pv
UV:独立的客户 100人 * 2设备 = 200UV
IP:独立公网IP 100人--> NAT = 1个独立IP
并发:单位时间内100人同时请求网站,100
2.上家公司的IP、PV,UV是多少?(运营)
小说网站 1分钟并发 5000*60*24=720w (屌丝、通常一看一天)
教育网站 1分钟并发 10000*60*24=1440w (努力青年、通常周末量大)
金融网站 1分钟并发 500*1440= 72w (有钱人、所以量不大、但交易额度高)
电商网站 1分钟并发
游戏网站 ------在线用户、日活跃数、月活跃数
需要注意的是: 这仅仅是参考值,因为不同的业务他们的pv都不一样。
3.上家公司的IP、PV、UV是如何统计的?
方式一:使用awk提取IP,sort排序、uniq统计去重统计IP
方式二:第三方统计工具进行pv统计,比如:piwik、腾讯分析、百度统计、开发自研统计平台。