文章目录
- 引言
- 正文
- HTTP报文
- 请求行
- 首部行
- 实体体
- 其他方法
- HTTP响应报文
- 实体体和初始状态行
- 首部行
- cookie
- cookie的运行过程
- Web缓存
- 条件GET方法
引言
计算机网络在这一学科中的重要性毋庸置疑,而黑皮书又是这一学科的教科书级经典,因此本书是计算机从业者的必读书之一。笔者用一个专栏来精炼这本书的知识,帮助想了解这方面知识的同学快速打下基础。
在该专栏中,笔者不会严格按照章节的顺序来讲述,而是会直接列出知识点并进行介绍,以帮助大家理解。
1.1-1.3节
1.4-1.7节
2.1-2,2节
正文
HTTP报文
一个典型的HTTP请求报文格式如下:
第一行称为请求行,余下的行称为首部行。
请求行
请求行包括方法字段,URL字段,HTTP版本字段
- 方法字段:这个报文采取的动作,包括GET、POST、HEAD、DELETE、PUT,根据英文应该也能大概猜出这些单词代表的动作。GET代表请求。
- URL字段:这个字段里的东西是方法字段的宾语。举例来说,当方法是GET时,URL字段中的就是请求的对象。
- HTTP版本字段:使用的HTTP是何版本。
首部行
- 第一行指明了所请求的对象所在的主机
- 第二行说明这条连接是一个非持续连接,即对象送到后就关闭这条连接
- 第三行指明用户代理,即向服务器发生这条报文的浏览器的类型
- 第四行指明希望服务器返回这个对象的法语版本(如果有这个版本),默认版本是英语版本
实体体
在首部行之后还可以加上一个实体体字段,如图所示:
实体体字段一般用于POST方法,存储给服务器的数据。
其他方法
HEAD方法:单纯发送一个请求报文,让服务器进行响应但不返回请求对象,常用于开发时调试跟踪
PUT方法:向服务器上传对象。
DELETE方法:删除服务器上的对象
HTTP响应报文
这个报文包括一个初始状态行,6个首部行和实体体。
实体体和初始状态行
实体体包含的是所请求的对象。
初始状态行包括协议版本字段、状态码、相应状态信息。
常见的状态码:
- 200 OK:一切正常
- 301 Moved Permanently:请求对象不在原来的URL地址,新的URL在响应报文的Location首部行中
- 400 Bad Request:出错了,该报文不能被服务器理解
- 404 Not Found:请求的对象没找到
- 505 HTTP Version Not Supported:顾名思义,服务器不支持报文的HTTP协议版本
首部行
我们解释请求报文中没有被提到过的部分:
- Date:服务器发送报文的时间
- Server:发送的服务器
- Last-Modified:所请求的对象最后更改的时间
- Content-Length:所请求对象的字节数
- Content-Type:所请求对象的类型
cookie
cookie技术用来服务器确定曾经访问过的客户。cookie技术包括四个部分:
- HTTP响应报文中的cookie首部行
- HTTP请求报文中的cookie首部行
- 端系统中的一个cookie文件,用来保存这个客户访问过的所有服务器为这个客户设置的cookie
- Web站点的后端数据库,用来保存所有客户的cookie
cookie的运行过程
- 客户初次访问服务器
- 服务器创建1678的ID作为这个客户的cookie
- 服务器将这个新的cookie和这个客户的信息一起存放在Web站点的后端数据库中
- 客户把接收到的cookie放在他的cookie文件中
- 客户再一次访问同一个站点时,会将这个站点为它设置的cookie附带在首部行中,由此服务器知道这是上次访问过的一个客户,可以在数据库中调用它的信息
Web缓存
Web缓存器(代理服务器)用一种巧妙的方式减少了网络时延和成本。我们用例子来说明:
有一台缓存器时,客户请求对象的步骤如下:
- 客户向缓存器请求对象
- 缓存器寻找有没有这个对象。如果有,那么用下面即将讲到的条件GET方法向服务器确认这个对象是否是最近版本并选择性修改;如果没有,那么直接向服务器请求
- 缓存器向客户发送该对象,同时如果是被修改或新增的对象,那么缓存器存储一个该对象的副本以便下次发送
条件GET方法
缓存器为了确认存储的对象是否是最近版本,会向服务器发送一个条件GET方法请求报文进行确认。这个报文中包含一个Last-Modified首部行:
这个首部行包含的是在缓存器中这个对象最后一次被修改的时间。服务器收到这个报文后:
- 服务器用这个时间和这个对象在服务器中最新被修改的时间进行比对。
- 如果发现缓存器中的对象已经是最新版本了,那么它返回一个不带对象的HTTP响应报文;如果不是最新版本,那么服务器将最新版本的对象存储在HTTP响应报文的实体体字段中进行发送。
用这样的方式,缓存器可以保证发送的是最新版本的对象。