【Java EE初阶 --- 网络原理】应用层---HTTP(HTTPS)协议
乐观学习,乐观生活,才能不断前进啊!!!
我的主页:optimistic_chen
我的专栏:c语言 ,Java
欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~
文章目录
- 应用层协议
- 自定义协议
- 普遍的协议(HTTP)
- 抓包工具
- HTTP协议
- URL
- urlencode
- 请求方法
- GET方法
- POST方法
- Header
- Cookie
- 状态码
- HTTPS
- 对称加密
- 非对称加密
- 中间人攻击
- 完结
应用层协议
自定义协议
在初识网络中,我们知道TCP/IP分成五层,每一层都涉及到一些关键的协议。应用层是和我们程序员联系最紧密的一层,并且只要涉及到网络通信都基本视为应用层的一部分。而应用层中涉及到的网络通信协议,很多也是程序员自己定制的。
自定制一般分为两个步骤:
1. 根据需求,确定要传输的信息
2. 约定好信息组织的格式
(一般客户端和服务端都按照定制的规则来构造/解析数据)
通常数据的组织格式:
1. 行文本(最原始)
4. xml(可读性好,冗余较多)
5. json(主流方式,可读性好,冗余一般)
6. protobuf(高性能场景下使用,可读性差,冗余最小)
普遍的协议(HTTP)
FTP文件传输,SSH远程操作主机,telnet网络调试工具,HTTP协议
我们重点放在HTTP协议,它属于web开发中最核心的协议,网站都会用到http,我们平时看到最多的可能是它的加强版https,给http加一个安全层
HTTP协议是一问一答模式的协议:
客户端发一个请求,服务端就返回一个响应,请求和响应一一对应。
那就不得不说一个学习工具了,获取网络的数据包,解析格式的抓包工具。其实,抓包工具相当于“代理”,代替客户端完成一些事情
抓包工具
我推荐新手使用fiddler,专门抓http,功能简单,足够新手使用
直接去bin搜索fillder,官网下载
为了满足抓包https,设置中选择,
这里一定要全部选择,并且首次会弹出是否要信任此cookic,一定要选择yes,否则只能卸载重新安装
此时如果去浏览器打开网页,显示“您的链接不是私密链接”,检查你的证书是否受信任,重启fillder ,重启浏览器,即可。
HTTP协议
HTTP协议广泛的使用在web开发和app开发中,它规定了数据传输格式,是一个文本格式的协议,并且之前提到的协议分层在此是一个协议负责一部分工作。
请求格式
响应格式
URL
描述网络上的唯一资源的位置
注意:如果没写端口号,那就是默认取决于协议的端口号,这个端口号不是客户端的,而是要访问服务器的端口号
urlencode
在URL中有一些特殊符号,代表不同的特殊含义。
但是在查询参数部分,万一程序员自定义的一些符号里包含了特殊含义的符号,这就会导致浏览器或者服务器对URL解析失败,那要如何避免这种情况呢?
转义操作,不仅仅是某些特殊符号,对于非英文体系文字都需要转义;只是浏览器平时为了用户看起来方便,显示的是转义之前的字符。但是在抓包工具中,看到的已经是转义后的数据。
转义规则:把数据二进制的内容,每个字节取出来用十六进制表示,前面加 % 即可
请求方法
以什么方法发出请求,代表了此次请求的目的
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINE | 断开连接联系 |
一般来说:请求操作大部分时间都是使用GET和POST操作
GET方法
获取html,获取css,获取js等都是GET操作
获取资源的前提,我们先要了解浏览器的缓存机制,浏览器加载网页速度从快到慢是:CPU>内存>硬盘>网络/服务器
浏览器为了加快访问速度,第一次访问服务器时就会把静态资源(图片、css、js等)先缓存到硬盘上,后续再访问只从硬盘中获取即可。
此外,GET请求一般没有正文,如果要通过GET给服务器发送一些数据,通过查询参数传递
POST方法
登录,上传文件等是POST操作
这种情况基本是请求中带有正文部分,正文中就是上传的数据内容
Header
Host: 表示服务器主机的地址和端口
HTTP协议中,传输的时候可能会涉及到“加密”(HTTPS),URL部分不会被加密,加密的是header和body
HTTP协议在传输层是基于TCP实现的,目的就是把字符串构造成HTTP约定的格式,对TCP来说,一个连接可以有多个请求,服务器就得区分哪一块是一个完整的HTTP请求。
Content-Length:表示body中数据长度,单位是字节;同时也能判断请求总是否有body
对于没有body的http请求,读到空行就结束了;
有body的http请求,先读取首行和header,读到空行,解析Content-Length,根据这里的值,接下来再读取固定字节的长度
**Content-Type:**表示请求中body的格式;提示接收方以此方式解析body中的数据
User-Agent:表示用户使用的设备的浏览器和操作系统的情况
Refere:描述了当前页面的来源
Cookie
浏览器允许网页在本地硬盘存储数据的一种机制,按照键值对的方式来存储数据
最典型的场景就是登录身份认证
以上过程只是浏览器和服务器之间的互动;
注意:Cookie是有可能过期的,服务器返回Cookie时,是可以设置有效时间的,具体还要看网站对安全性的要求高不高。安全性越高,Cookie有效期越短
状态码
此表引用自:HTTP状态码
返回出错原因的关键手段。
最常见的是:
404 Not Found :访问的资源没找到
403 Forbidden:访问被拒绝(无权限)
405 Method Not Allowed:请求的方法和服务器这边声明的注解不匹配
500 Internal Server Error:服务器出现错误
基本我们能看到就这些,其实还有很多,这里不一一列举
总结:
1. 2xx 都可以视为成功
2. 3xx 都是重定向
3. 4xx 客户端出错,用户请求有问题
4. 5xx 服务器出错
HTTPS
HTTPS=HTTP+S(也是应用层协议,专门用于加密)
对称加密
加密和解密使用同一个密钥
对称加密:运算速度快,开销小,适合针对大量数据进行加密
非对称加密
加密使用一个密钥,解密使用另一个密钥。
非对称加密:只能用私钥(公钥)解密公钥(私钥),把公钥公开出去,另一服务器在里面是私钥;实现公钥加密私钥解密,私钥加密公钥解。
非对称加密:运算速度满,开销大,加密小的数据,可以,加密大量数据就不行。
中间人攻击
这个问题的关键在于,客户端无法区分收到的公钥是不是服务器发送的,中间是否经历了修改。想一个办法能够对公钥是否准确进行校验。
证书是服务器由第三方认证机构申请认证的数字证书,一直保存在服务器;包含了证书的颁布机构、证书有效期、服务器公钥、服务器域名、证书的数字签名等信息。
为了验证身份,把证书中这些信息按照一个公式进行计算得到一个数字,称为校验和。第三方机构生成的私钥公钥对这个数字进行加密, 就得到了数字签名。
客户端收到证书后,进行校验:
1. 客户端通过证书中的信息使用同样的公式,得到校验和1
2. 在通过第三方机构的公钥对数字签名进行解密,得到校验和2
3. 对比校验和1和校验和2身份相同,相同:说明证书密钥被修改(安全);不相同:证书无效(不安全)
这里可能有一个疑问,服务器如何确定拿到的pub2是公正机构的pub2呢,或者校验和是否也会受到中间人攻击?
其实,pub2不是通过网络传输的,而是操作系统内置的,只要按照了正版系统,就可以确定安全。
完结
可以点一个免费的赞并收藏起来~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散 ~ ~ ~