序言
在学习Http的时候,走了不少弯路,开始以为是简单的百度出来,看看别人的博客就行了,结果发现基本上都是第三手、第四手资源,里面讲的东西还是停留于几年前,这让我这个小白无从下手,最终直接去了MDN官网翻翻东西。
Http简介
Http又称超文本传输协议,是用于传输例如HTML的超媒体文档的应用层协议,主要用于浏览器与web服务器之间的通信。HTTP是无状态协议,即服务器不会在两次请求之间保留任何数据,但使用Cookies可以创建有状态的会话。。
客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫做 requests,被服务端回应的消息叫做 responses。
TCP/IP 三次握手
HTTP 的传输协议是 TCP/IP 协议,该协议连接是需要进行三次握手的。
大白话:
那么为什么需要三次握手?这里引用知乎上的一个回答:
这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信 是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.
官方语言上的三次握手步骤:
- 客户端发送 SYN 报文给服务器端,进入 SYN_SEND 状态。 —— 客户端向服务器端发送消息,请求它的回应。
- 服务器收到 SYN 报文,回应一个 SYN ACK 报文,进入 SYN_RECV 状态。 —— 服务器端收到消息,采取回应行为,回复消息告诉客户端收到了。
- 客户端收到服务器 SYN 报文,回应一个 ACK 报文,进入连接状态。 —— 客户端收到消息,这时客户端收到响应,表明发送的数据有回信了。但是服务器端发送了回应却还不知道客户端有没有收到。这时客户端需要再次发送消息告诉服务器我收到了。服务器收到消息后,客户端和服务器都知道对方已准备好通讯,然后就开始连接通讯了。
Http的request和response
-
request
请求为客户端发送给服务器的数据。具体有如下数据:- 请求方法:如 GET、 POST 这类请求方法。
- 要获取的资源路径。
- HTTP协议版本号。
- Headers:传递附加信息。
- body:如果想 POST 请求,就会传递 body 资源数据给服务器。
-
response
响应为服务器收到客户端发送数据返回的数据,具体有如下数据:- HTTP协议版本号。
- 状态码(status code)。
- 状态消息(status message)。
- Headers:传递附加信息。
- body: 响应返回的资源存在body中。一般返回图片、HTML等资源。
-
Headers 头文件
头文件允许客户端和服务器通过请求和响应传递附加信息。
下面列出一些常用的消息头及其用法:- Date 信息来源的日期时间
- Content-Type 指定服务器文档的MIME类型,帮助用户代理去处理接收到的数据。
- Content-Length 表示 body 的字节长度。
- Host 服务器的域名。
- User-Agent 可以用来识别发送请求的浏览器,是产品标记符和注释的清单。
- Accept 用户代理期望的MIME类型列表
- Accept-Encoding 列出用户代理支持的压缩方法
- Accept-Ranges 期望范围。参数:byte、none。
- Assess-Control-Allow-Origin 允许组织连接控制 。
- Age 对象在代理缓存中的时间
- Cache-Control 指定缓存机制
- Connection 是否保持网络连接打开状态。参数:keep-alive、close。
- ETag 特定版本资源标识符
- Expires 过期时间日期
- Server 服务器信息,如JSP、Apache等。
- Referer 可用于识别用户访问位置
Https
- Http与Https的区别
Https在传输的信息上是经过了加密的,而Http是明文传输。 -
Https运行机制
- 客户端发起 HTTPS 请求
- 服务端获取数字证书CA —— 服务器向数字证书认证机构申请获取数字证书 CA 表明服务器是合法的、无害的。
- 传送数字证书 —— 将数字证书传给客户端
- 客户端解析证书 —— 客户端向数字证书认证机构查询,验证服务器合法性。
- 客户端传输加密后的信息给服务端
- 服务端解密信息
- 服务端传输加密后的信息给客户端
- 客户端解密信息
参考链接:
- Http|MDN https://developer.mozilla.org...
- 通俗大白话来理解TCP协议的三次握手和四次分手 https://github.com/jawil/blog...
- HTTP 协议学习笔记(扫盲文)https://www.jianshu.com/p/e0a...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。