本文内容:
- HTTP协议概述
- HTTP报文格式
- 请求方法与响应码
- 浏览器搜索到页面显示的过程,HTTP与TCP
- session与cookies
- http1.0,1.1,2.0
- Restful 编程风格
- HTTPS
HTTP协议概述
HTTP是指超文本传输协议,顾名思义就是通过网络在主机之间传递超文本的一种协议,广泛用于BS(浏览器和Web服务器)架构下
超文本:以超链接形式将多个文档组织起来的网状文档
HTTP报文格式
HTTP的工作模式是客户端浏览器向服务器请求资源,服务器响应发回资源,所以HTTP报文分为请求报文和响应报文
格式:起始行 + 头 + 数据体
请求报文 响应报文 起始行 方法类型、资源URL、版本号 版本号、响应码、状态码描述 头
- Accept: 发送方能接受的数据格式
- Accept-Language:接收的语言
- Host: 请求域名、端口号
- Connection: keep-alive 一次TCP连接多个请求
- Cookie 通信中的会话状态信息
- Content-Type(内容): 发送数据的类型
- Content-Length:发送数据的长度
- Content-Type: 发送数据的类型(application/json)
- Content-Length:发送数据的长度
- Content-Encoding:数据压缩格式(zip)
- Server:服务器应用软件名称、版本
- Date
体 数据 资源
请求方法
请求定义了对资源的操作类型,get,post,put,delete就像数据库select,insert,update,delete
get和post请求方法的区别
get post 语义 get表示从服务器取,应该只是检索数据 post表示上传实体到服务器,通常会对服务器产生影响 传送数据的方式 放到URL里 放到请求体里,相较而言更安全,但是也是明文传输 传送数据长度限制 受限于URL长度 没有限制 TCP数据包数 产生一个包,发送请求头和数据 产生两个包,
先发送头,服务器响应100(continue);
再发送数据
get缓存机制
目的:
- 减轻服务器压力
- 加快客户端请求读取
做法:
- 响应报文里会带上资源的几个状态信息
- Last-Modifed:上次修改时间
- Etag:资源标识
- Expired:过期时间
- 浏览器会把资源以及状态信息缓存下来
- 用户再次请求该资源时,浏览器检查过期时间是否到,
- 没到就直接返回资源不再请求服务器
- 到了的话就把资源状态信息
- Last-Modified放到请求头字段If-Modified-Since里
- Etag放到If-None-Match
- 询问服务器资源这段时间是否被更新
- 服务器检查时间一致的话,就返回304--Not Modifed
学习自博客 HTTP请求中的缓存机制
响应码
20x 30x 40x 50x 通俗 请求成功 请求重定向 客户端的请求有问题 服务器的处理有问题 举例 200:请求成功
201:创建成功,请求资源被成功创建
301;请求资源永久转移了
302:请求资源暂时被转移
304:请求资源未被修改
400:请求格式有误
403:拒绝执行请求
404:请求资源不存在
500:服务器内部错误
301和302的区别
- 301:资源永久转移,可以缓存
- 302:资源暂时转移
- 可能被URL劫持,搜索引擎会抓取新的内容而保留旧的网址
- 别人用302跳转你的网址,用户访问时,内容是你的,网址是他的
浏览器搜索到页面显示的过程
- DNS的解析
- 建立TCP连接
- 发送HTTP请求报文
- 服务器处理请求
- 服务器发回HTTP响应报文
- 浏览器请求静态资源(css,img,js等),渲染html
HTTP与TCP
- HTTP的无连接指的是?
- 每次请求都是相互独立的
- 一次HTTP请求建立一个TCP连接?处理完毕连接断开?
- Connection:keep-alive,使一次TCP连接用于多个请求,有超时时间
Session与Cookies
Cookies:Cookie集合,一个Cookie包含键值对、过期时间、域名、路径、Secure(SSH安全连接时回传)、描述信息,用户访问服务器时,服务器会给客户端浏览器返回一些键值对用来区分用户
客户端再次访问服务器时,满足条件就会在请求头里带上这些Cookie(有数量、大小限制,取决于浏览器,用户可自行删除),包含SessionId,用来确定客户身份
Session:是一个ConcurrentHashMap,是服务器用来存储用户信息的;服务器用<string,Session>的ConcurrentHashMap根据SessionId查找用户Session
作用:都是用来存储HTTP请求间的状态信息,保持访问用户与后端服务器的交互状态
区别:存储位置不同,Session更安全存储在服务器,Cookie存储在客户端浏览器,传输过程容易被人窥探,所以敏感信息应该加密 或 不通过Cookie传输
http1.0,1.1与2.0
http1.0 http1.1 http2.0 连接 默认短连接(1次请求建立1个TCP连接)
可以通过设置Connection:Keep-alive使用长连接
默认长连接 多路复用(一个连接并发多个请求),基于二进制帧(保证请求不乱序)
缓存 cache-control:
- 缓存请求指令:
- no-store:不缓存请求或响应的任何内容
- no-cache:强制向服务器再次验证,客户不要缓存
- max-age:缓存过期时间
- 缓存响应指令:
- public:向任一方提交缓存
- private:告知代理服务器,只向指定客户提供缓存
支持虚拟主机,增加host字段以区分同一个IP下的多个虚拟主机
引入OPTIONS方法
- 获取服务器支持的HTTP请求方法
- 检查服务器的性能
服务端主动推送,比如推送css文件,js文件,静态数据 允许客服端不等请求返回就发下一个请求,
服务器必须按请求顺序返回响应首部压缩
Restful 编程风格
概述:对资源的URL访问路径进行命名的风格
特点:
- 一个URL标识一个资源,URL中只能有名词
- 使用标准HTTP的请求方式,比如 GET、PUT、POST 和 DELETE,分别对应资源的增删改查操作
- 客户端、服务端的交互请求是无状态的
- 示例风格:域名/接版本号,版本号后接资源类型
举例:
- GET https://域名/v1/node/nodes 查询所有节点
- POST https://域名/v1/node/{nodeId} 插入节点
好处:对所有资源的访问更加统一,容易举一反三,便于访问、记忆
URI:统一资源标识符,URL:统一资源定位符
URI包括了URL,URL是以路径作为标识