主要翻译了http://www.jmarshall.com/easy/http/的内容
HTTP是指Hypertext Transfer Protocol,用于在互联网上传输文件或者其他资源,HTTP通常通过TCP/IP socket进行。一个浏览器可以视作一个HTTP client,向HTTP server(Web server)发送请求并接收响应。标准的HTTP server监听的端口为80.
HTTP 传输的结构
HTTP也是采用client-server模型:一个HTTP client开启一个连接,并且向HTTP server发送一个request 信息,之后HTTP server返回一个response信息,通常包含了之前所请求的资源,在发送response之后,server关闭连接。
request和response信息类似,都包含下列内容:
- 一条初始化行
- 0条或者多条header行
- 一条空行(通常是回车换行)
- body部分(optional),可以是文件,数据或者输出等等
下面分别介绍各部分内容
request的初始化行
主要包含三部分内容,以空格隔开:请求的方法,所请求的资源的路径,以及HTTP协议的版本,如:
GET /path/to/file/index.html HTTP/1.0
- GET是方法名,还有一些其他的方法如POST, HEAD在之后会进行介绍,方法名都是大写
- 路径部分是指host之后的URL部分
- HTTP版本通常是采用 ‘HTTP/x.x’的格式
response的初始化行
又称为status line,也包含三部分,以空格隔开:HTTP版本,响应的状态码以及描述状态码的短语,如:
HTTP/1.0 200 OK
HTTP/1.0 404 Not Found
主要介绍下状态码,状态码是一个三位数的数字,第一个数字表示response的类别:
- 1xx表示这只是一条信息
- 2xx表示成功
- 3xx表示重定向到了另一个URL
- 4xx表示client部分的错误
- 5xx表示server部分的错误
常见的状态码有:
200 OK
请求成功,并且资源返回在了body中
404 Not Found
请求的资源不存在
301 Moved Permanently
302 Moved Temporarily
303 See Other(只支持HTTP 1.1)
资源被移动到了另一个URL中(由Location:response header提供),并且应当由client自动取回。通常由CGI脚本将浏览器重定向到一个已存在的文件
500 Server Error*
未预料的服务器端错误
header行
header行通常提供request或response的信息,或者是body中物体的信息
通常采用 ‘Header-Name: value’的格式,以回车换行结束
- 应以回车换行符结束,但也应该可以处理换行符
- header的名字不区分大小写,但是value区分
- ‘:’和value之间可以存在多个空格或者tab
- 以空格或者tab开头的header行是前一个header行的部分,分成多行是为了便于阅读
以下两个header其实是等价的:
Header1: some-long-value-1a, some-long-value-1b
HEADER1: some-long-value-1a,
some-long-value-1b
为了保证一致性,考虑在request的header中加入以下内容:
- From: header给了请求人的email地址。(为了隐私考虑,需要用户可配置)
- User-Agent: 标识发送请求的程序,以’Program-name/x.xx’的形式。
header可以有助于寻找故障,但也会泄露用户信息,因此需要权衡对待。
如果写server,则考虑在response中增加以下信息:
- Server:和User-Agent类似。
- Last-Modified:给出资源上次修改的时间。
body行
如果HTTP信息中包含有body,那么通常在header行中有相关的描述部分。
Content-Type: 给出body中数据的类型
Content-Length: 给出body中的字节个数
举一个例子
为了获取http://www.somehost.com/path/file.html中的文件
- 首先,对www.somehost.com,端口80(URL中没有指定端口)建立一个socket。
- 之后,发送下列信息
GET /path/file.html HTTP/1.0
From: someuser@jmarshall.com
User-Agent: HTTPTool/1.0
[blank line here]
server应该返回一个响应信息,类似于
HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354
<html>
<body>
<h1>Happy New Millennium!</h1>
(more file contents)
.
.
.
</body>
</html>
发送之后,server关闭socket
一些HTTP method介绍
除了GET之外,最常用的方法就是POST和HEAD
HEAD和GET类似,但只要求server返回response header,而不需要返回真实的资源,只要用于在不下载资源的情况下进行检查,节省带宽。
对HEAD的相应不包含body。
POST用来发送数据给server,和CGI脚本类似。
- request的body中含有数据,也有相应的header描述body,如Content-Type和Content-Length
- 请求的URI并不是用来获取资源,而是处理你所发送数据的程序
- HTTP相应通常是程序的输出,而不是一个静态文件。
GET其实也可以用来提交表单,当数据量比较小的时候,将表单数据进行URL-encoded,并加在请求的URI后面。
HTTP代理
HTTP代理是client和server之间的中间人,需要接收client的request,还需要将其转发到server中,并接受server的response,并发送回去。因此,需要具有client和server的功能。
client在使用代理时,将所有的请求都发送给代理,而不是发送到URL的server中,request中不仅仅包含路径,而是含有完整的URL,如:
GET http://www.somehost.com/path/file.html HTTP/1.0
兼容性
你所交互的一些client或者server的信息可能有一些缺陷,但是你应该容忍这些缺陷。
- 虽然header行应该以回车换行符结束,但是也需要接受换行符
- 虽然initial行应该以一个空格隔开,但是也应该接受其他数量的空格或者tab
具体可以查阅HTTP Specification