ok,前面小编分享了TCP/IP几个分层中,常见的协议。

那么接下来,再分享下关于应用层的协议

对于Java后端开发而言,最常接触的是http/https应用层协议了

那么接下来分别来讲讲这两个东西吧

HTTP(Hypertext Transfer Protocol)

那么什么又是HTTP呢?

HTTP称为超文本传输协议

超文本,那就是说,可以传输文本以外的东西,比如音视频、图片等等

截至目前呢,HTTP有以下这几个版本

HTTP/1.0:属于早期的版本,目前极少数网站中还在使用

HTTP/1.1:使用最广泛的版本,一般访问非https://网站时,使用的是http/1.0

HTTP/2.0:逐渐成为主流的HTTP协议版本,但必须配合https和TLS使用。

HTTP/3.0:最新的HTTP规范,与前面不同的是,它使用的是UDP传输而不是TCP传输

那么接下来,将以最广泛的版本http/1.1,去了解下这个协议

HTTP属于一种”一问一答模型“的协议。

客户端发送一个请求到服务器

服务器返回一个响应到客户端

所以,对于这个,我们去了解请求格式和报文格式即可。

那么在应用层这里呢,会提供一些方式更加容易去了解到报文格式

比如浏览器中开发者工具、服务端日志、抓包工具等方式

那么这里呢,就以抓包工具进行了解。

那什么又是抓包呢?

是网络通信中捕获和分析数据包的过程,用于调试、分析或监控网络流量。

原理简单来说就是通过监听网卡流量或代理转发,捕获经过设备的网络数据包。

抓包也是有范围的,分为本地抓包和远程抓包

本地抓包:捕获本机发出的请求(下面小编给的抓包结果就是本地抓包来的)

远程抓包:捕获服务器或设备间的网络流量(需权限)

那么对于抓包工具有哪些呢?

工具

适用场景

特点

Wireshar

全协议深度分析(TCP/IP底层)

支持过滤、解码复杂协议(如HTTP2),可分析丢包、延时问题

Fiddler

HTTP/HTTPS调试(应用层)

代理模式、自动解密HTTPS,支持修改请求/响应,模拟弱网

tcpdump

Linux服务器命令行抓包

轻量级,适合生产环境抓取原始流量(需结合Wireshark分析)

Charles

移动端/API调试

图形化界面,支持Map Local/Remote、断点调试

那上面涉及到了代理,那么又是代理呢?

代理:是介于客户端和服务端之间的中间服务器,负责转发网络请求和响应。

对于代理来说又分为正向代理、反向代理。

正向代理:代表客户端向服务端发送请求,隐藏客户端身份

反向代理:代表服务端接收客户端请求,隐藏服务端真实架构。

回到正文,现在来分析下请求报文格式

请求

以下内容均由fiddler抓包获取。(至于如何抓包,本文章中最后会分享到)

抓包内容来自搜狗浏览器请求信息

抓包请求格式内容:

请求格式结构分析:

一、首行

GET https://www.sogou.com/ HTTP/1.1

首先分析下内容

https://www.sogou.com/这个

那么这里就有疑问了,既然是先以HTTP为核心来讲解,那么为什么抓包的结果中包含https呢?

其实在目前众多网站中,很少存在http这样的版本了,更多的是https

而两者中,它们的请求报文格式在应用层可谓是大差不差的,同理,响应也是如此。

而差异就在于,https对于安全性要求更高,所以在传输层中,对安全性做了处理。

回到这个https://www.sogou.com/上,这个称作为什么呢?

这个就是称为URL

URL:唯一资源定位符

这是因为网络的资源这么多,要快速的确定一个资源在哪,所以也是要用一个东西去标识它。

这个URL不仅是定位了资源在哪,同时呢,还提供了具体的访问路径和协议

除了这个URL,还有一个东西值得讲的的是URI

URI:唯一资源标识符,用于一个唯一资源去标识一个资源(如网页、文件、服务)

核心作用就是给资源一个全局唯一的”名字“ / “地址。

URL是属于URI的一种。

URL也是有一种基本格式的

对于这个URL,我们其实关注更多的是

1.IP地址

2.端口号

3.层次路径

4.查询字符串

而对于查询字符串这里,也是有一定说法的,目前大多网站对查询字符串会进行url encode

就是对某些特殊字符进行转义,因为你的查询字符串,比如\、@等等,这些在url解析中

存在另外一种信息,所以为了不起冲突,使用url encode进行转义。

对于这个URL就暂时讲到这里

对于首行内容中的HTTP/1.1说明此时协议版本是这个1.1

对于GET呢

这是一个请求方法来的。表示客户端希望从服务器中获取资源。

对于首行,就分享到这里。

二、请求头(header)

请求头内容从第二行到空行结束

里面的内容是以键值对形式来分隔

这些键值对有什么类型,这是由HTTP规定的,对于不同的请求头,对应有着特殊含义

但是呢,具有一定灵活性,可以允许用户自定义一些请求头。

三、空行

此时呢,看到是没有内容的,也是空出一行了,这就叫做空行

值得注意的是,这个Cookie中,里面的东西是不换行,这是因为记事本中自动换行了。

四、正文(Body)

同样的看到这里呢没有正文的,但有些请求也是带有正文的

比如

内容来自洛谷登陆时抓包结果

这里,我们可以观察到,body中是有正文的。

同时我们还注意到,此时的请求方法换成了post

这个post方法,是用来进行提交数据给到客户端,而get方法则是从服务器中获取资源

对于这个post方法使用还有一个常见场景:上传

总结下来,请求的基本格式

1.首行

2.请求头

3.空行

4.正文

接下来看看响应报文是如何的吧

响应

抓包内容来自搜狗浏览器响应信息

一、首行

HTTP/1.1 200 OK

同样也是返回了HTTP/1.1,协议版本信息

200 OK :状态码,以及状态码状态标志为ok

对于状态码,这里也列举中,开发常接触的

2xx(成功)

状态码

名称

应用场景

200

ok

通用成功响应(如GET请求成功返回资源)

201

created

资源创建成功(如POST新增用户后返回新资源URI)

204

No conten

请求成功但无返回内容(如DELETE删除资源成功)

3xx(重定向)

状态码

名称

应用场景

301

Moved Permanently

资源永久重定向(如域名迁移)

302

Found

资源临时重定向(如登录后跳转回原页面)

304

Not Modified

资源未修改(客户端缓存有效)

4xx(客户端错误)

状态码

名称

应用场景

400

Bad request

请求参数错误(如JSON格式错误)

401

Unauthorized

未认证(如未携带Token或Token 过期)

403

Forbidden

无权限访问(如普通用户尝试访问管理员接口)

404

Not Found

资源不存在(如请求的URL路径无效)

405

MethodNot Allowed

HTTP方法不允许(如用GET请求只支持POST的接口)

409

Conflict

资源冲突(如重复创建唯一性约束数据)

5XX(服务端错误)

状态码

名称

应用场景

500

Internal Server Error

通用服务器未捕获的异常

502

Bad GateWay

网关代理错误(如反向代理无法连接客户端)

503

Service Unavailable

服务不可用(如系统维护或过载)

504

GateWay TimeOut

网关超时(如服务器响应超时)

二、响应头

这些响应头也是HTTP规范好的键值对格式,同样的也是允许用户自定义一些响应头

同样也是到空行结束

三、空行

四、正文

注意:正文内容过多,只截出了一部分

那么到这里请求和响应就有一个大概小脉络了

值得注意的的是,首行中HTTP方法,处理GET和POST,还会有一些其他方法

比如PUT:传输文件 DELETE:删除文件

那么接下来再来细讲下请求头和响应头中的里面一些键值对意思

请求头和响应头内容:

Host(主机)

这个就不必多说了,在URL解释那里已经讲解。

Content-Length、Content-Type

这两个的出现,一定是说明,body有内容的

length指的是body数据长度,单位是字节,告诉http数据包到哪结束的

type:指的是body的数据类型,是html,还是json,还是text……

type类型的不同,浏览器也会根据其不同去解析数据

User-Agent

标识客户端类型(操作系统、浏览器及其版本),用于服务端适配响应内容

sec-ch-ua/mobile/platform

作用分别是

精确浏览器品牌和版本,标识是否为移动设备,是哪个操作系统平台

Server

服务器类型

Date

服务器生成响应的时间(用于缓存计算和时间校对)

UUID

唯一请求标识符,用于服务端日志追踪

Referer

这个键,不一定真的有,主要是因为,这个键的作用是描述当前页面在哪个页面跳转过来的。

Cookie

Cookie也是一个键值对格式,使用;分割键值对,=分割键与值,里面的键值对是网站程序员定义的

Cookie是浏览器给网站提供的一种”客户端存储数据的机制“

那么它的用处还是蛮大的

会话管理

作用:维持用户登录状态,避免 每次i请求都需要重新认证

个性化设置

作用:存储用户偏好(如主题、地区、语言)

还有一些其他作用,这里就不在一一展开。

它的内容是来自于服务器的,那么它是如何得到的呢?

对于浏览器保存的cookie,也是手动删除的,删除过后,再次请求,响应就会再次设置cookie

如何手动删除,以edge浏览器为例

点击cookie和站点数据,再次点击cookie

就会显示

就可以进行删除了。

还有一个点,值得注意的是

GET和POST

这两个东西是比较有意思的,就是说POST使用的场景,GET也是可以使用的,GET使用的场景

POST也是可以使用,即POST也可以获取服务器资源,GET也是可以提交数据

但是,这能说它们是一样的嘛?

显然不能,所以牵扯出了一个问题

GET和POST区别

1.语义上的不同

GET表示从服务器获取数据

POST表示往服务器提交数据

2.传递数据方式的不同

GET传递数据往往通过query String(查询字符串)把自定义的数据提交到服务器

POST传递数据往往是通过body把自定义数据提交到服务器

3.关于幂等性

GET方法对应的请求,通常是设计为幂等

而POST方法对应请求,则对幂等性无要求

什么是幂等,通俗的讲,就是按电梯楼层那样,无论是按多少次3楼,电梯最终会到达三楼

对于GET方法来说,即多次请求同一个URL,,只是获取数据,不改变服务器状态。

4.承接幂等性

GET方法设计为幂等性,对应的GET结果那就是可以缓存

对于POST方法来说,如若不设计为幂等性,那么就应该不缓存。

什么承接幂等性??

通常指在系统设计中,通过技术手段确保某个操作的幂等性能够被有效传递和维持

通俗的来说,点外卖支付的时候,因为网络卡顿,点击了两次支付按钮,但此时只会生成一个支付订单,商家也只会收到一个订单

那么到这里呢,http中报文格式就分享到这,接下来讲讲HTTPS

对于HTTPS呢,它的报文格式和HTTP大差不差的,所以这方面就不做过多讲解

HTTPS

这个HTTPS是在HTTP的基础上进行了安全性的加强,所以接下来,我们就对这个安全性进行更多了解

HTTPS是如何对这个安全性做出保障呢?

核心操作就在于”加密“。

那么了解这个加密之前,我们得先了解一些其他名词。

明文:传输的原始数据

密文:对明文进行加密后,让人类不能理解的数据

加密:就是对明文变成密文

解密:就是对密文变成明文

密钥:加密解密的重要辅助工具之一。

那么对于如何加密的呢?

这里介绍了两个加密算法

对称加密

原理:加密和解密使用的相同密钥。

通俗的来说,就是一把钥匙开一把锁。

非对称加密

原理:

分为一对密钥:公钥(public key)和私钥(private key)

公钥:公开给任何人,用于加密

私钥:自己保密,用于解密

通俗的来说,你可以造出很多个”公钥锁“给任何人加密,此时呢,只有你的”私钥锁“能解开。

对于这些对称密钥和非对称密钥,结合以下例子来再次讲解下

假设,小编想和自己的女生表白,此时呢,我发了一条信息给我的女神

那么此时呢,可谓是欲哭无泪呢?

那么假设我此时引入了对称加密

可是现实很骨感,毕竟我加密后的数据,你也要一个密钥进行解密。

所以在传输数据之前,小编的电脑,即客户端,得先发一个密钥给到服务器吧?

但是,黑客已经入侵这个路由器了,所以,我发的密钥也是无用了,毕竟黑客获取到后,拿解密就行了。

那么此时呢,再次引入了非对称加密

此时呢,还得和对称密钥进行配合,对称密钥加密对称密钥,对称密钥进行加密业务数据

那么此时,那么传输数据就安全了吗?

嗯……黑客还是有手段的,黑客使用了中间人攻击。

那么又是中间人攻击呢?

看以下例子

那么中间人攻击又该如何解决呢?

此时,再次引入一个机制:

证书机制

上述的问题就是无法分别服务器发过来的公钥是否正确,而这个证书机制就是为了解决这个问题。

这个证书,是第三方机构进行生成的,所以也是增加一定的安全性。

值得注意的是,证书也是分两种,一个是根证书,一个是中间证书

根证书预装在操作系统或者浏览器中了,中间证书是由根证书进行签发的

整体大致流程如下:

1.服务器申请证书

服务器会把网站域名、营业执照、备案号……作为资料(不包括服务器生成的私钥)提交给证书颁发机构(CA)

CA审核通过后就会把由根证书签发的中间证书(服务器提交资料前就已经生成好了),还有一个服务器证书分发到服务器上,从而构建成一个证书链

注意服务器证书也是由中间证书来签发的。

证书中会包含以下东西:

其中呢,签名尤为重要。

首先对于原始数据使用一种安全的哈希算法生成一个固定长度的哈希值(称为摘要),这个哈希值是唯一的

CA使用私钥进行哈希值加密,加密完成后,称为了签名

最后把签名附加到证书上。

2.验证

由于客户端向服务器请求数据,所以服务器会返回一个证书链给到客户端验证。

证书链包括服务器证书和中间证书

此时呢,利用客户端存在的根证书进行解密验证中间证书是否是正确的

同样利用中间证书的公钥进行服务器签名进行解密,验证证书是否正确。

然后再次验证其他的,比如域名和有效期等

全部通过后,就会信任服务器的公钥(此公钥放在了服务器证书上)

可以通俗的理解为

小编身份证(服务器证书)由公安局签发

公安局(中间CA):它的证书由国家签发

国家(根CA):根证书预装在了操作系统和浏览器中

验证过程:

别人检查小编的身份证——>确认公安局的合法性——>确认国家的权威,最终相信小编的合法身份。

那么到这里https一些安全性,就分享到这。

如何安装fiddler?

访问官网

Web Debugging Proxy and Troubleshooting Tools | Fiddler

下滑找到这里

点击For more information on Fiddler Classic, click here.

点击here

下滑找到这里

点击try for free

q

填入相关信息后,点击下载即可

为了可以正确抓取https包

打开软件

点击tools

点击options

点击options

把所有选项点击上

此时,点击后,会弹出一个证书安装,这里小编安装过了,所以就没有了

遇到这个证书安装,一定点击,否则就无法正确抓取https包

fiddler界面中

请求报文中,点击raw就可以看到原始信息

响应报文中

编辑先点击最上面,进行转码,再点击raw就可以看到原始响应报文信息。

完!

文章作者: 南汐
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 www.phblog.cloud
JavaSE JavaSE
喜欢就支持一下吧