1.Web简介
2.Http简介
3.Http报文
4.Http的状态码
5.服务器状态 - cookies
6.Web缓存
csharp
复制代码
1).Web是由无数个网页通过超链接构成的庞大信息空间, 通俗的理解Web是我们日常看到的一个个网页的集合
2).网页由一些对象组成, 对象可以是html文件, jpeg图像, 声音剪辑文件等
3).通过url(通用对象访问符)对每个对象进行引用
- 访问协议, 用户名, 口令, 端口等
4).url格式
https://editor.csdn.net/md/?articleId=151252442&spm=1011.2415.3001.9698
a.https表示协议名
b.editor.csdn.net 域名
c.md表示服务器上的路径
d.?articleId=151252442&spm=1011.2415.3001.9698 查询参数
e.端口在语法上确实是位于域名之后, 路径之前
2.Http
csharp
复制代码
1).Http协议简介
Http表示超文本传输协议, 表示为了传输超文本而制定的规则; 超文本表示一份包含超链接的文件(点击超链接从一个地方
跳到另一个地方)
a.Web的应用层协议
b.客户端/服务器模式
- 客户: 请求, 接收和显示web对象的浏览器
- 服务器: 对请求进行响应, 发送对象的web服务器
csharp
复制代码
2).Http短连接和无状态简介
a.http/1.0版本默认方式短连接, 一个连接只用于一次请求-响应
b.无状态: 协议本身不会为了下一次通信而记住本次通信的任何内容, 每一次http请求都是完全独立的, 自包含的, 服务器
不会默认记录任何之前的请求信息
c.http/1.1后http是持久性连接(长连接)
csharp
复制代码
Http的下层协议使用的是tcp
a.客户端发起一个与服务器的tcp连接(建立套接字), 端口号为80
b.服务器接受客户端的tcp连接
c.在浏览器(http客户端)与web服务器(http服务器server)交换http报文
d.tcp连接关闭
csharp
复制代码
3).持久性http和非持久性http
a.区别: 一次事务完成后, 下层的传输层(tcp)连接是否断开
b.事务: 客户端发送请求, 服务器处理请求, 客户端接收响应
c.Http/1.0使用非持久性连接, Http/1.1默认使用持久性连接
d.如下是非持久性http的实例:
csharp
复制代码
持久性Http
a.服务器在发送响应后, 仍保持tcp连接
b.在相同客户端和服务器之间的后续请求和响应报文通过相同的连接进行传送
c.持久性Http分为两种方式:
- 非流水方式的持久Http
客户端只能在前一个响应后才能发出新的请求
- 流水方式的持久Http
Http/1.1的默认方式, 客户端无需收到前一个响应可以立即产生一个请求
3.Http报文
csharp
复制代码
Http报文就是用于通过Http协议发送和接收数据的数据块
a.Http协议: 两个人约定好的对话规则(比如: 先说请求行, 再说头部, 空一行, 再说正文)
b.Http报文: 按照这个规则写出来的具体的一封信, 里面包含了所有要传递的信息
c.Http报文分为两种:
- 请求报文(Request Message): 写给服务器的信
- 响应报文(Response Message): 服务器回给你的信
csharp
复制代码
1).http请求报文的格式
请求报文有三个必有的核心部分组成
a.请求行(The Request Line) - 信封上的一句话摘要; 这是信的第一行, 告诉服务器你想干什么, 它又包含三部分:
- 方法(Method), 你想做的动作
Get表示你想获取点东西, 比如: 获取网页, 图片
Post表示你想提交点东西给服务器, 比如: 提交登录信息, 下单数据等
- URL(路径)
你想要的动作施加在哪个资源上, 比如: /product/12345.html
- Http版本
用的什么写信格式, 比如: Http/1.1
b.请求头(Request Headers) - 信的附加说明
从第二行开始, 是一行行的"键值对", 就像在信纸上写一些附加信息, 告诉服务器更多细节
- Host: www.taobao.com(你要寄给谁?)
- User-Agent: Mozilla/5.0(你用什么浏览器写的这封信)
- Accept: text/html(我希望你回信用html格式)
- Cookie: user_id = abc123(这是你的身份凭证, 告诉服务器你是谁)
c.请求体(Request Body) - 信的主要内容
一个空行之后, 才是信的具体内容; 不是所有信都有内容
- Get请求通常没有Body, 参数通常在url中
- Post请求通常有Body, 里面装着你提交的数据; 比如你登录时写的username=xiaoming&password=123456就在这里
csharp
复制代码
2).http响应报文的格式
服务器回信的结构也非常类似, 同样由三部分核心组成
a.状态行(Status Line) - 回信的第一句话
告诉你请求的结果如何了, 也包含三部分:
- Http版本
- 状态码(Status Code), 一个三位数字, 快速告诉你结果
- 原因短语: 对状态码的简短文字描述, 比如OK
比如: HTTP/1.1 200 OK, 表示你请求的事情办成了
b.响应头(Response Headers) - 回信的附加说明
同样是键值对, 服务器告诉你一些关于这封回信的说明
- Content-Type: text/html(我回信的主要内容是HTML格式的)
- Content-Length: 1024(内容有1024字节)
- Set-Cookie: new_session=def456(给你一张新的会员卡, 下层记得带上)
c.响应体(Response Body) - 回信的主要内容/你要的东西
空行之后, 服务器返回的真实数据
csharp
复制代码
Http协议中最常用的方法Method
a.Get - 获取(查看)
从服务器查询资源, 只读操作, 不应该修改服务器状态; 参数在url
b.Delete - 删除
请求服务器删除指定的资源
c.Head - 头部(获取元信息)
只向服务器获取资源的响应头(Header), 不要响应体(Body); 也就是说, 只要元信息, 不要数据本身
d.Post - 用于创建和触发复杂更新
比如1: 领取每日奖励, 服务器发生了什么 ?
- 创建了一条新的奖励领取记录
- 修改了你的金币数量(给你加钱)
- 修改了你的任务状态(标记为已领取)
- 你看: 这个请求创建了新数据, 并顺带修改了其他数据; 但其核心是创建了一个领取动作的记录
比如2: 触发复杂更新, 服务器发生了什么?
- 从你的背包里删除这个道具(修改)
- 给你的角色增加经验值(修改)
- 可能会触发其他效果(如更新成就进度)
- 你看: 这个请求没有创建一个显而易见的新东西, 但它触发了一个有多个步骤的使用动作, 导致多处数据被修改
e.Put - 用于简单地更新
比如: 更新个人资料, 服务器发生了什么?
用你发过来的完整新数据, 直接替换掉旧的个人资料数据; 你看: 这个请求非常直接, 就是更新, 而且是完整替换; 它不涉
及复杂的业务逻辑
4.Http的响应状态码
csharp
复制代码
Http的响应状态码位于服务器, 客户端的响应报文中首行; 常见的状态码如下:
a.200 Ok
请求成功, 请求对象包含在响应报文的后续部分
b.301 Moved Permanently
- 请求的对象被永久转移了, 新的url在响应报文的首部行中指定
- 客户端软件自动用新的url去获取对象
c.400 Bad Request
一个通用的差错代码, 表示该请求不能被服务器解读
d.404 Not Found
请求的文档在该服务器上没有找到
e.505 Http version not supported
5.服务器状态 - cookies
csharp
复制代码
1).对于Http无状态的再次说明
a.什么是无状态(Stateless)?
无状态意味着协议本身不会为了处理同一个用户的下一次请求而记住上一次请求的任何信息; 可以将每一次Http请求和
响应都看作是一次全新的, 独立的对话
b.无状态是协议本身的特性, 因为Http协议的设计规范(rfc标准)中是这样定义的, 它规定
- 客户端发送一个请求(Request)
- 服务器返回一个响应(Response)
- 然后, 这次交易就结束了; 协议层面不会要求服务器保留这次连接的任何上下文信息, 以便为下一个来自客户端的请求
服务
协议的标准规定了它的无状态性, 任何遵循Http协议的通信, 天生就是无状态的
c.服务器扮演什么角色?
服务器是被动遵循这一特性的实体, 由于协议是无状态的, 所以默认情况下, 服务器在处理完一个请求后, 就会忘记这
个客户端; 但是这带来了一个巨大的问题, 我们日常生活中的web的应用(如登录购物网站, 社交软件)几乎都需要状态(
知道你是谁, 你的购物车有什么), 前辈想出了各种方法在无状态的协议上, 模拟出有状态的体验
csharp
复制代码
HTTP协议是无状态的, 这导致服务器在默认情况下也是无状态处理的, 但服务器可以通过其他手段来管理会话状态
csharp
复制代码
2).Cookie简介
服务器在第一次响应时, 会给客户端浏览器一小块数据(cookie); 浏览器之后每次请求都会自动带上这个cookie; 服务器
通过读取cookie里的信息(Session ID)来识别用户
a.Cookie四个组成部分
- http响应报文中有一个cookie的首部行
- http请求报文含有一个cookie的首部行
- 用户系统中保留一个cookie文件, 由用户的浏览器管理
- web站点有一个后端数据库
b.示例如下:
csharp
复制代码
3).通过商场购物的方式理解Cookie, Session, Token
- 我们 - 浏览器
- 商场 - 服务器
- 买东西/查看会员积分 - 需要登录状态的请求
a.Cookie表示商场发给你的一张会员卡, 这张会员卡存放在你的浏览器, 里面包含了卡号(Session ID), 可能还会包含
简单的信息(比如你等级, 积分)
csharp
复制代码
b.Session表示商场后台的会员档案柜的一份你的个人档案, 它存在商场的后台(存放在服务器上, 内存, 数据库); 它里面
有你的唯一档案编号(Session id)和详细信息, 比如姓名, 电话, 购物车商品, 积分明细等
csharp
复制代码
c.Token表示商场用特殊工艺给你制作的一个加密防伪徽章, 这个徽章由我们保管, 它里面这个徽章本身就刻有了你的全部
信息(比如姓名, 等级), 并且有商场专用的加密防伪签名, 它不需要一个后台的档案柜来查询
csharp
复制代码
a.Cookie的本质
是一个在客户端(浏览器)存储数据的小机制, 并且会自动在每次请求携带
b.Session的本质
是在服务器端保存用户状态的一种机制, 它需要一个钥匙(通常是存在Cookie里的 Session ID)才能找到
c.Token的本质
是一个自包含的、带有加密签名的身份凭证; 服务器验证签名后就直接信任其中包含的信息, 无需在服务器端存储任何状态
6.Web缓存
csharp
复制代码
1).Web缓存的核心: 将一份已经请求过的资源(如网页, 图片, 脚本)的副本存储起来, 当再次需要该资源时, 可以直接从存储
中读取, 而无需再次向原始服务器请求
2).Web缓存的优点:
a.极大加快页面加载速度, 从本地磁盘或附近缓存读取远比跨越千山万水从服务器下载快得多
b.显著减少网络带宽消耗, 节省流量, 降低成本
c.有效降低服务器压力, 更少的请求意味着服务器可以服务更多的用户
csharp
复制代码
3).缓存分类
a.浏览器缓存
- 位置: 在你的电脑硬盘上
- 作用: 这是离用户最近的缓存, 同一个网站的资源(如LOGO图片、通用CSS/JS)在第一次加载后就会被存起来, 后续
访问同一网站甚至不同网站(如果共用同一个资源)时都可以直接使用
b.代理服务器缓存
- 位置: 通常由ISP(网络服务提供商, 如中国电信、中国移动)或公司网络部署在中间节点
- 作用: 为大量用户服务; 如果你请求的一个资源, 之前已经有另一个用户请求过, 代理服务器就可以直接把副本给你,
而无需去源站获取
c.CDN缓存
- 位置: CDN(内容分发网络)的边缘节点, 遍布全球各地
- 作用: 这是现代网站必用的技术, 将你的静态资源(图片、视频、CSS、JS)分发到全球各地的CDN节点; 用户可以从地
理上离他最近的节点获取资源, 速度极快