当前位置: 首页 > news >正文

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 抓包结果

请求基本格式:
在这里插入图片描述

  1. 首行:请求中的第一行我们称为首行。
  2. 请求头:第二行开始往后若干行我们称为请求头。
  3. 空行:空行为请求头的结束标记
  4. 正文:空行之后的内容(这里的请求没有)

响应基本格式:
在这里插入图片描述

  1. 首行:请求中的第一行我们称为首行。
  2. 响应头:第二行后的若干行。
  3. 空行:空行为请求头的结束标记。
  4. 正文:空行之后的内容
    这里的正文可以看到是二进制内容,这是把文本压缩成二进制了,用来节省资源。
    解压缩后:
    在这里插入图片描述
    可以看到,正文部分包含了网页的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方法表达的是一种语义,介绍上图几个常用的:

  1. GET:从服务器获取某个资源。
    GET方法是HTTP中最常见的方法,很多操作都会触发HTTP的GET请求:
    直接在浏览器输入url;
    页面上点击一些跳转链接;
    HTML间接加载其他资源的时候(CSS,JS,图片等 );
    通过js/java/C++/Python等代码手动构造GET请求。
    GET请求特点:
    GET请求一般没有body;
    GET请求要给服务器传递数据,往往是通过路径/query string来进行传递。
  2. POST:向服务器上传一些资源。
    登录时或者上传资源/文件时会触发。登陆时提交填写的用户和密码。上传资源/文件时提交传输资源的内容。
    POST带有body,通过body给服务器传递数据,通常下不使用query string传递数据。
  3. PUT:向服务器上传某个资源(文件)。和POST差不多一样。
  4. DELETE:删除服务器的某个资源。和GET类似,也是一般不带有body,通过quert string传递参数。

3.3 版本号

HTTP1.1是目前最主流的HTTP版本号。与请求不同的是,响应的版本号在首行的前面。

3.4 HTTP报头

在这里插入图片描述
报头的形式是行文本,每一行是一个键值对,键和值之间用 “ :加一个空格"(: ) 来分割。
介绍简单一下header的一些key:

  1. Host:描述了访问的服务器的IP(域名)和端口 (可以省略)
  2. Content-Length和Content-Type:前一个描述了body的长度,后一个描述了body的数据格式,所以在请求/响应中包含body时才会有这两个key。Contet-Length这一个key解决了“粘包问题”。如果一个请求/响应,有body但没有这其中一个key,那么这就是一个非法的“请求/响应”。
  3. User-Agent:表示浏览器/操作系统的属性。
  4. Referer:表示这个界面是从哪个界面跳转过来的。内容是一个网址。
  5. 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的状态码。
在这里插入图片描述
不同的状态码表示不同的含义,在官方文档中有很多状态码,下面介绍几种常用的:

  1. 200 OK:表示访问成功,这里的成功表示HTTP层的成功,不代表业务层面的成功,比如注册账号,提交用户名,由于用户名重复,导致注册失败,这就是业务失败,但也可以通过200这样的状态码表示。
  2. 404 Not Found:客户端要访问的资源不存在,即URL中层次结构的路径不存在。
  3. 403 Forbidden:访问被拒绝(没有权限访问)
  4. 500 Internal Server Error:服务器抛出异常,崩溃了
  5. 504 Gateway TimeOut:服务器负载大,处理请求超时。
  6. 302 Move temporarily:临时重定向,跳转到另一个界面,例如登录页面登录成功后自动跳转到主页。响应报文header部分会包含一个Location字段,表示要跳转到哪个界面。
  7. 301 Moved Permanently:永久重定向,浏览器收到这种响应时,后续的请求都会被自动改成新的地址。

4.2 其他部分

响应报头响应正文和上面请求对应的部分差不多,不再讲述。

总结

本篇文章较为详细的介绍了HTTP的基本结构,同时还顺带介绍了fiddle抓包工具,看完这篇文章后,希望你能对HTTP能够有较为深入的理解。

http://www.dtcms.com/a/314331.html

相关文章:

  • ICCV 2025|单视频生成动态4D场景!中科大微软突破4D生成瓶颈,动画效果炸裂来袭!
  • ICCV 2025|可灵团队新作 ReCamMaster:从单视频到多视角生成,多角度看好莱坞大片
  • socket与udp
  • 折叠屏网页布局挑战:响应式设计在工业平板与PC端的弹性适配策略
  • 【Mac】OrbStack:桌面端虚拟机配置与使用
  • LeetCode 140:单词拆分 II
  • 【MySQL03】:MySQL约束
  • mac 技巧
  • 零售消费行业研究系列报告
  • Java-基础-统计投票信息
  • Linux下载安装mysql,客户端(Navicat)连接Linux中的mysql
  • allegro建库--1
  • 【Redis】移动设备离线通知推送全流程实现:系统推送服务与Redis的协同应用
  • 模型学习系列之考试
  • 机器学习(8):线性回归
  • 基于落霞归雁思维框架的自动化测试实践与探索
  • OpenLayers 入门指南【五】:Map 容器
  • Unity发布Android平台实现网页打开应用并传参
  • 如何查看 iOS 电池与电耗:入门指南与实战工具推荐
  • 期权投资盈利之道书籍推荐
  • Codeforces Round 1008 (Div. 2)
  • Chrontel【CH7214C-BF】CH7214C USB Type C Logic Controller
  • 【Java线程池深入解析:从入门到精通】
  • Memcached 缓存详解及常见问题解决方案
  • 【深度学习新浪潮】近三年城市级数字孪生的研究进展一览
  • 【音视频】WebRTC 一对一通话-实现概述
  • 使用vue缓存机制 缓存整个项目的时候 静态的一些操作也变的很卡,解决办法~超快超简单~
  • 深入剖析RT-Thread串口驱动:基于STM32H750的FinSH Shell全链路Trace分析与实战解密(上)
  • Back to the Features:附录C Unconditional world model evaluations
  • 第四十一节 MATLAB GNU Octave教程