【Linux篇】Http协议(1)(笔记)
目录
一、http基本认识
1. Web客户端和服务器
2. 资源
3. URI
4. URL
5. 事务
6. 方法
7. 状态码
二、HTTP报文
1. 报文的流动
(1)流入源端服务器
(2)向下游流动
2. 报文语法
三、TCP连接
1. TCP传输方式
2. TCP连接状态
3. 套接字
4. TCP连接三次握手
一、http基本认识
1. Web客户端和服务器

Web 内容都是 存储在 Web 服务器 上的。Web 服务器 所使用的是 HTTP 协议,因此 经常会被称为 HTTP 服务器。这些 HTTP 服务器 存储了 因特网中的 数据,如果 HTTP 客户端 发出 请求的话,它们 会提供数据。客户端 向服务器 发送 HTTP 请求,服务器会 在 HTTP 响应 中回送所 请求的数据。
HTTP 客户端 和 HTTP 服务器 共同构成了 万维网的 基本组件。
2. 资源

Web 服务器 是 Web资源(Web resource)的宿主。Web 资源是 Web 内容 的源头。最简单的 Web 资源 就是 Web 服务器 文件系统中的 静态文件。这些文件可以 包含任意内容:文本文件、HTML文件、JPEG图片文件、AVI电影文件等。
资源 还可以是根据 需要生成内容的 软件程序。这些 动态内容资源 可以 根据你的身份、所请求的信息 或 每天的 不同时段来 产生内容。
3. URI

每个 Web 服务器资源 都有一个 名字。服务器资源名 被称为 统一资源 标识符(Uniform Resource Identifier, URI)。URI 就像因特网上的 邮政地址一样,在 世界范围内 唯一 标识 并定位信息资源。
4. URL

统一资源定位符(URL)是 资源标识符 最常见的形式。URL 描述了 一台 特定服务器上 某资源的 特定位置。它们 可以明确 说明如何 从一个精确、固定的位置 获取资源。
5. 事务

一个 HTTP 事务 由一条(从客户端发往服务器的)请求命令 和 一个(从服务器发回 客户端的)响应结果 组成。这种通信 是通过名为 HTTP 报文(HTTP message)的格式化 数据块 进行的。
应用程序完成一项任务时通常会发布多个HTTP事务。一个“Web页面”通常并不是单个资源,而是一组资源的集合。
6. 方法

每条 HTTP 请求报文 都包含 一个方法。这个方法 会告诉服务器 要执行什么动作(获取一个 Web 页面、运行一个 网关程序、删除一个文件等)。
7. 状态码

每条 HTTP 响应报文 返回时都会 携带一个 状态码。状态码 是一个 三位数字的 代码,告知 客户端请求 是否成功,或者 是否需要 采取其他动作。
二、HTTP报文
HTTP 报文 是在 HTTP 应用程序 之间发送的 数据块。这些数据块 以一些文本形式的 元信息(meta-information)开头,这些信息 描述了报文的 内容及含义,后面 跟着可选的 数据部分。这些报文在 客户端、服务器 和 代理之间流动。术语 “流入”、“流出”、“上游” 及 “下游” 都是用来描述报文方向的。
1. 报文的流动
(1)流入源端服务器

(2)向下游流动

不管是 请求报文 还是 响应报文,所有报文都 会向下游(downstream)流动。所有 报文的 发送者都在 接收者的上游(upstream)。
2. 报文语法
所有的 HTTP 报文 都可以分为 两类:请求报文(request message)和 响应报文(response message)。它们由三个部分组成:对报文进行 描述的 起始行(start line)、包含属性的 首部(header)块,以及可选的、包含 数据的 主体(body)部分。

请求报文会向 Web 服务器 请求一个动作。响应报文会 将请求的结果 返回给 客户端。请求和响应报文的 基本报文结构 相同。


三、TCP连接
世界上几乎所有的 HTTP 通信 都是由 TCP/IP 承载的,TCP/IP 是全球计算机 及 网络设备 都在使用的一种常用的 分组交换网络分层 协议集。客户端 应用程序 可以 打开一条 TCP/IP 连接,连接到 可能运行 在世界任何地方 的服务器 应用程序。一旦 连接建立 起来了,在客户端 和 服务器的 计算机之间交换的 报文 就永远 不会丢失、受损或失序。
连接步骤简述:
第(1)~(3)步 会将 服务器的 IP 地址 和 端口号从 URL 中分离出来。在 第(4)步 中 建立到Web 服务器的 TCP 连接,并在 第(5)步 通过 这条连接 发送一条 请求报文。在 第(6)步 读取响应,并在 第(7)步 关闭连接。
1. TCP传输方式
TCP 为 HTTP 提供了 一条可靠的 比特传输管道。从 TCP 连接一端填入的字节 会从 另一端以 原有的顺序、正确地 传送出来。

TCP 的数据是 通过名为 IP分组(或 IP 数据报)的 小数据块 来发送的。HTTP 就是 “HTTP over TCP over IP” 这个 “协议栈” 中的最顶层。其安全版本 HTTPS 就是在 HTTP 和 TCP 之间插入了一个(称为 TLS 或 SSL 的)密码加密层。

HTTP 要传送 一条报文 时,会以 流的形式 将报文数据的 内容 通过一条 打开的 TCP 连接 按序传输。TCP 收到数据流 之后,会 将数据流砍成 被称作段的 小数据块,并 将段封装在 IP 分组中,通过因特网 进行传输。
所有 这些工作都是由 TCP/IP 软件 来处理的,HTTP 程序员什么都看不到。

每个 TCP 段 都是由 IP 分组 承载,从一个 IP 地址 发送到 另一个 IP 地址 的。每个 IP 分组 中都包括:一个IP分组首部、一个TCP段首部、 一个TCP数据块。
IP 首部 包含了 源目的 IP 地址、长度和其他一些标记。TCP 段 的首部包含了 TCP 端口号、TCP 控制标记,以及 用于数据排序 和 完整性检查的 一些数字值。
2. TCP连接状态
在任意时刻 计算机 都可以 有几条 TCP 连接 处于 打开状态。TCP 是通过 端口号 来保持 所有 这些连接持续 不断地运行。IP 地址 可以将你连接到 正确的计算机,而 端口号 则可以 将你连接到 正确的应用程序上去。
TCP连接是通过 4 个 值来识别的:
<源IP地址、源端口号、目的IP地址、目的端口号>
这 4 个值 一起唯一地 定义了 一条连接。两条不同的 TCP 连接 不能拥有 4 个完全相同 的地址组件值(但不同连接的部分组件可以拥有相同的值)。


3. 套接字
套接字 API 允许用户创建 TCP 的端点 数据结构,将 这些端点 与 远程服务器的 TCP 端点 进行连接,并 对数据流进行 读写。TCP API 隐藏了 所有底层网络协议的 握手细节,以及 TCP 数据流 与 IP 分组之间的 分段 和 重装细节。


上图中,客户端根据 URL 判定出 IP 地址 和 端口号,并建立一条 到服务器的 TCP 连接(C3)。建立连接可能要 花费一些时间,时间 长短取决于 服务器距离的 远近、服务器的 负载情况,以及 因特网的 拥挤程度。
一旦建立了连接,客户端 就会发送 HTTP请求(C5),服务器 则会 读取请求(S6)。一旦服务器 获取了 整条 请求报文,就会 对请求 进行处理,执行 所请求的 动作(S7),并 将数据写回 客户端。客户端 读取数据(C6),并对 响应数据 进行处理(C7)。
4. TCP连接三次握手

- 请求新的 TCP 连接时,客户端要向服务器 发送一个 小的 TCP 分组。这个 分组中 设置了一个特殊的 SYN 标记,说明这是一个连接请求(a)。
- 如果 服务器接受了 连接,就会 对一些连接参数 进行计算,并向 客户端 回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记 都被置位,说明连接请求 已被接受(b)。
- 最后,客户端 向服务器 回送一条 确认信息,通知它 连接已 成功建立(c)。现代的 TCP 栈 都允许客户端 在这个确认分组中 发送数据。
HTTP 程序员 永远 不会看到这些分组——这些分组都由 TCP/IP 软件管理,对其是 不可见的。HTTP 程序员 看到的 只是创建 TCP 连接时 存在的时延。
相关文章:
【Linux篇】Http协议(1)(笔记)
目录 一、http基本认识 1. Web客户端和服务器 2. 资源 3. URI 4. URL 5. 事务 6. 方法 7. 状态码 二、HTTP报文 1. 报文的流动 (1)流入源端服务器 (2)向下游流动 2. 报文语法 三、TCP连接 1. TCP传输方式 2. TCP连…...
员工疯狂打CALL!解锁企业微信新玩法,2024年必学秘籍来啦!
现在工作离不开电脑手机,公司交流也得用新招。腾讯出了个企业微信,就是给公司用的聊天工具。它功能强大,操作简便,很多公司用它来让工作更高效,团队合作更紧密。接下来,我会简单说说怎么上手企业微信&#…...
Spring boot从0到1 - day01
前言 Spring 框架作为 Java 领域中最受欢迎的开发框架之一,提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。 学习目标 Spring 基础 Spring框架是什么?Spring IoC与Aop怎么理解? Spring Boot 的快速构建 Spring 基础 学习…...
Flutter 项目结构的区别
如果需要调用原生代码,请创建一个plugin类型的项目开发。如果需要调用C语言,请参考文档:Flutter项目中调用C语言plugin 其实是 package 的一种,全称是 plugin package,我们简称为 plugin,中文叫插件。 1. A…...
EfficientFormerV2:重新思考视觉变换器以实现与MobileNet相当的尺寸和速度。
摘要 https://arxiv.org/pdf/2212.08059 随着视觉变换器(ViTs)在计算机视觉任务中的成功,近期的研究尝试优化ViTs的性能和复杂度,以实现在移动设备上的高效部署。提出了多种方法来加速注意力机制,改进低效设计…...
ASP.NET Core高效管理字符串集合
我们在开发 Web 项目时经常遇到需要管理各种来源的字符串集合(例如HTTP 标头、查询字符串、设置的值等)的情况。合理的管理这些字符串集合不仅可以减少出bug的几率,也能提高应用程序的性能。ASP.NET Core 为我们提供了一种特殊的只读结构体 S…...
vm-tools的卸载重装,只能复制粘贴,无法拖拽文件!
开始 ubuntu22.04 LTSVMwareTools-10.3.25-20206839.tar.gzVMware Workstation 17 Pro 各种该尝试的配置都尝试了,比如: 1.开启复制粘贴拖拽; 2.VMware Tools拖拽失效; 3.解决VMware无法拖拽. 均没有奏效. 安装过程报错, 报错异常: The installation of VMware Tools 10.3.25…...
Docker 容器网络技术
Docker 容器网络技术 一、概述 Docker 容器技术在微服务架构和云原生应用中扮演着重要角色。容器的轻量化和快速启动特性,使得它们成为现代应用部署的首选。然而,容器的网络连接和管理是一个复杂的问题,尤其是当涉及到容器间通信时。Docker…...
C++ 起始帧数、结束帧数、剪辑视频
C 指定起始帧数、结束帧数、 剪辑视频 C 无法直接用H264,只能用avi编码格式 #include <iostream> #include <opencv2/opencv.hpp>int main() {// 读取视频:创建了一个VideoCapture对象,参数为摄像头编号std::string path &quo…...
【项目一】基于pytest的自动化测试框架———解读requests模块
解读python的requests模块 什么是requests模块基础用法GET与POST的区别数据传递格式会话管理与持久性连接处理相应结果应对HTTPS证书验证错误处理与异常捕获 这篇blog主要聚焦如何使用 Python 中的 requests 模块来实现接口自动化测试。下面我介绍一下 requests 的常用方法、数…...
升级Ubuntu内核的几种方法
注意: Ubuntu主线内核由 Ubuntu 内核团队提供,用于测试和调试目的。 它们不受支持且不适合生产使用。 仅当它们可以解决当前内核遇到的关键问题时,才应该安装它们。 1、手动下载deb文件升级内核 来源:kernel.ubuntu.com/main…...
Android绘制靶面,初步点击位置区域划分取值测试
自定义View: public class TargetView extends View {private Paint paint;private int[] radii {100, 250, 400, 550, 700}; // 五个圆的半径private int numberOfSegments 8;private int[][] regionValues; // 存储每个区域的值public TargetView(Context cont…...
【SpringBoot】调度和执行定时任务--Quartz(超详细)
Quartz 是一个功能强大的任务调度框架,广泛用于在 Java 应用程序中定时执行任务,同时它支持 Cron 表达式、持久化任务、集群等特性。以下是 Quartz 的详细使用教程,包括安装、基本概念、简单示例和高级功能。 1. 安装 Quartz 首先ÿ…...
低代码开发平台系统架构概述
概述 织信低代码开发平台(产品全称:织信Informat)是一款集成了应用设计、运行与管理的综合性平台。它提供了丰富的功能模块,帮助用户快速构建、部署和维护应用程序。织信低代码平台通过集成丰富的功能模块,为用户提供…...
源码编译llama.cpp 、ggml 后端启用自定义BLAS加速
源码编译llama.cpp 、ggml 后端启用自定义BLAS加速 我在llama.cpp 官网上提交了我的解决方案:How to setup OpenBlas on windows? #625 GGML 官网 https://github.com/ggerganov/ggml/issues/959 windows on arm 编译 llama.cpp 、ggml 后端启用自定义BLAS加速 …...
glb数据格式
glb数据格式 glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小 浏览 浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费 glTF Viewer (donmccurdy.com) glb…...
手语识别系统源码分享
手语识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …...
Oracle 数据库部署与实施
文章目录 1. macOS 上部署 Oracle 数据库通过 Docker 在 macOS 上部署 2. Linux 上部署 Oracle 数据库直接在 Linux 上部署通过 Docker 在 Linux 上部署 3. Windows 上部署 Oracle 数据库4. 使用 Docker 部署 Oracle 数据库前提条件拉取 Oracle 数据库 Docker 镜像运行 Oracle …...
【Python】 ast.literal_eval 与 eval
一、背景 我在在编写管理后台的过程中,遇到一个小问题,是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中,并且还保留了b这样的形式,具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空…...
SMUDebugTool硬件调试工具全解析:从问题定位到安全实践
SMUDebugTool硬件调试工具全解析:从问题定位到安全实践 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…...
捉妖雷达Web版:如何解决游戏数据实时同步的技术挑战?
捉妖雷达Web版:如何解决游戏数据实时同步的技术挑战? 【免费下载链接】zhuoyao_radar 捉妖雷达 web版 项目地址: https://gitcode.com/gh_mirrors/zh/zhuoyao_radar 捉妖雷达Web版是一个开源的游戏辅助工具项目,旨在为捉妖游戏玩家提供…...
Windows 11终极优化指南:用Win11Debloat免费提升51%系统性能
Windows 11终极优化指南:用Win11Debloat免费提升51%系统性能 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简…...
终极Neovim AI助手:Avante.nvim如何彻底改变你的编码体验 [特殊字符]
终极Neovim AI助手:Avante.nvim如何彻底改变你的编码体验 🚀 【免费下载链接】avante.nvim Use your Neovim like using Cursor AI IDE! 项目地址: https://gitcode.com/GitHub_Trending/ava/avante.nvim 在当今AI驱动的开发时代,Neov…...
Uncertainty-Aware Pixel-Level Contrastive Learning for Enhanced Semi-Supervised Medical Image Segmen
1. 医学图像分割的挑战与半监督学习机遇 医学图像分割一直是计算机视觉领域的重要研究方向,它能够帮助医生快速定位病灶区域,提高诊断效率。但在实际应用中,我们常常面临标注数据稀缺的问题——专业医生标注一张CT或MRI图像可能需要数小时&am…...
科研党效率翻倍:Texmaker这些隐藏功能让你的论文排版快人一步
Texmaker科研效率革命:解锁高阶玩家的12个生产力加速器 在深夜实验室的灯光下,你盯着屏幕上纠缠不清的LaTeX代码,参考文献格式突然崩溃,数学公式编号混乱不堪——这场景是否似曾相识?Texmaker作为LaTeX编辑器的隐藏冠军…...
March7thAssistant智能工具:3步解锁星穹铁道全场景效率提升方案
March7thAssistant智能工具:3步解锁星穹铁道全场景效率提升方案 【免费下载链接】March7thAssistant 🎉 崩坏:星穹铁道全自动 Honkai Star Rail 🎉 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 每天登…...
拓扑排序不止于理论:用邻接矩阵实现时,我踩过的3个坑和性能优化
拓扑排序实战:邻接矩阵实现中的性能陷阱与优化策略 邻接矩阵作为图论中最直观的存储结构,常被初学者用来实现拓扑排序算法。但当我们真正将其投入实际项目时,往往会遭遇意想不到的性能瓶颈和逻辑陷阱。本文将分享三个真实项目中踩过的坑&…...
从Bootloader到App的优雅跳转:关键步骤与实战解析
1. 为什么需要Bootloader跳转App? 在嵌入式开发中,Bootloader和App的关系就像电脑的BIOS和操作系统。Bootloader负责硬件初始化、固件更新等底层工作,而App则是实现具体业务逻辑的主程序。两者分工明确,但最终需要无缝衔接。 我遇…...
四旋翼无人机PID控制实战:从零搭建Matlab仿真模型(附完整代码)
四旋翼无人机PID控制实战:从零搭建Matlab仿真模型(附完整代码) 当第一次看到四旋翼无人机在空中灵活翻转、精准悬停时,很多人都会被这种看似违反物理直觉的飞行姿态所震撼。作为现代控制理论最生动的应用场景之一,无人…...


