HTTP基本结构
目录
- 前言
- 1. 概念
- 2. HTTP基本格式
- 2.1 抓包原理
- 2.2 抓包软件使用
- 2.3 抓包结果
- 3. HTTP请求
- 3.1 URL
- 3.2 方法
- 3.3 版本号
- 3.4 HTTP报头
- 3.4 正文部分
- 4. HTTP响应
- 4.1 HTTP状态码
- 4.2 其他部分
- 总结
前言
本篇文章介绍HTTP的基本结构。
1. 概念
HTTP全称为超文本传输协议,是一种应用非常广泛的应用层协议。诞生于1991年,目前已经发展为最主流使用的应用层协议。超文本的意思是,文本中包含了更复杂的内容(例如图片、视频、音频、特殊字体、链接等)。
2. HTTP基本格式
HTTP是一种文本格式的协议,我们需要使用抓包软件来观察HTTP的协议格式。这里使用fiddler进行抓包。
2.1 抓包原理
抓包软件本质上是一个“代理程序”这里以fiddler为例,在浏览器访问界面时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给对应的服务器,服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器,所以Fiddler对于浏览器和服务器的交互细节是非常清楚的,所以抓包软件就可以监听网卡上通过的数据了。
2.2 抓包软件使用
以fiddler为例,在这个地址进行安装: fiddler安装。
左侧窗口显示了所有的HTTP请求/响应,可以选中某个请求来观看详细内容,右侧上方显示HTTP请求的报文内容,右下方显示了HTTP响应的报文内容。点击Raw可以看到详细的数据格式。
2.3 抓包结果
请求基本格式:
- 首行:请求中的第一行我们称为首行。
- 请求头:第二行开始往后若干行我们称为请求头。
- 空行:空行为请求头的结束标记
- 正文:空行之后的内容(这里的请求没有)
响应基本格式:
- 首行:请求中的第一行我们称为首行。
- 响应头:第二行后的若干行。
- 空行:空行为请求头的结束标记。
- 正文:空行之后的内容
这里的正文可以看到是二进制内容,这是把文本压缩成二进制了,用来节省资源。
解压缩后:
可以看到,正文部分包含了网页的HTML。
3. HTTP请求
先看请求的首行:
GET https://www.csdn.net/ HTTP/1.1
这里分成了三个部分,GET称为方法,HTTP/1.1这个部分称为版本号,中间这个部分我们称为URL。我们着重讲这三个部分。
3.1 URL
URL全称”唯一资源定位符“,描述了网络上某个资源的具体位置。互联网每个文件都有唯一的URL,它包含的信息指出了文件的位置以及浏览器对其的处理方式。
URL的完整结构:
协议方案名:常见的由http和https。
登录信息:这里登录信息(认证)的内容已经淘汰,现在已经没有网站采取URL进行认证了。
服务器地址:是IP地址,一般填的是域名,会通过DNS系统解析成一个具体的IP地址。
端口号:如果省略,会根据协议自动决定使用哪个端口。
带层次的文件路径:一个机器上的一个服务器程序可能管理者很多资源,可能是真实的文件,也可能是一些动态生成的资源(根据请求计算出来的响应)。
查询字符串:是键值对(query string)的格式,通过‘=”分割键和值。通过“&”分割多个键值对,这里键值对的含义由程序员来自定义。通过查询字符就可以让客户端给服务器传递一些参数。
片段标识符:标识网页的某个部分,实现“页面内跳转”功能,在一些文档类网站,会带有这个。
URL一些部分可以省略:
协议名:可以省略,省略后默认为http://
ip地址/域名:在HTML中可以省略。省略后标识服务器的ip/域名与当前HTML所属的ip/域名一致。
端口号:可以省略。省略后如果是http协议,自动设为80;如果是https协议,自动设置为443
带层次的文件路径:可以省略。省略后相当于/。一些服务器在发现“/”路径的时候自动访问/index.html。
查询字符串和片段标识也都可以省略。
关于URL encode
url的query string中的value部分可能需要进行转义。规则是把特殊符号的 ascii码取出来,按照字节维度插入一些“%”。
中文也需要转义,这是因为中文通过uft8/gbk之类的编码格式表示,可能某个汉字的utf8/gbk编码中的某个字节,恰好和某个特殊符号的ascii码相同了。
query string的内容,程序员可以自定义(尤其是value),如果value中包含特殊符号,就可能使url的解析出现错误。这是因为url中的特殊符号有特定含义。
3.2 方法
HTTP方法表达的是一种语义,介绍上图几个常用的:
- GET:从服务器获取某个资源。
GET方法是HTTP中最常见的方法,很多操作都会触发HTTP的GET请求:
直接在浏览器输入url;
页面上点击一些跳转链接;
HTML间接加载其他资源的时候(CSS,JS,图片等 );
通过js/java/C++/Python等代码手动构造GET请求。
GET请求特点:
GET请求一般没有body;
GET请求要给服务器传递数据,往往是通过路径/query string来进行传递。 - POST:向服务器上传一些资源。
登录时或者上传资源/文件时会触发。登陆时提交填写的用户和密码。上传资源/文件时提交传输资源的内容。
POST带有body,通过body给服务器传递数据,通常下不使用query string传递数据。 - PUT:向服务器上传某个资源(文件)。和POST差不多一样。
- DELETE:删除服务器的某个资源。和GET类似,也是一般不带有body,通过quert string传递参数。
3.3 版本号
HTTP1.1是目前最主流的HTTP版本号。与请求不同的是,响应的版本号在首行的前面。
3.4 HTTP报头
报头的形式是行文本,每一行是一个键值对,键和值之间用 “ :加一个空格"(: ) 来分割。
介绍简单一下header的一些key:
- Host:描述了访问的服务器的IP(域名)和端口 (可以省略)
- Content-Length和Content-Type:前一个描述了body的长度,后一个描述了body的数据格式,所以在请求/响应中包含body时才会有这两个key。Contet-Length这一个key解决了“粘包问题”。如果一个请求/响应,有body但没有这其中一个key,那么这就是一个非法的“请求/响应”。
- User-Agent:表示浏览器/操作系统的属性。
- Referer:表示这个界面是从哪个界面跳转过来的。内容是一个网址。
- Cookie:Cookie中的内容是键值对,使用分号(;)来分割多个键值对,使用等号(=)来分割键和值。Cookie本质是浏览器在本地存储数据的一种机制。此外,浏览器本地存储cookie时,按照域名维度进行管理。
浏览器为了把控安全,浏览器会限制一个网站的权限,比如会禁止网站访问硬盘,禁止网站调用电脑上的其他应用程序。所以网站如果在电脑上存储一些数据,就需要用到Cookie,其中的内容是服务器返回给浏览器的,浏览器会把Cookie保存到本地,由于不允许网站随意访问硬盘,所以只能按照“键值对”形式来存储简单数据。
在服务器响应header中可能会包含set-cookie这样的报头,每一个set-cookie就对应一个cookie键值对。
Cookie键值对是自定义的,我们可以通过Cookie保存一些没那么重要但是有用的信息,如“上次访问时间”。
3.4 正文部分
请求的body部分,简单介绍一下一些常见的数据格式,有application/json,text/html,text/css,application/JavaScript,image/png。
4. HTTP响应
4.1 HTTP状态码
在响应的首行就是HTTP的状态码。
不同的状态码表示不同的含义,在官方文档中有很多状态码,下面介绍几种常用的:
- 200 OK:表示访问成功,这里的成功表示HTTP层的成功,不代表业务层面的成功,比如注册账号,提交用户名,由于用户名重复,导致注册失败,这就是业务失败,但也可以通过200这样的状态码表示。
- 404 Not Found:客户端要访问的资源不存在,即URL中层次结构的路径不存在。
- 403 Forbidden:访问被拒绝(没有权限访问)
- 500 Internal Server Error:服务器抛出异常,崩溃了
- 504 Gateway TimeOut:服务器负载大,处理请求超时。
- 302 Move temporarily:临时重定向,跳转到另一个界面,例如登录页面登录成功后自动跳转到主页。响应报文header部分会包含一个Location字段,表示要跳转到哪个界面。
- 301 Moved Permanently:永久重定向,浏览器收到这种响应时,后续的请求都会被自动改成新的地址。
4.2 其他部分
响应报头响应正文和上面请求对应的部分差不多,不再讲述。
总结
本篇文章较为详细的介绍了HTTP的基本结构,同时还顺带介绍了fiddle抓包工具,看完这篇文章后,希望你能对HTTP能够有较为深入的理解。