【Java ee初阶】http(1)
HTTP
全称为“超文本传输协议”,由名字可知,这是一个基于文本格式的协议,而TCP,UDP,以太网,IP...都是基于二进制格式的协议。
如何区别该协议是基于哪种格式的协议?
形如这种协议格式,按照xxx个字节,xxx个比特位,这样的方式来安排的妥妥的就是二进制(不涉及任何字符)
超文本:文本包含了一些更复杂的内容,例如图片、视频、音频、特殊字体、链接......
HTTP诞生于1991年,同时,Python,Linux,Vim,Qt(C++知名的库)同时诞生于这一年。
HTTP的各种版本
HTTP是应用层协议,传输层依赖于TCP来进行实现。(HTTP2.0及以前,是基于TCP;到了HTTP3.0,基于UDP)
因为TCP的传输效率更好,但是他的可靠性没有UDP好
HTTP协议,是一个非常经典的“一问一答”模型。
关心HTTP交互过程的时候,应该注重两方面:一方面需要关心HTTP请求是什么样子的,另一方面要关心HTTP响应是什么样子的。而上述二者就构成了HTTP的协议格式。
HTTP 请求格式
1. 首行 (请求的第一行)
2. 请求头 (header) 从第二行开始, 往后若干行
3. 空行 (请求头的结束标记)
4. 请求正文 (body) [有的请求有, 有的没有]
HTTP 响应,可能被压缩的
Content-Encoding: gzip
本来是文本,压缩了就变成二进制了。
网络通信过程中,最贵的硬件资源,就是网络带宽
直接把原始数据进行传输,比较大,消耗的网络带宽就多了。
可以把数据进行压缩,压缩之后数据就变少了,通过网络传输的内容也少了。
数据到了对端再通过 CPU 来进行解压缩
压缩 / 解压缩
压缩包 (rar, zip....) (一系列的压缩算法)
一个不太恰当的例子
比如你的数据
aabbbccccccdddd
压缩后
2a3b4c5d
点击这个条条就能解压缩
HTTP 响应格式
1. 首行
2. 响应头 (header)
3. 空行 (响应报头的结束标记)
4. 正文 (body)
(当前的正文部分就包含了网页的 HTML)
URL
方法(method) URL 版本号
URL:统一资源定位器,描述了网络上的某个资源的具体位置,需要明确访问网络上的哪个资源
登录信息(认证):淘汰了,现在已经没有网站采取这种认证方式了。30年前,采取这样的方式来进行身份认证。
服务器地址:服务器地址
服务器端口:服务器的端口号
带层次的文件路径:path,一个机器上的一个服务器程序,可能管理着很多资源,这些资源可能是真实的文件,还可能是一些“虚拟的”“动态生成的”资源(根据请求,计算出来的响应)
查询字符串:query string。请求中的参数,通过参数进行进一步的解释说明。是键值对格式,=分割键和值,通过&分割多个键值对
片段标识符:标识网页的某个部分,实现“页面内跳转功能”。文档类网站会带有这个。
完整的 URL 包含了很多信息
重点关心的主要是 4 个部分
1) IP
2) 端口
3) 路径
4) 查询字符串
https://www.sogou.com/ 只有 IP 地址, 其他的好像都没有。
https://cn.vuejs.org/guide/introduction.html#single-file-components 没有端口, 也没有查询字符串
一个 URL 中, 有些部分是可以省略的
如果没有端口号, 浏览器会给一个默认值
一次通信, 需要
源 IP (浏览器客户端, 端口号, 系统分配的空闲端口)
源端口
目的 IP
目的端口 (URL 中的端口, 描述了你访问的服务器的端口, 不是你浏览器客户端的端口)
URL 中目的端口如果不写, 浏览器会给默认值. 根据协议类型确定.
http:// => 端口给 80 (http 服务器的端口号 也是作为 "知名端口号")
https:// => 端口给 443 (https 服务器的端口号也是 "知名端口号")
带层次的路径也能省略, 省略之后, 其实是一个 /
表示 "根目录"
访问一个服务器管理资源/目录 中的最顶层的目录/资源
通常就对应到一个网站的主页
query string 本来就不是必须的. 都属于程序员自行约定的
片段标识符, 也可以省略(需要页面内跳转, 才设定, 不需要的话就可以省略了)
程序员代码中自定义的(前端内容)
URL encode
https://cn.bing.com/search?q=%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9&qs=n&form=QBRE&sp=-1&lq=0&pq=%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9&sc=12-4&sk=&cvid=7CD8656EDA4749B08D5958CCF80B8679
url 的 query string 中的 value 部分, 可能需要进行 "转义" 的.
query string 的内容, 程序员可以自定义 (尤其是 value)
如果 value 中包含特殊符号, 就可能使 url 的解析出现错误.
url 中的特殊符号有特定含义.
中文也需要转义 (中文通过 utf8/gbk 之类的编码格式表示的, 有可能某个汉字的
utf8/gbk 编码中的某个字节, 恰好和某个特殊符号的 ascii 码相同了 还是可能造成误会)
转义的规则非常简单
把特殊符号的 ascii 取出来, 按照字节维度, 插入一些 %
上述 utf8 的编码解码 过程不需要手动实现
都有专门的库来进行
如果需要放中文/符号, 需要主动进行 url encode
否则, 浏览器/服务器可能解析失败