HTTP连接使用TCP/IP来传输数据。对于从客户端到服务器的每一个请求,都有四个步骤:
- 默认情况下,客户端在端口80打开与服务器的一个TCP连接,URL中还可以指定其他端口。
- 客户端向服务器发送信息,请求指定路径上的资源。这个请求包括一个首部,可选的还可以有一个空行,后面使这个请求的数据。
- 服务器向客户端发送响应。响应以响应码开头,后面是包含元数据的头部,一个空行以及所请求的文档或错误信息。
- 服务器关闭连接
这是基本HTTP1.0过程。
在HTTP1.1及以后版本中,可以通过一个TCP连接额连续发送多个请求和响应。也就是第一步和第四步之间,第二步和第三步可以反复很多次。另外HTTP1.1中,请求和响应可以分为多个块发送。
每个请求和响应都有同样的基本形式:一个首部行,一个包含元数据的HTTP首部、一个空行,然后是一个消息体。
一般的客户端请求如下所示:
第一行称为请求行,包括一个方法、资源的路径以及HTTP的版本。
首部中通常还会有其他信息。各行采用如下形式:
Keyword: value
关键字不区分大小写,值又是区分大小写,有时不区分。如果一个值太长,可以在下一行最前面增加一个空行或制表符,接续上一行。
Accept告诉服务器客户端可以处理那些数据类型。
MIME媒体类型分为两级:类型和子类型。已经定义了8个顶级类型:
- text/*
- image/*
- model/*:表示3D模型,如VRML文件
- audio/*
- video/*
- application/*:表示二进制数据
- message/*:表示协议特定信封
- multipart/*:表示多个文档和资源的容器
可以自有定义非标准的定制类型和子类型,只要他们以x-开头。如application/x-shockwave-flash类型。
以后一个请求以一个空行结束,也就是说包括两个空行/换行对。
一旦服务器看到这个空行,它就开始通过同一个连接向客户端发送它的响应。这个响应以一个状态码开始,后面是一个首部,这个首部采用请求首部相同的“名:值”语法描述响应,然后是一个空行,最后是请求资源。
Keep-Alive
HTTP1.1以后,服务器不比在发送响应后就关闭连接。可以保持连接打开,在同一个socket上等待来自客户端的心情求。
客户可以在HTTP请求头部上包括一个Connection字段,指定值为Keep-Alive,指示它希望重用一个socket
Connetion:Keep-Alive