刨析HTTP

是什么让HTTP成为互联网的流量担当?简单高效!

是什么让HTTP/1.1二十多年依旧活力四射?简单高效!

但恰恰是因为HTTP简单高效,导致很多开发者对其视而不见。老张之所以把HTTP报文放在《Web开发进阶》的第二篇,正是因为“千里之行,始于足下”。理解不了HTTP报文,Web开发始终会处在云里雾里,知其然而不知其所以然。

01

概述

诞生于上世纪九十年代初的HTTP协议,如今已经迎来而立之年,期间有过多个版本的更迭。最新的是去年推出的HTTP/3.0,应用最广泛的却是二十多年前的HTTP/1.1。

版本
时间点
HTTP/0.9
1900
HTTP/1.0
1996
HTTP/1.1
1999
HTTP/2.0
2014
HTTP/3.0
2019

简单高效是一剂猛药,但也并非没有副作用,恰恰因为其HTTP/1.1版本的简单高效导致其二十多年驻足不前。可能有小伙伴经常在技术网站看到过于HTTP/2.0,甚至是HTTP/3.0的讨论,但残酷的是嘴上都说HTTP/2.0怎么怎么高效,但是实际应用还是摆脱不了HTTP/1.1的真香定律。所以今天老张介绍的也是以HTTP/1.1为主。

说了这么多的HTTP简单,到底有多简单呢?

请求,响应,没了……

因为HTTP协议是基于TCP的应用协议,而TCP协议是可靠通信,所以完全可以将HTTP通信简单的看作一来一往的两条数据流,甚至HTTP报文都是基于文本而不是二进制的。下面老张将分别介绍一下请求报文和响应报文。

7层网络模型和4层网络模型

02


请求报文

HTTP请求报文结构

一条HTTP请求报文有三部分构成:请求行,请求头,请求体。其中请求体是可选的。

请求行

请求行位于HTTP请求的开始,由请求方法、请求地址和使用的HTTP协议版本组成,它们之间通过空格分隔,最后用回车换行(\r\n)结束。上图中使用的请求方法是GET(比较常见的还有POST),请求的地址为http://www.example.com/index.html,使用的协议版本为HTTP/1.1。

请求头

请求头由多个Key: Value形式组合而成,它们之间通过回车换行分割,最后通过两个连续的回车换行标识请求头的结束。

请求体一般出现POST或者PUT方式的请求中,其本身并不是请求报文的必须部分,这里老张不多介绍,现在一块来看一下一个完整的请求报文。

注意最后的光标

    

03


响应报文

HTTP响应报文结构

同请求报文一样,响应报文也是有三部分构成:响应行、响应头和响应体

响应行

响应行同样由三部分组成,但是又与请求行有所区别,分别是响应协议,响应状态码和响应描述,以回车换行标识结束。上图的响应行表示,服务器使用的HTTP版本是1.1,状态码200和状态描述OK表示正常生成了响应数据。

响应头

同请求头一样,应头也是一组Key:Value的组合,最后以两个连续的回车换行标识响应头的结束。

响应体

响应体就是服务器返回给客户端的网络资源了,上图表示服务器返回了一条HTML格式的数据。

现在再来看一下一条完整的响应报文。

可以看到响应头和响应体之间多了一个空行

04


结语

整个流程在浏览器的展示

看完了老张的介绍,相信各位肯定也理解了HTTP协议的本质——请求+响应。

下一篇老张准备在本文的基础上介绍一下爬虫以及如何应对“流氓爬虫”。

在看点这里

### C# 的深入分与高级特性 #### 1. 中间语言 (Intermediate Language, IL) 的重要性及其原理 C# 编写的源代码会被编译成一种名为 Microsoft Intermediate Language (MSIL 或简称 IL) 的中间表示形式[^1]。这种中间语言是 .NET 平台的核心组成部分之一,它允许不同语言(如 C#、VB.NET 等)编写的应用程序共享相同的运行环境。以下是关于 IL 的几个关键点: - **跨平台兼容性**:由于所有的 .NET 支持的语言最终都会被转换为 IL,因此它们可以在任何安装有 CLR(Common Language Runtime)的平台上运行。 - **安全性增强**:CLR 负责验证和执行 IL 代码,从而提供内存管理和类型安全等功能。 - **动态加载能力**:IL 文件可以由 JIT(Just-In-Time Compiler)即时编译为本地机器码并执行。 #### 2. 异常处理机制详解 异常处理是构建健壮应用程序的重要部分,在 C# 中提供了强大的工具来管理错误情况。其核心组件包括 `try`、`catch` 和 `finally` 关键字[^2]。下面是一些更深层次的概念和技术细节: - **自定义异常类**:开发者可以通过继承 System.Exception 类创建自己的异常类型,以便更好地描述特定业务场景下的问题。 - **性能考量**:虽然抛出异常是一种有效的控制流手段,但它通常伴随着较高的计算成本;因此建议只用于真正意外的情况下而非常规流程控制。 ```csharp public class CustomException : Exception { public CustomException(string message): base(message){ // 可在此处添加额外属性或方法 } } ``` #### 3. 循环结构优化策略 对于提升算法效率而言,精心设计循环至关重要。通过减少不必要的迭代次数或者采用更适合数据特性的遍历方式能够带来明显改善效果。例如利用 LINQ 查询简化集合操作过程就是一个很好的例子。 ```csharp var numbers = Enumerable.Range(0, 10); int sumOfSquares = numbers.Where(n => n % 2 == 0).Sum(x => x * x); Console.WriteLine($"The Sum of Squares is {sumOfSquares}"); ``` #### 4. Common Language Runtime (CLR) 工作原理简介 CLR 是整个 .NET 生态系统的基石,负责管理应用生命周期中的各个方面,比如垃圾回收(Garbage Collection), 安全性和多线程支持等等。其中一个重要方面是如何解释执行 MSIL/IL 字节码文件[^3]: - 当一个程序启动时,CLR 加载相应的程序集,并将其解为目标架构上的具体指令序列; - 此外还存在多种辅助功能模块共同协作完成整体任务——例如元数据存储区用来保存有关类型的全面信息供反射服务调用等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值