写在前面:本文仅供个人学习使用,如有侵权,请联系删除。文章中所用图片绝大多数来源于《图解HTTP》,请读者支持原版。

文章目录

  • 第 2章 简单的HTTP协议
    • 2.1 HTTP协议用于客户端和服务器端之间的通信
    • 2.2 通过请求和响应的交换达成通信
    • 2.3 HTTP是不保存状态的协议
    • 2.4 请求URI定位资源
    • 2.5 告知服务器意图的HTTP方法
    • 2.6 使用方法下达命令
    • 2.7 持久连接节省通信量
      • 2.7.1 持久连接
      • 2.7.2 管线化
    • 2.8 使用Cookie的状态管理

本章将针对HTTP协议结构进行讲解,主要使用HTTP/1.1版本。学完这章,想必大家就能理解HTTP协议的基础了。

第 2章 简单的HTTP协议

2.1 HTTP协议用于客户端和服务器端之间的通信

HTTP协议和TCP/IP协议族内的其他众多协议相同,用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。

在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定有一端是客户端,另一端则是服务器端。

有时候,按实际情况,两台计算机作为客户端和服务器端的角色有可能会互换。但就仅从一条通信路线来说,服务器端和客户端的角色是确定的,而用HTTP协议能够明确区分哪端是客户端,哪端是服务器端。

2.2 通过请求和响应的交换达成通信


HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

下面,我们来看一个具体的例子。

下面则是从客户端发送给某个HTTP服务器端的请求报文中的内容。

GET /index.htm  HTTP/1.1
Host:hachr.jp

起始行开头的GET表示请求访问服务器的类型,称为方法(method)。随后的字符串index.htm指明了请求访问的资源对象,也叫做请求URI(request-URI)。最后的HTTP/1.1,即HTTP的版本号,用来提示客户端使用的HTTP协议功能。

综合来看,这段请求内容的意思是:请求访问某台HTTP服务器上的/index.htm页面资源。

请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。

请求首部字段及内容实体稍后会作详细说明。接下来,我们继续讲解。接收到请求的服务器,会将请求内容的处理结果以响应的形式返回。

在起始行开头的HTTP/1.1 表示服务器对应的HTTP版本。

紧挨着的200 OK 表示请求的处理结果的状态码(status code) 和原因短语(reason-phrase) 。下一行显示了创建响应的日期时间,是首部字段(header field) 内的一个属性。

接着以一空行分隔,之后的内容称为资源实体的主体(entity body).

响应报文基本上由协议版本状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语可选的响应首部字段以及实体主体构成。

2.3 HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。


使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事物,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。

可是,随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录一家购物网站,即使他跳转到该站的其他页面后,也需要继续保持登陆状态。针对这个实例,网站为了能够掌握是谁发送的请求,需要保存用户的状态。

HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。有关Cookie的详细内容稍后讲解。

2.4 请求URI定位资源

HTTP协议使用URI定位互联网上的资源。正是因为URI的特定功能,在互联网上任意位置的资源都能访问到。

当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。指定请求URI的方式有很多。

  • URI为完整的请求URI,比如GET http://hackr.jp/index.htm HTTP/1.1
  • 在首部字段Host中写明网络域名或IP地址。比如GET/index.htm HTTP/1.1 Host:hackr.jp

除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求URI。下面这个例子是查询HTTP服务器端支持的HTTP方法种类。

OPTIONS * HTTP/1.1

2.5 告知服务器意图的HTTP方法

下面,我们将介绍HTTP/1.1中可使用的方法。

GET:获取资源

GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口) 那样的程序,则返回经过执行后的输出结果。


使用GET方法的请求·响应的例子

POST:传输实体主体
POST方法用来传输实体的主体。
虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET类似,但是POST的主要目的并不是获取响应的主体内容。

使用POST方法请求·响应的例子

PUT:传输文件

PUT方法用来传输文件。 就像FTP协议的文件一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。

但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。

使用PUT方法请求·响应的例子

这里的响应是指:请求执行成功了,但是无数据返回。

HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认RUI的有效性及资源更新的日期时间等。

使用HEAD方法的请求·响应的例子

DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。
但是HTTP/1.1的DELETE方法本身与PUT一样不带验证机制,所以一般的WEb网站也不使用DELETE方法。当配合Web应用程序的验证机制,或者遵守REST标准时还是有可能开放使用的。

OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

使用OPTIONS方法的请求·响应例子

TRACE:追踪路径

TRACE方法是让Web服务器端将之前的请求通信返回给客户端的方法。

发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK 的响应。

客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。

但是,TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪) 攻击,通常就更不会使用了。


使用TRACE请求·响应的例子

CONNECT:要求用隧道协议连接代理

CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

CONNECT方法的格式如下所示

CONNECT 代理服务器名:端口号  HTTP版本

使用CONNECT方法请求·响应的例子

2.6 使用方法下达命令

向请求URI指定的资源发送请求报文时,采用称为方法的命令。

方法的作用在于,可以指定请求的资源按期望产生某种行为。方法中有GET、POST和HEAD等


上面我们给出了方法名和用法。方法名区分大小写,注意要用大写字母。

2.7 持久连接节省通信量

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。

以当年的通信情况来看,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,文档中包含大量图片的情况多了起来。

比如,使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。

2.7.1 持久连接

为解决上述TCP连接的问题,HTTP/1.1和一部分HTTP/1.0想出来持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。

持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提高了。

在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1.0内并未标准化。虽然有一部分服务器通过非标准的手段实现了持久连接,但服务器端不一定能够支持持久连接。毫无疑问,除了服务器端,客户端也需要支持持久连接。

2.7.2 管线化

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需要等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应也可以直接发送下一个请求。

这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

比如,当请求一个包含10张图片的HTML Web页面,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还要快。请求数越多,时间差就越明显。

2.8 使用Cookie的状态管理

HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。

假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面就要再次登录,或者要在每次请求报文中附加参数来管理登陆状态。

不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗。从另一侧面来说,也正是因为HTTP协议本身是非常简单的,所以才会被应用在各种场景里。


保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

Cookie会根据从服务器发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后再发送出去。

服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

下图展示了发生Cookie交互的情景。


HTTP请求报文和响应报文的内容如下

《图解HTTP》读书笔记--第2章简单的HTTP协议相关推荐

  1. 图解HTTP读书笔记(十)

    图解HTTP读书笔记(十) Web的攻击技术 HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用资源才是攻击目标. ...

  2. PMP读书笔记(第2章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第二章 项目运行环境 2.1 概述 2.2 事业环境因素 2.2.1 组织内部的事业环境因素 2.2.2 组织外部的事业环境因素 2.3 组织 ...

  3. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  4. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  5. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

  6. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  7. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  8. 《Python从入门到实践》读书笔记——第五章 if语句

    <Python从入门到实践>读书笔记--第五章 if语句 1. 一个简单示例 cars = ['audi', 'bwm', 'subaru', 'toyota']for car in ca ...

  9. 《Spring实战》读书笔记-第4章 面向切面的Spring

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

最新文章

  1. pandas读取文件
  2. 织梦dedecsm系统企业简介类单栏目模版如何修改和调用
  3. 介绍Portable PDB
  4. js和php能生成一样的随机数_JavaScript_JS生成某个范围的随机数【四种情况详解】,前言: JS没有现成的函数,能 - phpStudy...
  5. flask 获取前端form内容_flask 项目中使用 bootstrapFileInput(进阶篇)
  6. vs2005常用的调试方法
  7. Python编写:好友管理系统
  8. Kotlin-Android-Extensions:不仅仅是替代findViewById
  9. 深度图像确定目标距离_技术交流一种距离选通水下激光成像系统设计与实验研究...
  10. 华为交换机释放vlanif接口DHCP地址池下ip命令
  11. 学习js的第十三天【事件的绑定方式,执行方式】
  12. 电脑安装不上chrome浏览器
  13. android常见线程简要分析
  14. Kobe -接小球游戏
  15. PDF如何删除页面?批量删除不连续页的方法
  16. 【考试记录】Apsara Clouder基础技能认证:阿里巴巴编码规范(Java)
  17. aquarius_v13
  18. android图片显示的方向问题
  19. vanilla-tilt.js平滑3D倾斜库的使用
  20. VirtualBox网络连接方式学习笔记

热门文章

  1. Tableau10.0学习随记-分组问题
  2. c++函数不写return可以吗_Science: 高剂量的维生素C可以抗癌吗?
  3. htmlcss实例小项目_HTMLCSS学习笔记(十九)-- 媒体查询
  4. stopstart按钮怎么用_烟雾报警器一直响吵人!怎么彻底给关掉?
  5. 【STM32】FreeRTOS 系统配置
  6. 【数理知识】《矩阵论》方保镕老师-第8章-矩阵在数学内外的应用
  7. STM32的8种GPIO输入输出模式深入详解
  8. 【导纳分析】基于FPGA的导纳分析仪的verilog设计
  9. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindrome
  10. 这个男人让你的爬虫开发效率提升8倍