全网最详细的HTTP 协议总结!请收藏!

点击上方 java项目开发选择 设为星标javascript

优质项目,及时送达html

-----前端

Http 协议基础

经典五层模型

应用层——传输层——网络层——数据链路层——物理层vue

  1. 物理层主要做用是定义物理设备如何传输数据,指代物理硬件java

  2. 数据链路层在通讯的实体间创建数据链路链接,基本计算机二进制传输react

  3. 网络层为数据在节点之间传输建立逻辑链路web

  4. 传输层为 TCP 或 UDP,能够想象为一条管道spring

  5. 应用层为 HTTP,能够想象为一个包数据库

基本概念:一个 tcp 能够发送多个 http 请求,一个 http 请求必须在一个 tcp 链接里json

http 发展历史

http/0.9

  • 只有一个命令 GET

  • 没有 HEADER 等描述数据的信息

  • 服务器发送完毕,就关闭 TCP 链接

http/1.0

  • 增长了不少命令,POST,PUT

  • 增长了 status code 和 header

  • 多字符集支持、多部分发送、权限、缓存等

http/1.1

  • 支持了持久链接

  • pipeline,管道化

  • 增长 host 和其余一些命令

http2

  • 全部数据以二进制传输,摆脱原来的字符串

  • 同一个链接里面发送多个请求再也不须要按照顺序来,并行

  • 头信息压缩以及推送等提升效率的功能,服务端能够主动发送信息,提高性能

三次握手

http 不存在链接,只有请求和响应TCP 链接能够发送多个 http 请求,TCP 链接有三次握手网络请求的消耗

  1. 客户端发送链接数据包

  2. 服务端开启 TCP SOCKET,再给客户端发送数据包

  3. 客户端拿到数据包,再给服务端发送确认数据包

第三次是为了不第二次握手丢失,致使服务端一直开启端口链接

URI——URL 和 URN

URI

统一资源标志符/Uniform Resource Identifier

  • 用来惟一标识互联网上的信息资源

  • 包括 URL 和 URN

URL

统一资源定位器/Uniform Resource Locator

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

  • http 协议

  • user:pass 用户认证,基本用不到

  • host.com 定位服务在互联网上的位子,能够为 IP 或者域名

  • 80 端口,web 服务,物理服务器上多个 web 服务,不带端口默认访问 80

  • path 路由,web 服务上具体的内容

  • query 搜索参数,如何进行搜索和查找,传参

  • hash 锚点定位工具

此类格式的都叫作 URL,好比 http,ftp 协议

URN

永久统一资源定位符

  • 在资源移动以后还能被找到

  • 目前尚未很是成熟的使用方案

http 报文格式

起始行

  • 请求报文:GET /text/test.txt HTTP/1.0

  • 响应报文:HTTP/1.0 200 OK

头部

  • 请求头:Accept:text/* Accept-Language:en,fr

  • 响应头:Content-type:text/plain Content-length:19

主体

  • 请求体:参数

  • 响应体:返回的数据

HTTP 的方法

  • 用来定义对于资源的操做

  • 经常使用有 GET,POST 等

  • 从定义上讲有各自的语义

HTTP CODE

  • 定义服务器对请求的处理结果

  • 各个区间的 CODE 有各自的语义

    • 100-199 还须要一些操做才能发送请求

    • 200-299 操做成功

    • 300-399 重定向

    • 400-499 发送的请求有问题 401 认证 403 被拒绝 404 找不到

    • 500-599 服务端问题

  • 好的 HTTP 服务能够经过 CODE 判断结果

建立一个简单的 web 服务

const http = require("http");http .createServer(function(req, res) { console.log("req come", req.url);
res.end("123"); }) .listen(9999);

HTTP 各类特性

CORS 跨域请求的限制与解决

浏览器对于非同域的请求会拦截,请求仍是会发送,后台服务返回内容,可是浏览器会拦截掉并报错

简单请求

  • 容许方法仅为 GET,HEAD,POST

  • Content-Type 仅为 text/plain,multipart/form-data,application/x-www-form-urlencoded

  • 请求头限制,仅部分固定请求头容许

  • XMLHttpRequestUpload 对象均没有注册任何事件监听器

  • 请求中没有使用 ReadableStream 对象

res.writeHead(200, { "Access-Control-Allow-Origin": "*"});

预请求

先经过 OPTION 请求访问服务端,返回告诉浏览器容许接下来发送的 POST 请求,浏览器就不会拦截

res.writeHead(200, { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "", //容许的请求头 "Access-Control-Allow-Methods": "", //容许的请求方法 "Access-Control-Max-Age": "" //预请求不需option验证的最大时间});

jsonp

<script src="http://127.0.0.1:8888" />

Cache-Control

  • public 任何地方均可以进行缓存

  • private 只有发起请求的浏览器进行缓存

  • no-cache 本地能够存缓存,但须要后台验证事后才能使用

  • max-age 秒数,缓存存在的最大时间

  • s-maxage 秒数,在代理服务器,会代替 max-age

  • max-stale 秒数,发起请求主动带的头的到期时间

  • must-revalidate 从新验证

  • proxy-revalidate 用在缓存服务器上,必须从新验证

  • no-store 不存储缓存

  • no-transform 用在代理服务器,不改动返回内容

http .createServer(function(req, res) { res.writeHead(200, { "Content-Type": "text/javascript", "Cache-Control": "max-age=20" //会取缓存的内容,请求不会发送到服务器 }); res.end("123"); }) .listen(9999);

通常缓存会是一个比较长的时间,这就致使服务端更新内容,客户端却仍是取老的静态资源。如今经常使用的方法是每次打包时在静态路径上添加一个 hash 码,hash 码根据文件改变而来,这样浏览器访问静态资源时就会重新请求。

缓存验证 Last-Modified 和 Etag 的使用

有 Cache-Control 的状况下

验证头

Last-Modified上次修改时间,给资源设置上一次什么时候修改配合 if-Modified-Since 或者 if-Unmodified-Since 使用对比上次修改时间判断是否须要更新

Etag数据签名,数据惟一标识,数据修改,那么签名会不同配合 if-Match 或者 If-Non-Match 使用对比资源的签名判断是否使用缓存

//服务端进行etag的验证const etag=req.headers['if-none-match']if(etag==='777'){ res.writeHead(304,{ 'Cache-Control':'max-age=200000,no-cache', 'Last-Modified':'123' 'Etag':'777' }) res.end('')}) else { res.writeHead(200,{ 'Cache-Control':'max-age=200000,no-cache', 'Last-Modified':'123' 'Etag':'777' }) res.end('123')}

Cookie 和 Session

Cookie

在服务端返回数据时,经过 Set-Cookie 保存在浏览器,浏览器下次在同域的请求中会在头带上 Cookie,

  • 经过 Set-Cookie 设置

  • 下次请求会自动带上

  • 键值对,能够设置多个

  • max-age 和 expires 设置过时时间

  • Secure 只在 https 的时候发送

  • HttpOnly 没法经过 document.cookie 访问

const host = req.headers.hostconst html=fs.readFileSync('test.html'.'utf8')if (host === "test.com") { res.writeHead(200, { "Set-Cookie": ["id=123;max-age=2", "abc=456;HttpOnly;domain=test.com"] //此时test.com下的全部二级域名均可以访问到cookie })}res.end('html')

Session

常常作法是将保存在 session 中的用户惟一 ID 存入 Cookie,下次请求时拿到 Cookie,经过 Cookie 在 Session 拿到用户信息,进行操做。

Http 长链接

http1.1 默认是长链接, 是在 tcp 上顺序发送请求,浏览器 tcp 并发限制为 6,就是同时能够存在 6 个链接。因此浏览器加载首页时,先建立 6 个 TCP 链接,而后 http 是在这六个链接中顺序发送的。

数据协商

客户端在发送请求时,限定须要拿到的数据格式,内容等。服务端根据这些限制来操做,服务端不必定按照规定返回。请求

  • Accept 想要的数据类型

  • Accept-Encoding 数据编码方式进行传输,限制服务器对数据的压缩方式

  • Accept-Language 但愿展现的语言

  • User-Agent 浏览器的相关信息返回

  • Content-Type 实际返回的数据格式

  • Content-Encoding 对应 Accept-Encoding,声明传输方式

  • Content-Language 返回的语言

重定向

经过 URL 访问资源时,服务器告诉浏览器资源换位子了,并告诉新的位置,浏览器再请求新的位置,301 永久变动,302 暂时变动,301 的返回会在缓存中提取

if (req.url === "/old") { res.writeHead(302, { Location: "/new" }); res.end("");}if (req.url === "/new") { res.writeHead(200, {}); res.end("1234");}

Content-Security-Policy

内容安全策略

  • 限制资源获取

  • 报告资源获取越权

  • default-src 限制全局

  • 指定资源类型

res.writeHead(200, { //仅容许http和https "Content-Security-Policy": "default-src http:https:", //仅容许本站脚本 "Content-Security-Policy": "default-src 'self'", //限制特定类型 "Content-Security-Policy": "script-src http:https:" //汇报 "Content-Security-Policy": "script-src ; report-uri /report"})res.end("123")
- END -

推荐案例

温暖提示

为了方便你们更好的学习,本公众号常常分享一些完整的单个功能案例代码给你们去练习, 若是本公众号没有你要学习的功能案例,你能够联系小编(微信:xxf960513)提供你的小需求给我,我安排咱们这边的开发团队免费帮你完成你的案例。
注意:只能提单个功能的需求不能要求功能太多,好比要求用什么技术,有几个页面,页面要求怎么样?


请长按识别二维码

想学习更多的java功能案例请关注

Java项目开发

若是你以为这个案例以及咱们的分享思路不错,对你有帮助,请分享给身边更多须要学习的朋友。别忘了《留言+点在看》给做者一个鼓励哦!

本文分享自微信公众号 - web项目开发(javawebkaifa)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索