说说个人对http的了解

Posted Java开发小驿站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说说个人对http的了解相关的知识,希望对你有一定的参考价值。

什么是http,什么是无状态,怎么解决

http是超文本传输协议,可以在两点之间传递文本、图片、音频、视频等等内容;

http本身是无状态的,客户端对于http事务是无记忆的,也就是说客户端多个http之间的调用其实没有任何关系,也不会保存用户的操作记录;

可以通过cookie来添加事务的记忆;在当今前后端分离非常主流的场景下,可以采用jwt的token机制来添加用户标识,其中cookie只能在本域或子域当中有效,token则支持跨域;

get与post 的区别

get和post的区别在各大论坛其实众说纷纭;

有人认为没啥区别,有人认为使用方式大不相同;

以下是我个人观点:

从使用的角度

  • get 一般旨在于向服务器拉取的方式,而post则表明是向服务器推送数据;

  • get 发送一个数据包,而post会发送两个(就是要跑两趟,任性);

  • get 请求的数据是会被浏览器自动缓存的,post不会(也可以手动缓存);

  • get 多次重复提交,理论上对于服务是无害的,而post在某些场景下需要避免重复消费问题;

透过现象看本质

通过上面的对比,可以发现,很多东西都只是表面上不一样,实际上也是可以让他们一样的,比如:

  • 是拉数据还是提交数据,我也可以使用get提交数据,也可以使用post拉取数据;

本质上,他们都是通过建立tcp连接来完成数据的交互,本质上还是tcp,该握手还是握手,该道别还是道别,通过定义get和post来敲定一个约定,大家一起去遵守,让一切看起来井然有序,就好像快递公司运小件,物流公司运大件;

tcp 三次握手

tcp建立连接会经过三次握手:

(此处偷个图,哈哈哈)

  • 客户端发送一个SYN报文加一个随机数x;

  • 服务端接收到SYN报文,将x+1,生成一个随机数y,返回一个SYN-ACK报文;

  • 客户端接收到SYN-ACK报文,校验x,将y+1,向服务端发送一个ACK,服务端接收到ACK,建立连接;

注:

SYN=> Synchronize Sequence Numbers 同步序列编号

ACK => Acknowledge characte 确认字符

tcp 四次挥手

握手才三次,挥手却要四次?

说说个人对http的了解

  • 客户端发起断开连接,发送一个FIN报文给服务端,我要断开连接啦,然后进入到FIN_WAIT_1的等待状态;

  • 服务端收到之后,给客户端返回一个ACK表示我晓得了,但是我事还没干完,你再等等;客户端收到之后就进入FIN_WAIT_2状态,那我就再等等咯;

  • 服务端在完成手头工作之后,给客户端发送一个FIN报文,表明,ok啦,我也搞完了,可以关闭咯;

  • 客户端接收到FIN之后,给服务回一个ACK,表明已收到,可以关闭,客户端关闭连接;服务端收到ACK之后,那就see you next time;

说一说四层、五层、七层网络模型

四层

  • 应用层

  • 传输层

  • 网络层

  • 网络接口层

五层

五层在4层的基础上把网络接口层裁缝成了链路层和物理层;

  • 应用层

  • 运输层

  • 网络层

  • 链路层

  • 物理层

七层

七层则是在运输层前添加了表现层和会话层

  • 应用层

  • 表现层

  • 会话层

  • 运输层

  • 网络层

  • 链路层

  • 物理层

http和https的区别

httpshttp的基础上套了一层SSL/TLS,在tcp握手的过程当中加了一系列的证书,加密操作;

所以在使用上,https安全的,可以防止恶意拦截和篡改。

握手图如下(偷来的)

TLS完整流程如下

  • (1) 客户端开始新的握手,并将自身支持的功能提交给服务器。

  • (2) 服务器选择连接参数。

  • (3) 服务器发送其证书链(仅当需要服务器身份验证时)。

  • (4) 根据选择的密钥交换方式,服务器发送生成主密钥的额外信息。

  • (5) 服务器通知自己完成了协商过程。

  • (6) 客户端发送生成主密钥所需的额外信息。

  • (7) 客户端切换加密方式并通知服务器。

  • (8) 客户端计算发送和接收到的握手消息的MAC并发送。

  • (9) 服务器切换加密方式并通知客户端。

  • (10) 服务器计算发送和接收到的握手消息的MAC并发送。


本文参考链接如下


TLS握手协议详解: https://www.jianshu.com/p/81efc02b2f29

以上是关于说说个人对http的了解的主要内容,如果未能解决你的问题,请参考以下文章

[ECMAScript] 说说你对Babel的了解?

说说个人对算法的理解(老物)

说说 HeapSort 堆排序思想,以及个人优化方案。(老物)

json 个人的vscode的代码片段

massCode 一款优秀的开源代码片段管理器

说说自己对RESTful API的理解s