HTTP协议漫谈:概述

spring 1年前 ⋅ 582 阅读

自从学习linux编程以来,一直对与服务器的工作原理十分感兴趣,想写一个,然而暑假由于各种原因耽搁了下来,前几天是课程设计,大概两周时间,我就趁这个时间,简单实现了一下。又恰逢《HTTP权威指南》出版,入手了一本,大概翻了一遍,对于HTTP的细节了解了很多,收获还是很大的。我简单总结一下,巩固知识&&方便以后查看。

HTTP,超文本传输协议,是使用非常广泛的网络协议,我们平时上网看新闻,刷微博都要依靠下面的http协议来传递信息。要传递信息,首先需要客户端发起连接,客户端和服务器建立链接之后,发送HTTP请求报文,服务器接受请求之后返回给客户端一个响应报文。请求和响应都是固定文本格式的,在协议中有明确的定义,之后会详解。HTTP底层是通过TCP进行通讯的,不过我们不必关心TCP的具体细节,只需要知道他提供可靠连接,并且在请求和响应完成后关闭连接(持久链接中有多次请求和响应)。

HTTP的请求可以有好几种,最常见的是GET请求(还有POST,HEAD等),他会向服务器请求资源(即“get”资源),同时会给一个资源的地址,这些东西放在请求报文的开头第一行,我们把这一行称为起始行。

GET /index.html HTTP/1.1\r\n


上面代码用空格隔开三个部分,第一部分是方法,上面是GET,第二部分是资源地址,第三部分是HTTP协议的版本,1.1版本是现在使用最广泛的。后面的\r\n指示这一行的结束,这一行就指示了整个报文的目的。服务器如果找到 了客户端请求的资源,就会返回给他,他的第一行也就是起始行如下:

HTTP/1.1 200 OK\n\n

也是三个部分,协议版本+状态码+描述信息,200代表的是请求资源成功,OK表示200的含义,实际中这个OK也可以被其它描述信息替代,只要200不变就行。

请求和响应报文会在起始行的后面加上一些首部(headers),他们是0行,一行或者多行的键值对,每一行都是“key: value\r\n”的形式。在首部的后面可能会跟上实体(entity),实体就是实际上报文要传输的东西,比如说我们向服务器传输的文件,服务器向我们返回的页面,都是在实体之中的。请求报文格式举例如下:

GET / HTTP/1.1\r\n
Host: www.baidu.com\r\n
Accept: text/html, image/gif\r\n
\r\n

第一行说明了方法,路径,版本,下面两行是两个首部,Host指明了主机是www.baidu.com,有时也会跟上端口号,如果请求首部不包含Host域,所有的HTTP/1.1服务器都应该返回状态码为400的响应,代表着坏的请求(描述信息是Bad Request)。Accept指明了客户端接受的文件类型,是html文本和gif图片,服务器会查看请求的资源的类型是不是这两个格式,如果不是,就会返回状态码406,描述信息为Not Acceptable。每一行的结尾都是\r\n,代表行的结束,当首部部分结束的时候,会多一个\r\n以示没有头域了。在这之后会有实体,现在只有POST和PUT方法会在请求报文的最后加上实体,其它的都不包含。

下面是响应报文的例子:

HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
Content-Length: 6\r\n
\r\n
Hello!

http版本描述了服务器支持的最高的HTTP版本。后面是200状态码,以及描述信息。第二行的Content-Type首部,表明实体的类型信息,text表示类型的大类,html表示的是类型的小类,比如还有类型是text/plain,application/pdf,image/gif等的实体。第三行是Content-Length,表明实体的长度是6就是下面的Hello!。如果浏览器接受到这个报文,就会显示一个页面,点击查看源代码,就可以看到实际上是Hello!

对于HTTP协议的学习,最直接的就是拿现成的工具来查看他是怎么使用的。下面有几种方式:

1.Chrome+F12。谷歌浏览器的F12的功能还是很强大的,在屏幕的下半部分会有窗口查看信息,在第三个标签页Network,我们可以查看浏览器发送的请求和服务器的响应,很直观。此刻如果你已经打开了它,那么请按F5,点击Name下面的条目,就可以查看相应资源的请求和响应了。另外chrome也有一些查看,修改,发送请求的插件,十分方便学习,比如Dev HTTP Client,HTTP Headers,REST Console,RequestMaker等等。

2.telnet www.baidu.com 80.直接手动输入报文。

3.Wireshark,就是我们以前知道的Ethereal。他可以查看各种协议的报文,可以在Filter中输入过滤信息,过滤掉不需要的信息。具体我也没有仔细研究过,需要的慢慢折腾吧。

参考资料:

1. 《HTTP权威指南》,David Gourley / Brian Totty,人民邮电出版社

2. RFC 2616 

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: