> 文档中心 > 【HTTP】协议格式、请求

【HTTP】协议格式、请求

目录

1.HTTP是什么

2.理解HTTP协议的工作过程

3.HTTP协议格式

4.协议格式总结

其中请求分为4个部分

4.2 其中响应分为4个部分

5.HTTP请求(Request)

5.1认识 URL

5.2 关于 URL encode/decode


1.HTTP是什么

HTTP(全文简称“超文本传输协议”)是一种应用非常广泛地应用层协议,处于TCP/IP五层协议栈的应用层。

HTTP在传输层是基于TCP的。其中HTTP/1 、HTTP/2 是基于TCP. 最新版本的HTTP/3 是基于UDP,但如今互联网上大部分使用的HTTP都是 HTP/1.1

传输层协议,主要关注的是 端对端 之间的数据传输。TCP重点关注的是可靠传输。

应用层协议,则是站在程序应用的角度,要对传输的数据来进行具体使用。

应用层协议很多时候都是程序员自定制的,根据实际的需求场景来设计协议,于是就有了一个典型的代表——HTTP协议。HTTP虽然是设计好的,但自身的可扩展性非常强,可以根据实际需要,让程序员传输各种自定义的数据信息。

在我们打开浏览器中的随便一个网站时,就是通过HTTP协议来传输数据的。

2.理解HTTP协议的工作过程

当我们在浏览器中输入一个百度搜索的 " 网址 " (URL) , 浏览器就给百度的服务器发送了一个 HTTP 请求, 百度 的服务器返回了一个 HTTP 响应 . 这个响应结果被浏览器解析之后 , 就展示成我们看到的页面内容 . ( 这个过程中浏览器可能会给服务器发送多个 HTTP 请求 , 服务器会对应返回多个响应 , 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片 , 字体等信息).

当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个HTTP 响应.

事实上 , 当我们访问一个网站的时候 , 可能涉及不止一次的 HTTP 请求 / 响应的交互过程 . 可以通过 chrome 的开发者工具观察到这个详细的过程 . 通过 F12 打开 chrome 的开发者工具 , 切换到 Network 标签页 . 然后刷新页面即可看到如下图效 . 每一条记录都是一次 HTTP 请求 / 响应

注意 : 当前搜狗主页是通过 https 来进行通信的。  https 是在 http 基础之上做了一个加密解密的工作。

3.HTTP协议格式

其中UDP:报头(源端口,目的端口,长度,校验和)+载荷

UDP/TCP/IP 这些协议都是属于“二进制”的协议,经常要理解到二进制的bit位

HTTP则是一个文本格式的协议(不需要理解具体的二进制位,而只是理解文本的格式即可)。我们可以借助“抓包工具”来获取到具体的HTTP交互过程中的请求和响应。

“抓包工具”其实就是一个第三方的程序,在网络通信的过程中,类似于“代理”一样。如下图所示

 抓包工具可使用 Fiddler 

当我们点击左侧列表中每个条目并双击时,右侧就会显示条目的详细信息。

点击Fiddler 请求中的Raw 、View in Notepead 就可以看到本体

 

 看到的本体是乱码的,因为这是经过压缩之后的,目的是提高服务器的效率

 可以点击下面按钮将乱码恢复成文本格式

恢复正常

4.协议格式总结

 

其中请求分为4个部分

1.请求行(首行),包括是三个部分

a)HTTP 的方法,方法大概描述了请求想做什么,GET意思就是想从服务器获取到某个东西

b)URL,描述了要访问的网络上的资源具体在哪里

c)版本号,HTTP/1.1表示当前使用的HTTP的版本是1.1  1.1是当前最流行的版本,还可能是1.0/2/3

2.请求头(head)包含了很多行

每一行都是一个键值对,键和值之间使用 空格 来分割,这里的键值对个数是不固定的,有可能多,有可能少,不同键和值表示不同的含义。

3.空行

相当于请求头的结束标志,类似于链表的 null

4.请求正文(body) 

可以选的,不一定有。

4.2 其中响应分为4个部分

1.首行:包含了三部分

a) 版本号~HTTP/1.1

b) 200 状态码,描述了这个响应,是是一个表示“成功的” 还是 “失败的”,以及不同的状态码,描述了失败的原因

c)OK 状态码的描述,通过一个/一组简单的单词,来描述当前的状态码的含义

2.响应头(header)

响应头是键值对结构,每个键值对占一行,每个键和值之间使用:空格 来分割。响应头中的键值对个数,也是不确定的,不同的键值对表示不同的含义。

3.空行

表示响应头的结束标志

4.响应正文(body)

服务器返回给客户端的具体数据。其中的数据可能有各种不同的格式,其中最常见的格式-html.

5.HTTP请求(Request

5.1认识 URL

URL 含义就是“网络上唯一资源的地址符”,既要明确主机是谁,又要明确取主机上的那个资源。

通过浏览器,打开网页的时候,地址栏里面的“网址”其实就是URL,如下如所示

 URL基本模板

 1.协议方案名:描述了当前这个URL 是给哪个协议来使用的。

http:// 给HTTP用的。 https:// 给HTTPS用的

jdbc:mysql:// 给jdbc:mysql 使用的

2.登录信息认证:这个部分现在很少使用,这里是显示用户密码的

3.服务器地址:当前要访问的主机是哪个,这里可以是一个IP地址,也可以是域名

4.服务器端口号:表示当前要访问的主机上的哪个应用程序。端口号大部分情况下是省略的,省略的时候,不是说没有,而是浏览器会自动赋予一个默认值,对于http开头的URL,就会使用 80 端口作为默认值,对于https开头的URL ,就会使用443端口作为默认值

5.文件路径:描述了当前要访问的服务器资源是什么。(虽然请求的URL中,写的是一个文件路径,但不一定服务器上就真实存在,这个文件可能是一个在磁盘上的文件,也能是虚拟的,由服务器代码,构造出一个动态数据)

6.查询字符:本质上是浏览器/客户端 给服务器传递的自定义信息,相当于对获取到的资源提出了进一步的要求。

查询字符串的内容,本质上也是键值对结构,完全由程序员自己定义。查询字符串和路径之间使用 ? 来分割

7.片段标识符:描述了要访问当前html 页面中哪个具体的子部分,能够控制浏览器滚动到相关的位置

对于URL来说,里面的结构看起来比较复杂,其实最重要的和开发最关系紧密的主要就是四个部分

1.Ip 地址

2.端口号

3.带层次结构的路径

4.query String 查询字符串 

5.2 关于 URL encode/decode

当query string中如果包含了特殊字符,就需要对特殊字符进行转义~~
这个转义的过程,就叫做url encode.反之,把转义后的内容还原回来,就叫做url decode

url里面是有很多特殊含义的符号的.

像 / ? :  &等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成 , 虽然在 URL 中没有特殊含义 , 但是仍然需 要进行转义 . 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号 .

转义的规则如下 : 将需要转码的字符转为 16 进制,然后从右到左,取 4 ( 不足 4 位直接处理 ) ,每 2 位做一位,前面加上% ,编码成 %XY 格式

例如 "+" 被转义成了 "%2B"

字符+,的asci的16进制表示,正是2B (B就是十六进制符号,相当于十进制的11)