【Java EE】网络协议——HTTP协议

news2024/9/23 19:24:45

目录

1.HTTP

1.1HTTP是什么

1.2理解“应用层协议”

1.3理解HTTP协议的工作过程

2.HTTP协议格式

2.1抓包工具的使用

2.2抓包工具的原理

2.3抓包结果

3.协议格式总结


1.HTTP

1.1HTTP是什么

HTTP(全称为“超文本传输协议”)是一种应用非常广泛的应用层协议。

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

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

当我们在浏览器中输入一个搜狗搜索的“网址”(URL)时,浏览器就给搜狗的服务器发送了一个HTTP请求,搜狗的服务器返回了一个HTTP响应。

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

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

1.2理解“应用层协议”

我们已经学过TCP/IP,已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器进程(IP+Port)

所以,我们把数据从A端传送到B端,TCP/IP解决的是顺丰的功能,而两端还要对数据进行加工处或使用,所以我们还需要一层协议,不关心通信细节,关心应用细节!

这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是不同的种类的,其中经典协议之一的HTTP就是其中的佼佼者。

1.3理解HTTP协议的工作过程

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

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

可以通过Chrome的开发者工具观察到这个详细的过程。

通过F12打开chrome的开发者工具,切换到Network标签页,然后刷新页面即可看到如下图效果。一条记录都是一次HTTP请求/响应。

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

2.HTTP协议格式

HTTP是一个文本格式的协议,可以通过Chrome开发者工具或者FIddler抓包,分析HTTP请求/响应的细节。

2.1抓包工具的使用

以Fiddler为例(下载地址:https://www.telerik.com/fiddler/)

安装过程比较简单,一路next即可。

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

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

2.2抓包工具的原理

Fiddler相当于一个“代理”

浏览器访问sougou.com时,就会把HTTP请求发给Fiddler,Fiddler再把请求转发给sogou的服务器,当sogou服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器。

因此,Fiddler对于浏览器和sogou服务器之间交互的数据细节,都是非常清楚的。

2.3抓包结果

以下是一个HTTP请求/响应的抓包结果

HTTP请求

  • 首行:方法+url+版本
  • Header:请求的属性,冒号分隔的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在header会有一个Content-Length属性来标识Body的长度。

HTTP响应

  • 首行:版本号+状态码+状态码解释
  • Header:请求的属性,冒号分隔的键值对,每组属性之间使用\n分隔;遇到空行表示Header部分结束。
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回一个html页面,那么html页面内容就是body中。

3.协议格式总结

思考问题:为什么HTTP报文中要存在“空行”?

因为HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于是“报头的结束标记”,或者是“报头和正文之间的分隔符”。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA主题Drcula个性化改造

Darcula 主题整体色调看着舒服,但是代码区分不直观,比如直接看代码是看不出这个这个是类、接口、抽象类、枚举还是啥,而且左侧图标也很难区分。 该主题基于Darcula主题对类、接口、抽象类、注解在编辑区按颜色做了区分,同时图标也…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…

RT-Thread Env开发探索——以HC-SR04超声波传感器为例

RT-Thread Env开发探索——以HC-SR04超声波传感器为例 0.前言一、BSP优化1.修改芯片功能配置2.修改RTT配置菜单 二、软件包加载1.外设配置2.驱动框架配置3.软件包配置 三、编译及运行四、源码分析五、总结 参考文章:RT Thread Env CLion环境搭建 0.前言 对比使用R…

# 文件或目录损坏且无法读取 的解决方案

文件或目录损坏且无法读取 的解决方案 一、问题描述: windows 系统下,当对某一个文件或文件夹操作时,出现【文件或目录损坏且无法读取】,这时不管对其进行修改、删除、更改属性等操作,都不能正常进行,在 …

Android Notes

maven 版本发布 1、小于 AGP7 使用 maven 插件 apply plugin: maven uploadArchives {repositories {mavenDeployer {pom.groupId GROUP_IDpom.artifactId ARTIFACT_IDpom.version VERSION//正式版本repository(url: RELEASE_URL) {authentication(userName: userName, p…

JS闭包、原型链简单理解

目录 1.闭包概念 1.1简单demo1: 1.2简单demo2 1.3使用let代替var解决这个问题 2.函数对象和原型链 ​编辑 2.1函数对象demo 2.2.原型链demo 3.使用闭包完成JQuery的一个小demo 1.闭包概念 1.当函数声明时,函数会通过内部属性[scope]来创建范围 2.闭包一个…

出书,是「盖你自己的房子」你知道吗?

出书是「盖你自己的房子」 尊敬的出书盟友: 你好!我希望这封信能够激发您对出书和阅读的热情。 在当今信息爆炸的时代,每个人都有机会分享自己的故事、思想和知识。而书籍作为一种流传百年的媒体,依旧承载着无限的力量和影响力…

HE TB PPDU MU-RTS

看起来像是MU-RTS的触发帧的应答不是HE TB PPDU,而是传统得的帧,应答CTS。 非AP 的STA,是不能发送触发帧,也就是说,触发帧,只能是由AP发送给STA

【CCF-CSP】 202309-3 梯度求解

思路: 将表达式整理成只有目标求导变量的无括号加法表达式,其他变量均代入其值,然后利用最简单的求导公式,求出最终值。 样例1 x1 x1 x1 * x2 *转换成 x1*x1*x1x1*x2 若求导x1,则只留下x1,变为 x1*x1*x1…

python:__set_name__使用

python:__set_name__使用 1 前言 在Python中,我们可以通过__set_name__方法来实现一些特殊的操作。该方法是在定义类的时候被调用,用于设置属性的名称。这样一来,我们就可以在类定义中动态地获取属性的名称,从而更好…

转行一年了

关注、星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 来公司一年了。 说是转行其实还是在半导体行业,熟悉我的朋友知道 ,我在18年开始进入半导体行业,那个时候想着行业很重要,站对了…

LearnOpenGL(二十)之立方体贴图

一、创建立方体贴图 首先,生成一个纹理,并将其绑定到纹理目标GL_TEXTURE_CUBE_MAP: unsigned int textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); 因为立方体贴图包含有6个纹理&#xff0…

Go微服务: Http服务注册在Consul的示例(非Go-Micro)

概述 现在,我们使用consul客户端的api来把Http服务注册到consul上,非Go-Micro的形式其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/go-mi…

Day39贪心算法part06

LC738单调递增的数字(未掌握) 思路分析:一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9字符串是不可变的,不可以使用s.char…

图像处理案例01

案例01 例011.1 目标1.2 步骤1.3 代码 例01 1.1 目标 找出图形中的圆弧。 1.2 步骤 读入图像。彩色图转灰度图。图像处理。读灰度图阈值分割,得到img_thre,除掉图中的蓝色和绿色,只留下白色。对img_thre做水平梯度得到gx,这样…

ESP32-C3模组上跑通OTA升级(9)

接前一篇文章:ESP32-C3模组上跑通OTA升级(8) 本文内容参考: 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢! 七、固件版本 将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。ESP-IDF提供了一些标…

飞机大战游戏实现揭秘

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、游戏概览与核心玩法 二、游戏模块详解 1. 游戏主循环模块 2. 创建初始化模块 三、关…

LeetCode:74.搜索二维矩阵

class Solution(object):def searchMatrix(self, matrix, target):M, N len(matrix), len(matrix[0])for i in range(M):for j in range(N):if matrix[i][j] target:return Truereturn False代码解释 这段代码定义了一个名为 Solution 的类,其中包含一个方法 sea…