超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。
2014年12月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。
如今大家使用的HTTP协议版本主要包括HTTP/1.1和HTTP/2,同时也有部分前沿技术或实验性环境中开始尝试使用HTTP/3
简单介绍一下HTTP协议的各个版本
-
HTTP/1.1:
- 发布时间:1997年。
- 特点:默认使用持久连接,支持管道化请求,引入了Cache-Control头字段以提供更丰富的缓存控制选项,支持ETag和Range头等,为Web应用提供了更高的性能和灵活性。
- 缺点:尽管HTTP/1.1进行了多项改进,但仍存在队头阻塞问题,即当一个请求被阻塞时,后续请求也会受到影响。
-
HTTP/2:
- 发布时间:2015年。
- 特点:设计目标是解决HTTP/1.1中的性能问题。HTTP/2引入了二进制分帧、多路复用、头部压缩等新技术。二进制分帧将请求和响应消息分割成更小的二进制帧,提高了传输效率;多路复用允许在同一个连接上并行发送和接收多个请求和响应,消除了队头阻塞问题;头部压缩则减少了头部信息的传输大小,进一步提升了性能。
- 优势:显著提升了网页加载速度和用户体验。
-
HTTP/3:
- 目前仍在发展和完善中,部分前沿技术或实验性环境中已开始尝试使用。
- 特点:HTTP/3基于QUIC协议(Quick UDP Internet Connections),旨在提供更快的连接建立、更低的延迟和更高的安全性。QUIC结合了UDP的低延迟特性和TCP的可靠性,并引入了加密和流控制等机制。
http协议中使用一种统一的资源标识符(Uniform Resource Identifiers, URI)来传输数据和简历链接,URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息URL
URL如下示例
-
协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符,这里的https是指安全链接
-
域名部分:该URL的域名部分为“juejin.cn”。一个URL中,也可以使用IP地址作为域名使用
-
域名后还可以加端口号
-
虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录“/editor/drafts/”
-
文件名,从最后一个/开始到?,#或者最后,这里是7434707691253612553
-
锚从“#”开始到最后,锚部分的主要作用是帮助用户在打开网页时快速定位到页面的特定位置,不要求每个都有
-
参数部分是URL中从“?”符号开始到“#”(如果存在锚部分)或URL末尾的部分。它包含了一个或多个键值对,每个键值对之间用“&”符号分隔。参数部分的主要作用是向服务器传递数据或配置信息。不要求每个都有
然后你就可以使用HTTP协议配合URL完成一些操作,这个过程成为
Request
HTTP POST请求
POST /sis HTTP/1.1
Who: Alex
Content-Type:text/plain
Host:127.0.0.1:8888
Content-Length:28
Let's watch a movie together
这里面主要有几个部分
请求行
- POST /sis HTTP/1.1:这部分是请求行,包含了三个主要部分。
- POST:这是HTTP请求的方法(也称为“动作”或“命令”)。POST方法通常用于向服务器提交数据,例如表单数据或文件上传。与之相对的是GET方法,后者通常用于请求数据。
- /sis:这是请求的URI(统一资源标识符),指明了请求的资源位置。在这个例子中,它指向名为“sis”的资源。
- HTTP/1.1:这指明了使用的HTTP版本,这里是HTTP 1.1。
请求头部
- Who: Alex:这不是一个标准的HTTP头部字段。在HTTP请求中,头部字段通常由键值对组成,用于传递关于请求或客户端的额外信息。由于“Who”不是标准的HTTP头部,它的解释取决于服务器的实现。在这个上下文中,它可能是一个自定义头部,用于传递关于请求者的信息(例如用户名)。
- Content-Type: text/plain:这个头部字段指明了请求体的媒体类型。在这个例子中,它表明请求体是纯文本。这对于服务器来说很重要,因为它决定了如何解析请求体中的数据。
- Host: 127.0.0.1:8888:这个头部字段指明了请求的目标主机和端口号。在这个例子中,它指向本地计算机上的8888端口。
- Content-Length: 28:这个头部字段指明了请求体的字节长度。在这个例子中,请求体的长度是28个字节。
请求体
- Let's watch a movie together:这是请求体,包含了要发送给服务器的实际数据。在这个例子中,数据是一条简单的文本消息。由于
Content-Type被设置为text/plain,服务器会将其解析为纯文本。
另外空行是必须的
http响应
HTTP/1.1 200 OK
Server: hertz
Date: Thu, 21 Apr 2022 11:46:32 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 2
ok
- HTTP/1.1 200 OK:
- 这是状态行,包含了HTTP版本(HTTP/1.1),状态码(200),以及状态消息(OK)。状态码200表示请求已成功被服务器接收、理解,并接受。
- Server: hertz:
- 这是一个响应头部字段,指明了响应是由哪个服务器生成的。在这个例子中,服务器被命名为“hertz”。
- Date: Thu, 21 Apr 2022 11:46:32 GMT:
- 这也是一个响应头部字段,提供了响应生成的日期和时间(使用GMT格式)。这对于调试和缓存验证等目的很有用。
- Content-Type: text/plain; charset=utf-8:
- 这个头部字段指明了响应体的媒体类型(text/plain)和字符集(utf-8)。这告诉客户端如何解析和显示响应体中的数据。
- Content-Length: 2:
- 这个头部字段指明了响应体的字节长度。在这个例子中,响应体只有2个字节长。
- (空行):
- 在响应头部字段之后,必须有一个空行(即CRLF,回车符后跟换行符),以指示头部字段的结束和响应体的开始。
- ok:
- 这是响应体,包含了实际发送给客户端的数据。在这个例子中,响应体只有两个字符:“ok”
另外其实请求和响应的正文都可以使用html让其更加多样化
小结
请求里有什么
1.请求行/状态行
方法名+UIL+协议
2.请求头/响应头
协议约定,业务相关
3.请求体
html代码
2.实现过程,流程
2.1业务层
即要实现发送和收到信息的双方想要收发的信息
2.2服务治理层中间件层
服务治理层是软件架构中的一个关键层次,它的主要目标是确保服务按照预期的方式运行并满足组织的需求和标准。服务治理层涉及多个方面,包括服务的定义、设计、部署、监控、优化等,以确保最终能够交付高质量的产品。
服务治理层依托于中间件层
中间件层衔接网络上应用系统的各个部分或不同的应用,以达到资源共享、功能共享的目的,用我的话来说,就是把共用的东西写成函数,大家一起用。
RPC就是常见的中间件类型
这两个层可以完成与数据处理和流量管理相关的功能和机制
2.3路由层
传递信息的路径,通过URL控制传递到哪去
2.4编解码
变成二进制再变回来
2.5传输层
通信
3.请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 GET: 用于请求访问已经被URL(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。 PUT: 传输文件,报文主体中包含文件内容,保存到对应URL位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URL是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URL位置的文件。
OPTIONS:查询相应URL支持的HTTP方法。
4.浏览器中输入一个URL发生什么?
最后补充一个查找资料时发现的有用的问题
浏览器中输入一个URL发生什么?
1、输入URL:www.baidu.com
2、DNS 域名解析,获取对应的IP地址以及端口号
3、建立TCP连接(Socket):三次握手,确保这个一定是一个有效的请求和响应,三次握手提高了传输的有效性,但是这个导致的直接问题就是整个传输过程是很耗时的,也就是说每次http请求都会经历三次握手这个过程,消耗的时间也是不言而喻,并且传统的http协议规定一次请求只能请求一个文件,所以一些顶级网站千方百计的采取一些减少http请求的策略,大多数就是采取一次http请求能够请求多个文件这样的实现,
4、 将用户输入URL地址封装成HTTP Request请求报文发送到服务器。
5、 后台服务器接收到用户HTTP Request请求报文之后,经过相应的处理,然后将相应结果封装到HTTP Response响应报文中发送给客户端。
6、 用户浏览器接收到响应数据后开始渲染html、css,解析和执行JavaScript等代码。