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

HTTP网络通信协议基础

目录

前言:

1.HTTP协议理论

1.1协议概念

1.2工作原理

1.3工作场景

2.HTTP抓包工具

2.1Fiddler工具

2.2抓包原理

2.3抓包结果

3.HTTP协议格式

3.1HTTP请求

3.2HTTP响应

3.3格式总结


前言:

 在了解完网络编程的传输层UDP和TCP通信协议后,就需要开始对数据进行“修饰”,即应用层协议,UDP和TCP协议只负责“传输”。

 在应用层中,HTTP协议是最重要、最常用的一个通信协议。本节主要介绍HTTP协议的基础原理以及Fiddler抓包工具的简单使用。

序列:HTTP/HTTPS - 001


1.HTTP协议理论

1.1协议概念

 HTTP(全称为“超文本传输协议”)是一种应用非常广泛的应用层协议,目前已经发展成为一种最主流的应用层协议,是开发中最常使用的协议之一。

所谓“超文本” 的含义,就是传输的内容不仅仅是文本,还可以是一些其他的资源,比如图片、视频和音频等二进制的数据。

HTTP协议往往是基于传输层的TCP协议实现(HTTP1.0、HTTP1.1和HTTP2.0均为TCP,HTTP3基于UDP实现)。

目前我们主要使用的还是HTTP1.1和HTTP2.0版本。

1.2工作原理

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

在http协议的请求/响应的过程中,主机和服务器都是以“报文”的形式进行传递数据,这个报文是以字符文本的格式存储和传输的。

事实上,当我们访问一个网站的时候,大概率涉及不止一次的HTTP请求/响应的交互过程。

为了清楚捕捉到所有的HTTP协议请求/响应的报文,所以我们要使用“抓包工具”获取详细的交互过程。

1.3工作场景

在网络编程开发中,程序员会经常使用到HTTP协议,其主要用于以下场景:

  1. 浏览器中访问操作网站,与网站服务器交互(BS端);
  2. 软件APP中访问操作对应的后台服务器(CS端);

2.HTTP抓包工具

 在了解HTTP协议的格式之前,我们首先要学会和使用“抓包工具”获取传输报文,这在学习和了解HTTP协议时非常重要。

2.1Fiddler工具

 市面上的抓包工具有很多,以其中最好使用的一款Fiddler抓包工具为例。

Fiddler的官网下载地址为:Fiddler | Web Debugging Proxy and Troubleshooting Tools;

FIddler是一款专门抓取针对http或hppts请求/响应的工具,它对于其他的抓包工具而言具有清晰、方便的优点,所以推荐使用Fiddler抓包工具。

安装完成之后Fiddler界面如下:

安转完成之后,依次选择左上角Tools->Options...->HTTPS->勾选全部的内容,操作完成之后就可以抓取主机的所有http和https请求/响应。

  • 左侧窗口显示了所有的HTTP请求/响应,可以选中某个请求查看详情;
  • 右侧上方显示了HTTP请求的报文内容;(切换到Raw标签页可以看到详细的数据格式)
  • 右侧下方显示了HTTP响应的报文内容;(切换到Raw标签页可以看到详细的数据格式)
  • 请求和响应的详细数据,可以通过右下角的View in Notepad通过记事本打开;

可以使用ctrl+a全选左侧的抓包结果,delete键清除所有被选中的结果。

2.2抓包原理

Fiddler就相当于一个“代理”

  1. 浏览器访问sogou.com时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给sogou服务器。
  2. 当sogou服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器,因此Fiddler对于浏览器和sogou服务器之间交互的数据细节,都是非常清楚的。

“代理”关系如图所示:

2.3抓包结果

 因为http协议的请求和响应是以字符文本的形式传输的,所以抓包结果也会是一个文本文件。

在Fiddler抓包工具中选中一条要查看的hppt协议请求/响应,切换到Raw标签页可以看到详细的数据格式,点击View in Notepad按钮,会看到一个文本文件,这个文本文件就是请求/响应的传输报文。

示例如下:

HTTP的传输报文中有规定的标椎格式,都是字符文本形式,通过对报文格式的了解可以知道传输过程中的很多信息。 

3.HTTP协议格式

 在获取了http传输报文之后,就可以对报文的格式进行拆分和了解。

3.1HTTP请求

使用上述的请求示例:

请求格式拆解:

  • 首行:[方法]+[url]+[版本号],分别使用空格分隔;
  • 请求头(Header):请求的属性,每个键值对独占一行,冒号+空格来分割键和值
  • 空行:遇到空行表示Header部分结束
  • 正文(Body):空行后面的内容都是Body,Body允许为空字符串。如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;

3.2HTTP响应

响应的详细数据,在Fiddler中通过右下角的View in Notepad打开:

响应格式拆解:

  • 首行:[版本号]+[状态码]+[状态码解释],分别使用空格分隔;
  • 响应头(Header):请求的属性,每个键值对独占一行,冒号+空格分割键和值
  • 空行:遇到空行表示Header部分结束
  • 正文(Body):空行后面的内容都是Body,Body允许为空字符串。如果Bodv存在,则在Header中会有一个Content-Length属性来标识Body的长度。如果服务器返回了一个html页面,那么html页面内容就是在body中。

3.3格式总结

HTTP协议请求/响应格式图解:

请求/响应行、报头和空行必须要有,请求/响应正文部分可有可无

空行作用:HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现“粘包问题”

本节只对两个报文格式进行简单拆分,对于报文格式中的关键词介绍与使用,在下一篇文章中会依次进行介绍。


以上便是HTTP协议的基本知识和抓包工具Fiddler。

相关文章:

  • 【算法训练营】等式,道路升级(c++,python实现)
  • 高斯模糊滤镜
  • AJAX——URL查询参数
  • AI少女/HS2甜心选择2 仿剑三剑灵人物卡全合集打包
  • Unity学习笔记(零基础到就业)|Chapter02:C#基础
  • TCP高频知识点
  • 物联网中基于WIFI的室内温度检测系统设计
  • 【React】如何使antd禁用状态的表单输入组件响应点击事件?
  • C++三剑客之std::optional(一) : 使用详解
  • 常见范数介绍
  • css浮动
  • C/C++模板初阶
  • 如何写好一个简历
  • Github 2024-02-12 开源项目日报 Top10
  • 【数据结构】链表OJ面试题5《链表的深度拷贝》(题库+解析)
  • ----------
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • angular组件开发
  • C++类中的特殊成员函数
  • echarts的各种常用效果展示
  • Elasticsearch 参考指南(升级前重新索引)
  • Git 使用集
  • Linux各目录及每个目录的详细介绍
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 关于List、List?、ListObject的区别
  • 通过git安装npm私有模块
  • 移动端唤起键盘时取消position:fixed定位
  • #FPGA(基础知识)
  • (20050108)又读《平凡的世界》
  • (day6) 319. 灯泡开关
  • (pytorch进阶之路)扩散概率模型
  • (二)windows配置JDK环境
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)80c52学习之旅-起始篇
  • (转)【Hibernate总结系列】使用举例
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 5种线程安全集合
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Memory Profiler的使用举例
  • .NET Reactor简单使用教程
  • .Net 路由处理厉害了
  • .NET下ASPX编程的几个小问题
  • .net专家(张羿专栏)
  • 。Net下Windows服务程序开发疑惑
  • /etc/sudoers (root权限管理)
  • [ JavaScript ] JSON方法
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android 数据通信] android cmwap接入点
  • [Android]使用Android打包Unity工程
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [Hive] 常见函数
  • [javaSE] GUI(Action事件)
  • [JS] 常用正则表达式集(一)