前言

这个系列的博客是针对阅读《网络是怎样连接的》([日] 户根勤, 译 [中] 周自恒, ISBN: 9787115441249)一书的记录与思路整理。
有些概念是做纯路由交换的网络工程师很少接触但又很重要的部分,因此整理到这里以做分享。

HTTP 基本思路

HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤。

  1. 客户端向服务器发送请求消息
    1. 请求消息主要包含“对什么”和“怎么进行操作”
    2. “对什么”指的是URI,可以是一个网页数据的文件或者是一个CGI程序;也可以直接使用”http:”开头的URL 作为URI
    3. “怎么操作”指的是HTTP 方法,表示客户端希望web 服务器完成怎样的操作。例如,读取URI 表示的数据、将客户端输入的数据发送给URI 表示的程序等等
    4. 请求信息还可以包含表示附加信息的头字段
  2. 服务器解析请求,通过URI 和方法来判断“对什么”进行“怎样的操作”,并根据要求来完成自己的工作,然后将结果保存在响应消息中返回给客户端。
    1. 响应消息的开头是一个状态码,用来表示操作的执行结果是成功还是发生了错误
    2. 状态码之后就是字段和网页数据
    3. 客户端收到后返回消息后,浏览器从消息中读取所需要的数据并展示在屏幕上。

HTTP 方法

Get 方法

一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。

Get 方法的访问过程如下:

  1. 在请求消息中国呢写上GET 方法,然后在URI 中写上存放网页数据的文件名”dir1/file1.html”,这就表示我们需要获取”dir1/file1.html” 文件中的数据。
  2. 当web 服务器收到请求后,会打开”dir1/file1.html” 文件并读取里面的数据,然后将读出的数据存放到响应消息中,返回给客户端。
  3. 客户端收到数据,浏览器将数据展示到屏幕上。

Post 方法

在网页表单中填写的数据需要发送给服务器时,经常会使用到这个方法。

POST 访问过程如下:

  1. URI 会指向Web 服务器上的一个应用程序的文件名,例如”index.cgi” or “index.php”
  2. 在请求消息中,除了方法和URI 之外,还要加上传递给应用程序和脚本的数据。如果是上传表单数据的话,这里就是用户在表单输入框中填写的信息
  3. 服务器收到请求后,Web 服务器会将请求消息中的数据发送给URI 指定的应用程序
  4. Web 服务器从应用程序接收输出的结果,将结果存放到响应消息中并返回给客户端。

GET vs. POST

GET POST
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。

在发送密码或其他敏感信息时绝不要使用 GET !
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

比较 GET 与 POST

URI vs URL

URI
uniform resource identifier,统一资源标志符
指的是在某一规则下能把一个资源独一无二地标识出来

URL
uniform resource locater,统一资源定位符
指的是在某一规则下为一个资源提供找到该资源的路径

可以看出URI 和URL 目的都是将一个资源标记出来,但是URL可以被看作是一个URI。因为还有一种URN可以作为URI 的另一种表现方法。

目前Web 上最流行的就是URL,所以在某些场合我们可以认为URL约等于URI。

生成HTTP 请求信息

请求消息

请求行

结构为<方法><空格><URI><空格><HTTP Version>

其中最为关键的就是<方法>了,它指明了服务器应当如何对客户端指定的URI进行操作操作。

这里的关键问题在于,方法有很多种,该选用哪一种方法?

解决这个问题的关键在于浏览器的工作状态。通常来说,在浏览器地址栏输入网址请求和点击网页中的超链接属于GET 方法。而在使用表单时,则根据HTML 源码中表单的属性指定使用哪种方法来发送请求,可能是GET 也有可能是POST。

消息头

消息头包含了关于请求额外的一些信息,例如:日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期、最后更新时间等等。
这些项目表示的都是非常细节的信息

消息体

当使用POST 方法时,需要将表单中填写的信息写在消息体中。

响应消息

响应消息与请求消息大致类似,主要的不同在于第一行。

状态行

结构为<HTTP 版本><空格><状态码><空格><响应短语>
状态码是一个数字,用来向程序告知服务器端的执行结果。
响应短语是一段文字,用来向人告知执行结果。

状态码 含义
1xx 告知请求处理进度和情况
2xx 成功
3xx 表示需要进一步操作
4xx 客户端错误
5xx 服务器错误

实例