HTTP 基础
前言
这个系列的博客是针对阅读《网络是怎样连接的》([日] 户根勤, 译 [中] 周自恒, ISBN: 9787115441249)一书的记录与思路整理。
有些概念是做纯路由交换的网络工程师很少接触但又很重要的部分,因此整理到这里以做分享。
HTTP 基本思路
HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤。
- 客户端向服务器发送请求消息
- 请求消息主要包含“对什么”和“怎么进行操作”
- “对什么”指的是URI,可以是一个网页数据的文件或者是一个CGI程序;也可以直接使用”http:”开头的URL 作为URI
- “怎么操作”指的是HTTP 方法,表示客户端希望web 服务器完成怎样的操作。例如,读取URI 表示的数据、将客户端输入的数据发送给URI 表示的程序等等
- 请求信息还可以包含表示附加信息的头字段
- 服务器解析请求,通过URI 和方法来判断“对什么”进行“怎样的操作”,并根据要求来完成自己的工作,然后将结果保存在响应消息中返回给客户端。
- 响应消息的开头是一个状态码,用来表示操作的执行结果是成功还是发生了错误
- 状态码之后就是字段和网页数据
- 客户端收到后返回消息后,浏览器从消息中读取所需要的数据并展示在屏幕上。
HTTP 方法
Get 方法
一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。
Get 方法的访问过程如下:
- 在请求消息中国呢写上GET 方法,然后在URI 中写上存放网页数据的文件名”dir1/file1.html”,这就表示我们需要获取”dir1/file1.html” 文件中的数据。
- 当web 服务器收到请求后,会打开”dir1/file1.html” 文件并读取里面的数据,然后将读出的数据存放到响应消息中,返回给客户端。
- 客户端收到数据,浏览器将数据展示到屏幕上。
Post 方法
在网页表单中填写的数据需要发送给服务器时,经常会使用到这个方法。
POST 访问过程如下:
- URI 会指向Web 服务器上的一个应用程序的文件名,例如”index.cgi” or “index.php”
- 在请求消息中,除了方法和URI 之外,还要加上传递给应用程序和脚本的数据。如果是上传表单数据的话,这里就是用户在表单输入框中填写的信息
- 服务器收到请求后,Web 服务器会将请求消息中的数据发送给URI 指定的应用程序
- 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 中。 |
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 | 服务器错误 |