http学习笔记(一)
HTTP 学习笔记开篇,介绍 HTTP 协议的基本概念、无状态特性,以及 Web 服务器的作用,并通过 telnet 实例直观感受一次 HTTP 事务的请求与响应报文。
- #http
- #network
写在前面:
第一次想写系列文章,学习了一些 web 知识后,发现自己还有很大的不足,但又不知道该学习些什么来完善自己的知识体系,偶然在网上看到了一篇介绍 http 的文章,觉得对自己有一些帮助,于是想要开始学习 http,我担心自己不能够坚持下去,所以希望能通过这种方式督促自己学习。
http 概览
HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从 WWW 服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
——百度百科
首先,http 是一种可靠的数据传输协议,因为它必须是可靠的,假设 http 是不可靠的,传输的数据总是丢三落四,这样不是很糟糕,你想上网看一篇新闻,结果只显示了第一段和第三段,那不是很崩溃。关于可靠性,在后面的文章再介绍。,即使数据来自很遥远的地方,依旧可以完整的传输过来,不会丢失。
http 又是无状态的,也就是每次发出的请求都是独立的,和上次的请求是没有关系的。这样的好处是服务器响应的速度会很快,但是很难保持用户的状态,现在一般都是通过 cookie 和 session 来保持用户上网时的状态的。关于这个问题,以后的笔记中还会再谈。
Web 服务器
接下来说说 web。谈到 http,必须要说到 web 了,因为 http 协议最广泛的应用就是 web 了。Web 服务器使用的基本都是 http 协议,所以 web 服务器也被称为是 http 服务器,在 RedHat 中 apache 在 service 中使用名字就是 httpd。它们在 http 传输过程中为客户端提供内容,让我们可以看到精彩的内容。
报文初探
我们每天都会用 chrome 等浏览器向 web 服务器发送 http 请求,然后服务器给我们返回一个 http 响应信息。以上的这个过程被称为事务,也就是一个 http 请求命令和一个 http 响应命令组成的一个完整的响应过程。
这样的解释可能还是不够直观,我们可以使用 telnet 工具(关于 telnet linux 用户可以通过 yum 或者 apt-get 安装,win 用户可以在控制面板中的添加 telnet 功能)来看看 http 到底长得是怎么样的吧。
假设这里有一个 web 服务器的 IP 地址是 192.168.170.171 端口是默认的 80 端口,我尝试用 telnet 去访问它。
telnet> open 192.168.170.171 80
Trying 192.168.170.171...
Connected to 192.168.170.171.
Escape character is '^]'.
Get /index.html HTTP/1.1
Host: 192.168.170.171
Accept: *
以上信息中,GET 开始到最后就是一次简单的 http 请求。
我发送完 http 消息后,立即得到了以下响应:
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 07:14:43 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 13 Jun 2013 07:06:06 GMT
ETag: "c01c3-3f-4df03c3a2d5c3"
Accept-Ranges: bytes
Content-Length: 63
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<body>
<h1>
hello world!
</h1>
</body>
</html>
Html 标签前面的就是 http 响应信息了。
这就是一次简单的 http 事务了。
它们长得貌似有点吓人。这里面到底有什么东西呢?
现在让我们看下请求中有什么信息
GET /index.html HTTP/1.1
Host: 192.168.170.171
Accept: *
首先是 GET /index.html HTTP/1.1
这句话定义了客户端是通过 GET 方法 发送一个获取 index.html 的页面,在传输中使用的是 http1.1 协议。
第二句定义了目标主机的地址,当然如果有 dns 服务器的话,这里写域名地址也是可以的。
第三句话写了客户端期待接受的 MINE 类型,也就是客户端希望得到的资源是什么类型。* 在这里表示接受任何类型。
接下来我们看响应信息。
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 07:14:43 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 13 Jun 2013 07:06:06 GMT
ETag: "c01c3-3f-4df03c3a2d5c3"
Accept-Ranges: bytes
Content-Length: 63
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<body>
<h1>
hello world!
</h1>
</body>
</html>
首句 HTTP/1.1 200 OK 表示服务器采用 http1.1 协议传输这段响应报文,状态码 200 表示响应成功。OK 是给管理员看的,也是表示响应成功。
第二句中 Date: Thu, 13 Jun 2013 07:14:43 GMT 显示了响应发生的时间。
第三句给出了服务器的一些信息。
第四句中 Last-Modified: Thu, 13 Jun 2013 07:06:06 GMT,给出了页面上次修改的时间。
第五句中 ETag: "c01c3-3f-4df03c3a2d5c3" 这相当于一个版本号,这个和 web 缓存机制有关。
第六句 Accept-Ranges: bytes 表示对这个页面资源而言,服务器可以接受的范围类型
第七句 Content-Length: 63 表示了这个页面的长度
第八句 Connection: close 表示连接被关闭。
第九句 Content-Type: text/html; charset=UTF-8 这里表示页面的文本格式,和字符编码。
到这里为止,我对 http 事务有一个大概的了解,上面的一些信息也许暂时还看不明白,我会在后面的学习中逐步完善。今天就到这里。休息!