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

【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连接三次握手

  1.   请求新的 TCP 连接时,客户端要向服务器 发送一个 小的 TCP 分组。这个 分组中 设置了一个特殊的 SYN 标记,说明这是一个连接请求(a)。
  2.   如果 服务器接受了 连接,就会 对一些连接参数 进行计算,并向 客户端 回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记 都被置位,说明连接请求 已被接受(b)。
  3.   最后,客户端 向服务器 回送一条 确认信息,通知它 连接已 成功建立(c)。现代的 TCP 栈 都允许客户端 在这个确认分组中 发送数据。

        HTTP 程序员 永远 不会看到这些分组——这些分组都由 TCP/IP 软件管理,对其是 不可见的。HTTP 程序员 看到的 只是创建 TCP 连接时 存在的时延。

相关文章:

【Linux篇】Http协议(1)(笔记)

目录 一、http基本认识 1. Web客户端和服务器 2. 资源 3. URI 4. URL 5. 事务 6. 方法 7. 状态码 二、HTTP报文 1. 报文的流动 &#xff08;1&#xff09;流入源端服务器 &#xff08;2&#xff09;向下游流动 2. 报文语法 三、TCP连接 1. TCP传输方式 2. TCP连…...

员工疯狂打CALL!解锁企业微信新玩法,2024年必学秘籍来啦!

现在工作离不开电脑手机&#xff0c;公司交流也得用新招。腾讯出了个企业微信&#xff0c;就是给公司用的聊天工具。它功能强大&#xff0c;操作简便&#xff0c;很多公司用它来让工作更高效&#xff0c;团队合作更紧密。接下来&#xff0c;我会简单说说怎么上手企业微信&#…...

Spring boot从0到1 - day01

前言 Spring 框架作为 Java 领域中最受欢迎的开发框架之一&#xff0c;提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。 学习目标 Spring 基础 Spring框架是什么&#xff1f;Spring IoC与Aop怎么理解&#xff1f; Spring Boot 的快速构建 Spring 基础 学习…...

Flutter 项目结构的区别

如果需要调用原生代码&#xff0c;请创建一个plugin类型的项目开发。如果需要调用C语言&#xff0c;请参考文档&#xff1a;Flutter项目中调用C语言plugin 其实是 package 的一种&#xff0c;全称是 plugin package&#xff0c;我们简称为 plugin&#xff0c;中文叫插件。 1. A…...

EfficientFormerV2:重新思考视觉变换器以实现与MobileNet相当的尺寸和速度。

摘要 https://arxiv.org/pdf/2212.08059 随着视觉变换器&#xff08;ViTs&#xff09;在计算机视觉任务中的成功&#xff0c;近期的研究尝试优化ViTs的性能和复杂度&#xff0c;以实现在移动设备上的高效部署。提出了多种方法来加速注意力机制&#xff0c;改进低效设计&#xf…...

ASP.NET Core高效管理字符串集合

我们在开发 Web 项目时经常遇到需要管理各种来源的字符串集合&#xff08;例如HTTP 标头、查询字符串、设置的值等&#xff09;的情况。合理的管理这些字符串集合不仅可以减少出bug的几率&#xff0c;也能提高应用程序的性能。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 容器技术在微服务架构和云原生应用中扮演着重要角色。容器的轻量化和快速启动特性&#xff0c;使得它们成为现代应用部署的首选。然而&#xff0c;容器的网络连接和管理是一个复杂的问题&#xff0c;尤其是当涉及到容器间通信时。Docker…...

C++ 起始帧数、结束帧数、剪辑视频

C 指定起始帧数、结束帧数、 剪辑视频 C 无法直接用H264&#xff0c;只能用avi编码格式 #include <iostream> #include <opencv2/opencv.hpp>int main() {// 读取视频&#xff1a;创建了一个VideoCapture对象&#xff0c;参数为摄像头编号std::string path &quo…...

【项目一】基于pytest的自动化测试框架———解读requests模块

解读python的requests模块 什么是requests模块基础用法GET与POST的区别数据传递格式会话管理与持久性连接处理相应结果应对HTTPS证书验证错误处理与异常捕获 这篇blog主要聚焦如何使用 Python 中的 requests 模块来实现接口自动化测试。下面我介绍一下 requests 的常用方法、数…...

升级Ubuntu内核的几种方法

注意&#xff1a; Ubuntu主线内核由 Ubuntu 内核团队提供&#xff0c;用于测试和调试目的。 它们不受支持且不适合生产使用。 仅当它们可以解决当前内核遇到的关键问题时&#xff0c;才应该安装它们。 1、手动下载deb文件升级内核 来源&#xff1a;kernel.ubuntu.com/main…...

Android绘制靶面,初步点击位置区域划分取值测试

自定义View&#xff1a; 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 是一个功能强大的任务调度框架&#xff0c;广泛用于在 Java 应用程序中定时执行任务&#xff0c;同时它支持 Cron 表达式、持久化任务、集群等特性。以下是 Quartz 的详细使用教程&#xff0c;包括安装、基本概念、简单示例和高级功能。 1. 安装 Quartz 首先&#xff…...

低代码开发平台系统架构概述

概述 织信低代码开发平台&#xff08;产品全称&#xff1a;织信Informat&#xff09;是一款集成了应用设计、运行与管理的综合性平台。它提供了丰富的功能模块&#xff0c;帮助用户快速构建、部署和维护应用程序。织信低代码平台通过集成丰富的功能模块&#xff0c;为用户提供…...

源码编译llama.cpp 、ggml 后端启用自定义BLAS加速

源码编译llama.cpp 、ggml 后端启用自定义BLAS加速 我在llama.cpp 官网上提交了我的解决方案&#xff1a;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 文件&#xff0c;文件按照二进制存储&#xff0c;占空间小 浏览 浏览glb工具的很多&#xff0c;ccs&#xff0c;3D查看器等都可以&#xff0c;不安装软件的话用下面网页加载就可以&#xff0c;免费 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

一、背景 我在在编写管理后台的过程中&#xff0c;遇到一个小问题&#xff0c;是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中&#xff0c;并且还保留了b这样的形式&#xff0c;具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;&#xff0c;顾名思义就是释放垃圾占用的空…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...