Http 基础

在这里插入图片描述
首先分析一张图

1:为什么我们一开始就要Redirect

输入URL后这个URL可能已经永久跳转成新的地址了 所以需要先判断

2: 缓存

你请求的资源可能已经缓存过来 所以需要查找

3:DNS

查找域名对应的Ip

4:TCP:连接

经过TCP三次握手 如果是HTTPS连接 需要一个Https的连接

网络协议分层

OSI七层模型

应用层 表示层 会话层 传输层 网络层 链路层 物理层

表示层

数据格式化转化 数据加密

会话层

建立 管理和维护会话

五层网络协议

在这里插入图片描述

物理层主要作用是定义物理设备如何传输数据(硬件 网线 光缆)

数据链路 在通信实体之间建立数据链路连接

物理层的线路有传输介质与通信设备组成,比特流在传输介质上传输时肯定会存在误差的。这样就引入了数据链路层在物理层之上,采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务。

网络层 为数据在节点之间的传输创建逻辑链路(我们从我的电脑访问百度服务器,寻找百度的地址这就是 网络层创立的)

IP选址以及路由选择

传输层(TCP/IP UDP)

向用户提供了可靠的端到端的服务

将上层应用的数据进行分段和重组 将他们合并到一个数据流中 提供了端与端的数据传输服务 并可在发送主机与目标主机之间建立逻辑连接

像高层屏蔽了下层数据通信细节

应用层

为应用软件提供了很多服务

构建与TCP协议之上

屏蔽了网络传输相关的细节

Http 各种版本

0.9

只有一个命令Get

没有HEADER等信息

服务器发送完毕就关闭TCP连接

1.0

增加了很多命令(post put delete)

增加status code 和 header

多字符集支持,多部分发送,权限和缓存

1.1

持久连接

pipeline(同一个连接多个请求 串行化处理)

增加host(允许了一台物理服务器同时跑多个web服务 相应的后端需要设置这个host)和其他一些命令

2

所有数据以二进制传输

同一个连接发送多个请求不需要再按顺序进行处理

头信息压缩以及推送等效率低下的功能

三次握手

Http 没有连接这个概念 只有响应和请求 所以需要建立一个Tcp Connection连接通道 来发送响应 请求 数据包

表示有三次网络传输

在这里插入图片描述

发起一个我要创建连接的数据包请求

SYN=1(同步序列编号) 标志位 这是一个创建请求的数据包

服务端接受到这个请求 开启一个TCPSOCKET的端口 返回给客户端 ACK(确认字符) = Seq(序号)+1 再发送一个服务端的Seq(序号)

再去发送一个ACK = 服务端Seq+1 与一个Seq这个Seq值是第二次握手的ACK值

未来规避网络传输中各种情况导致连接失败,客户端不知道仍然等待连接的情况

URI URL URN

URI

统一资源标志符

用来标识互联网上唯一的资源的标识

包括URL 和 URN

URL

统一资源定位器

http://user:pass@host.com:80/path?query=string#hash
https
ftp
xxxx

URN

永久统一资源定位符

Http报文

在这里插入图片描述

Post请求才有请求体

Http 方法 用来定义对资源的操作

Restful风格的 get post put delete

查 增 改 删

Cors跨域请求

请求已经发送了 服务器也确实响应返回了 浏览器帮你拦截掉了

因为浏览器的同源限制

浏览器是允许路径标签跨域的

跨域中127.0.0.1 和 localhost 不一样

Cors 预请求

GET

HEAD

POST

不需要预请求

text/plain

multipart/form-data

application/x-www-form-urlencoded

不需要

请求头限制

预请求 Request Method 会显示为OPTIONS

Access-Control-Allow-Origin 允许其他地址

Access-Control-Allow-Headers 允许自定义请求头

Access-Control-Allow-Methods 允许其他方法 PUT DELETE

Access-Control-Max-Age 允许以这个请求的最大时间 这个时间之内不要发送预先请求

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  req.setCharacterEncoding("UTF-8");
  resp.setContentType("text/html;charset=utf-8");
  resp.setHeader("Access-Control-Allow-Origin", "*");
  resp.setStatus(200);
  PrintWriter printWriter = resp.getWriter();
  printWriter.write("<h1>1</h1>");
}
//java Servlet案例

Cache-Control 缓存

代理服务器 Nginx

public Http 经过的任何地方都可以缓存

private 发起请求的浏览器才可以进行缓存

no-cache 经过服务器验证才可以使用缓存

max-age 缓存到期时间

s-maxage 在代理服务器才会生效

max-stale 可以接收超出max-age时间的响应消息

must-revalidate 设置了max-age的缓存当中 已经过期了 必须去原服务端验证

proxy-revalidate 给缓存服务器设置的

no-store 不可以缓存

no-transform 不允许服务器压缩等改动返回内容

例子

'Cache-Control' : 'max-age = 5, s-maxage = 20'

浏览器缓存

在这里插入图片描述
Last-Modified 上次修改时间

配合If-Modified-Since使用

对比上次修改时间来验证资源是否需要更新

Etag

数字签名

这两种都是服务端可以用来确认是否要更新浏览器数据的方式

Cookie 和 Session

Cookie 是服务端通过Set-Cookie设置到浏览器里面的

下次同域请求中会带上这个Cookie

属性

max-age

expires

Secure 表示只有在Https请求的时候才会带上

HttpOnly 无法通过document.cookie访问

domain 表示可以设置cookie的域名 比如domain=test.com test.com 和 它的二级域名都可以访问到

二级域名

a.com是一级域名,那么b.a.com就是a.com的二级域名

Session

session不一定需要用cookie实现‘

Http 长连接

一个TCP连接可以发送多个Http请求

但是1.1 是有先后顺序的 当Http连接达到上限 要进行等待

connection : close 可以关闭连接

数据协商

Accept 接受的数据类型

Accept-Encoding 服务端如何进行数据压缩 什么编码方式

Accept-Language 返回信息语言

User-Agent 判断哪个端(PC 移动)的页面

Content-Type 返回的数据格式

Content-Encoding 服务端具体用了哪种压缩方式

Content-Language 服务端实际返回的语言

X-Content-Type-Options **nosniff **

CSP

内容安全策略 为了减少和报告xss攻击

作用

限制资源获取

报告资源获取越权

default-src 限制全局

制定资源类型

**'Content-Security-Policy: ‘default-src http: https:’ **

有很多配置 还有script-src report-uri 等 具体可以参考MDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值