Linux网络应用层协议之http/https
文章目录
目录
一、http协议
1.URL
2.http协议格式
3.http的方法
4.http的状态码
5.http常见header
6.实现一个http服务器
二、https协议
1.加密
2.为什么要加密
3.常见的加密方式
对称加密
非对称加密
4.https的工作过程探究
方案1 只使用对称加密
方案2 只使用非对称加密
方案3 双方都使用非对称加密
方案4 非对称加密+对称加密
中间人攻击
引入证书
CA认证
方案5 非对称加密+对称加密+证书认证
https的整个工作流程
小结
总结

再谈协议
协议是一种"约定",socket api的接口,在读写数据时,都是按照"字符串"的方式来发送接收的,如果要传输一些"结构化的数据"。在这种情况下,只要保证,一方发送时构造的数据,在另一端能够正确的进行解析。这种约定,就是应用层协议。
1.网络版本计算器例子
例如,现在要在服务器端实现一个加法器,客户端将要计算的两个数发送,然后由服务器进行计算,最后再把结果返回给客户端。
约定方案1:
- 客户端发送一个"1+2"的字符串
- 这个字符串中有两个操作数,都是政协
- 这两个数字之间会有一个字符 只能是"+"
- 数字和运算符之间没有空格
约定方案2:
- 定义结构体来表示我们要交互的信息
- 发送数据时候,将结构体按照一个规则转换成字符串,接收到数据再按照相同的规则把字符串转化为结构体
- 这个过程称为"序列化”和“反序列化"
typedef struct Request{
int a;
int b;
}Request;typedef struct Response
{int sum;}Response;// client.c 客户端核心代码
Request request;
Response response;scanf("%d,%d", &request.a, &request.b);
write(fd, request, sizeof(Request));
read(fd, response, sizeof(Response));// server.c 服务端核心代码
Request request;
read(client_fd, &request, sizeof(request));
Response response;
response.sum = request.a + request.b;
write(client_fd, &response, sizeof(response));
一、http协议
虽然应用层协议程序员可以自定义,但是有一些现成的又很好用的协议,http是超文本传输协议。
1.URL
平时,我们称呼的网址,就是url。如:
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#chi1
其中,http是协议方案名称,user:pass为登录信息,www.example.jp是ip,80是端口,/dir/index.htm?带层次的文件路径,uid=1查询字符串,#ch1片段标识符
其中,/ ? :这样的字符,以及被url当作特殊字符,因此这些字符不能随意出现。如果某个参数中,需要带这样的字符,就必须先对特殊字符进行转义
2.http协议格式
1)http请求
首行:【方法】+【URL]+【版本】
POST
HOST
connection
content-length
cath-control
origin
upgrade-insecure-requests
content-type
user-agent
accept
referer
accept-encoding
accept-language
cookie
2)http响应
首行: [版本号] + [状态码] + [状态码解释] Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中
HTTP/1.1 200 OK
SERVER
CONTENT-TYPE
CONTENT-LANGUAGE
TRANSFER-ENCODING
DATE:
3.http的方法
| 方法 | 说明 | 支持的http协议版本 |
| GET | 获取资源 | 1.0,1.1 |
| POST | 传输实体主体 | 1.0,1.1 |
| PUT | 传输文件 | 1.0,1.1 |
| HEAD | 获得报文首部 | 1.0,1.1 |
| DELETE | 删除文件 | 1.0,1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径 | 1.1 |
| CONNECT | 要求用隧道协议连接代理 | 1.1 |
| LINK | 建立和资源之间的关系 | 1.0 |
| UNLINE | 断开连接关系 | 10 |
4.http的状态码
| 类别 | 原因 | |
| 1xx | Informational(信息性状态码) | 接收的请求正在处理 |
| 2xx | SUCCESS | 请求正常处理完毕 |
| 3xx | Redirection(重定向状态码) | 需要进行附加操作完成请求 |
| 4xx | CLIENT ERROR(客户端错误状态码) | 服务器无法处理请求 |
| 5xx | SERVER ERROR(服务器错误状态码) | 服务器处理请求出错 |
200(ok),404(Not Found),403(FORBIDDEN),302(redirect),504(BAD GATEWAY)
5.http常见header
- CONTENT TYPE:数据类型(text,html)
- CONTENE LENGTH:body的长度
- Host:客户端告诉服务器,请求的资源在哪个主机的哪个端口
- User-Agent:声明用户的操作系统和浏览器版本信息
- referer:当前页面是从哪个页面跳转的
- location:搭配3xx状态码使用,告诉客户端接下来去哪里访问
- cookie:用于在客户端存储少量信息,通常用于实现会话session功能
6.实现一个http服务器
见gitee:地址https://gitee.com/a_young
二、https协议
https也是一个应用层协议,在http的基础上引入了一个加密层。
http协议都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。
1.加密
加密就是把明文(要传输的信息)进行一系列变换,生成密文
解密就是把密文再进行一系列变换,还原成明文
在这个加密和解密的过程中,往往需要一个或多个中间数据,辅助这个过程,这样的数据称为密钥。
2.为什么要加密
由于我们通过网络传输的任何数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析出你传输数据的内容,并进行篡改。
比如,使用某款音乐app下载某首歌,此时点击下载按钮,其实就是给服务器发送了一个http请求,获取到的http响应其实就包含了该首歌的下载链接,运营商劫持之后,发现这个请求是下载歌,那么就自动将给用户的响应篡改,篡改成下载别的恶意软件的下载地址。
所以,因为http的内容是明文传输,明文数据通过路由器,wifi热点,通信服务运营商,代理服务器等多个节点,如果信息在传输过程中被劫持,传输的内容就完全被暴露,劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击,所以需要对信息进行加密。
3.常见的加密方式
对称加密
- 采用单钥密码系统的加密方法:同一个密钥可以同时用作对信息的加密和解密,这种加密方法称为对称加密,也成为单密钥加密,特征:加密和解密所用的密钥是相同的
- 常用的对称加密算法:DES,3DES,AES,TDEA,BLOWFISH,RC2等
- 特点:算法公开,计算量小,加密速度快,效率高
- 一个简单的对称加密,按位异或:
假设明文a = 1234,密钥key =8888
则加密a^key得到密文b为9834
然后针对密文9834再次b^key,得到原来的明文1234
非对称加密
需要两个密钥进行加密和解密,这两个密钥简称公钥和私钥
常见非对称加密算法:RSA,DAS,ECDSA
特点:算法强度复杂,安全性依赖于算法,但是算法过于复杂,解密速度没有对称加密解密的速度快
公钥和私钥是配对的,可以正,反两用,比如:
1.通过公钥对明文加密,变成密文;通过私钥对密文解密,变成明文
2.通过私钥对明文加密,变成密文;通过公钥对密文解密,变成明文
比如: A 要给 B ⼀些重要的⽂件, 但是 B 可能不在. 于是 A 和 B 提前做出约定:
B 说: 我桌⼦上有个盒⼦, 然后我给你⼀把锁, 你把⽂件放盒⼦⾥⽤锁锁上, 然后我回头拿着钥匙来开锁 取⽂件。
在这个场景中, 这把锁就相当于公钥, 钥匙就是私钥. 公钥给谁都⾏(不怕泄露), 但是私钥只有 B ⾃⼰持 有. 持有私钥的⼈才能解密。
4.https的工作过程探究
方案1 只使用对称加密
如果通信双方各自持有一个密钥x,且没有别人知道,这两方的通信安全当然可以被保证(除非密钥被破解)。引入对称加密,即使数据被截获,但是黑客不知道密钥,因此无法进行解密,也就不知道请求。但是实际上,服务器同一时刻其实是给很多客户端提供的,客户端每个人的密钥都必须是不同的(如果相同就很容易扩散,黑客可以轻易获取),因此服务器就需要维护每个客户端和每个密钥之间的关联联系,这也是很费事的事情。
比较理想的做法,就是在客户端和服务器建立连接的时候,双方协商确定这次的密钥,但是如果将密钥明文传输,那么黑客也就可以获得密钥,此后的加密操作没有意义。
因此密钥也需要加密传输,但是这就形成了一个先有鸡还是先有蛋的问题,密钥的密钥......
方案2 只使用非对称加密
鉴于非对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传输数据前都先用这个公钥加密好再传,从客户端到服务器信道似乎是安全的(实际有安全问题),只有服务器有相应的私钥能解开公钥加密的数据。
如果服务器用它的私钥加密数据传输给浏览器,那么浏览器用公钥可以解密,二这个公钥是一开始通过明文传输给浏览器的,若这个公钥被中间人劫持,那么它也能用该公钥解密服务器传来的信息了。
方案3 双方都使用非对称加密
1. 服务端拥有公钥S与对应的私钥S',客⼾端拥有公钥C与对应的私钥C'
2. 客⼾和服务端交换公钥
3. 客⼾端给服务端发信息:先⽤S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥 S'
4. 服务端给客⼾端发信息:先⽤C对数据加密,在发送,只能由客⼾端解密,因为只有客⼾端有私钥 C'
这样貌似也⾏啊,但是 效率太低 依旧有安全问题
方案4 非对称加密+对称加密
先解决效率问题
- 服务器端具有非对称公钥S和S'
- 客户端发起https请求,获取服务器端公钥S
- 客户端在本地生成对称密钥C,通过公钥S加密,发送给服务器
- 中间的网络设别没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥
- 服务器通过私钥s'还原出客户端发送的对称密钥C,并且使用这个对称密钥加密给客户端返回的响应数据
- 后续客户端和服务器之间的通信都使用对称加密即可,由于该密钥只有客户端和服务器两个主句知道,其他主机和设备不知道密钥即使截获也没有意义
- 这个方案仍旧有一个问题:如果中间网络一开始就攻击
中间人攻击
- 服务器具有非对称加密算法的公钥S,私钥S'
- 中间人具有非对称加密算法的公钥M,私钥M'
- 客户端向服务器发起请求,服务器明文传送公钥S给客户端
- 中间人劫持数据报文,提取公钥S并且保存,然后将劫持报文中的公钥S替换成自己的公钥M,并伪造报文发送给客户端
- 客户端收到报文,提取报文M(客户端此时不知道公钥被替换),自己形成对称密钥X,用公钥M加密X,形成报文发送给服务器
- 中间人劫持后,直接用私钥M'解密,得到通信密钥X,再用曾经保存的服务端公钥S加密后,将报文推送给服务器
- 服务器拿到报文,用自己的私钥S'解密,得到通信密钥X
- 双方开始采用X进行对称加密,进行通信。但是一切都在中间人的视角内进行。
- 这个方案的本质问题就是,客户端无法确定收到含有公钥的数据报文,就是目标服务器发送过来的。
引入证书
CA认证
服务端在使用HTTPS之前,需要向CA机构申请一份数字证书,数字证书里含有证书申请者信息、公钥信息等。服务器把证书传给浏览器,浏览器从证书里获得公钥即可。证书就如身份证,证明服务端公钥的权威性。
这个证书可以理解成一个结构化的字符串,里面包含了一下信息:证书发布机构,证书有效期,公钥,证书所有者,签名,...
申请证书的时候,需要在特定平台生成,同时生成一对密钥,即公钥和私钥
方案5 非对称加密+对称加密+证书认证

https的整个工作流程
客户端建立https请求,服务器端确认加密,返回客户端数字证书。
客户端证书合法校验,如果非法,进行提示,如果合法,随机生成密钥R,用证书中的公钥加密R
客户端向服务端传送加密后的R,服务器收到后进行解密,获取R,使用R加密网页内容,返回加密的网页内容,客户端使用R解密网页内容。
小结
https工作过程中涉及到的密钥有三组:
第一组:非对称加密 用于校验证书是否被篡改,服务器持有私钥(私钥在形成CSR文件与申请证书时获得),客户端持有公钥(OS包含可信任的CA认证机构有哪些,同时持有对应公钥),服务器在客户端的请求后,返回携带签名的证书,客户端通过这个公钥进行验证,保证证书的合法性,确认服务端公钥的权威性
第二组:非对称加密 用于协商生成对称加密的密钥,客户端收到ca中的公钥是被信任的,给随机生成的对称加密的密钥加密,传输给服务器,服务器通过私钥获取多对称加密密钥
第三组:对称加密:客户端和服务器后续的传输过程都通过对称密钥加密解密
总结
相关文章:
Linux网络应用层协议之http/https
文章目录 目录 一、http协议 1.URL 2.http协议格式 3.http的方法 4.http的状态码 5.http常见header 6.实现一个http服务器 二、https协议 1.加密 2.为什么要加密 3.常见的加密方式 对称加密 非对称加密 4.https的工作过程探究 方案1 只使用对称加密 方案2 只使…...
LLM(四)| Chinese-LLaMA-Alpaca:包含中文 LLaMA 模型和经过指令微调的 Alpaca 大型模型
论文题目:《EFFICIENT AND EFFECTIVE TEXT ENCODING FOR CHINESE LL AMA AND ALPACA》 论文地址:https://arxiv.org/pdf/2304.08177v1.pdf Github地址:https://github.com/ymcui/Chinese-LLaMA-Alpaca 一、项目介绍 通过在原有的LLaMA词…...
虚拟机CentOS 8 重启后不能上网
情况说明:原本虚拟机是可以上网的,然后嘚一下,重启后,连接不上网络,完了,上网查找一堆质料,我的连接方式是桥接模式(复制物理网络连接状态)。 好,有人说是vmn…...
让AI拥有人类的价值观,和让AI拥有人类智能同样重要
编者按:2023年是微软亚洲研究院建院25周年。25年来,微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式,并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来,微软亚洲研究院致力于创造具有…...
《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
在检查程序报错除了断点调试,生成log日志,还有种直接的方法,调试dump文件,该调试方法可以在运行exe程序崩溃时进行调试。文章末尾有下载链接。 头文件 #include "crashdump.h"在mainWindow或主程序最开始处加下面代码…...
ROS stm32 CAN通信
文章目录 运行环境:原理1.1 ros中的代码1)socketcan_bridge2)测试的ros-python包3)keil5中数据解析4)USB-CAN连接5)启动指令 运行环境: ubuntu18.04.melodic STM32:DJI Robomaster C板 ROS:18.04 硬件:USB-CAN&#x…...
简单地聊一聊Spring Boot的构架
前言 本文小编将详细解析Spring Boot框架,并通过代码举例说明每个层的作用。我们将深入探讨Spring Boot的整体架构,包括展示层、业务逻辑层和数据访问层。通过这些例子,读者将更加清晰地了解每个层在应用程序中的具体作用。通过代码实例&…...
【算法】复习搜索与图论
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙请不要相信胜利就像山坡上的蒲公英一样唾手…...
【KCC@南京】KCC南京数字经济-开源行
一场数字经济与开源的视听盛宴,即将于11月26日,在南京举办。本次参与活动的有: 庄表伟(开源社理事执行长、天工开物开源基金会执行副秘书长)、林旅强Richard(开源社联合创始人、前华为开源专家)…...
苍穹外卖-day11
苍穹外卖-day11 课程内容 Apache ECharts营业额统计用户统计订单统计销量排名Top10 功能实现:数据统计 数据统计效果图: 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生…...
git_07_协同开发
1.作业回复 干的什么事?动了哪些东西? 文档作业xxx文档已编写完成,相关svn目录:xxx/xxx/xxx代码作业(Git代码提交规范)具体什么问题,影响范围,是否已经解决: feat(xxx):改动描述 perf(xxx):改动…...
对比国内主流开源 SQL 审核平台 Yearning vs Archery
Yearning, Archery 和 Bytebase 是目前国内最主流的三个开源 SQL 审核平台。其中 Yearning 和 Archery 是社区性质的项目,而 Bytebase 则是商业化产品。通常调研 Bytebase 的用户也会同时比较 Yearning 和 Archery。 下面我们就来展开对比一下 Yearning 和 Archery…...
Mistral 7B 比Llama 2更好的开源大模型 (三)
Mistral 7B 比Llama 2更好的开源大模型 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7B在所有评估的基准测试中都优于最好的开放13B模型(Llama 2),在推理、数学和代码生成方面也优于最好的发布34B模型(Llama 1)。Mistral 7B模型利用分组查询注…...
关于 Git 你了解多少?
1. 什么是Git? Git 是一个版本控制系统,由林纳斯托瓦兹创建。它旨在管理项目代码的更改,以便团队成员可以协作开发和维护代码库。Git 可以让用户跟踪代码的更改、回滚错误的更改、合并代码等。Git 还具有分支和标签的功能,使得团队成员可以在…...
关于Elasticsearch的自动补全、数据同步和集群,以下是相关的知识点
1. 自动补全:Elasticsearch可以通过自动补全功能帮助用户快速查找相关的内容。它使用了一种称为“completion suggester”的功能来实现自动补全,是一种基于前缀的建议查询,可以在用户输入时提供实时建议。 2. 数据同步:Elasticse…...
linux套接字-Socket
1.概念 局域网和广域网 局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。IPInternet Protocol)&#…...
debian 修改镜像源为阿里云【详细步骤】
文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…...
从0到0.01入门React | 004.精选 React 面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
Linux 本地zabbix结合内网穿透工具实现安全远程访问浏览器
前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…...
【以图会意】文件系统从外存到内存到用户空间
首先,在文件目录中,装有很多块FCB,由文件名和i指针两部分构成,指针指向文件所在的索引结点,包含了例如:文件存储权限,文件长度等一系列文件的信息,最重要的当然是物理地址࿰…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
