来自微信公众号:开点工作室(ID:kaidiancs)
用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议HTTP(HyperTextTransfer Protocol)负责完成的。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送,能够在万维网上进行文本、声音、图像、视频等各种信息的交换。
HTTP协议也是工作在客户机/服务器模式下,分为HTTP客户端和HTTP服务器两个部分,双方每次进行交互,都是由客户端发出的请求和服务器端发出的响应构成。HTTP协议规定的用户使用浏览器访问万维网的过程可以总结为:
1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
3.浏览器与网页所在服务器建立TCP连接;
4.浏览器发送HTTP请求报文,获取目标网页的文件;
5.服务器发送HTTP响应报文,将目标网页文件发送给浏览器;
6.释放TCP连接;
7.浏览器将网页的内容包括文本、图像、声音等显示呈现在用户计算机屏幕。
HTTP协议是无连接的,它使用面向连接的TCP协议所提供的服务。同时,HTTP协议也是无状态的,即服务器端不记录客户端访问的时间和次数。最初的HTTP协议版本是1.0版,使用非持续连接(nonpersistentconnection)。每传输一个对象都需要利用1个往返时间RTT建立TCP连接,用1个往返时间RTT申请并传输回对象,即平均用2个往返时间RTT获取一个对象。目前使用比较广泛的是HTTP协议的1.1版本(HTTP/1.1),其在默认情况下使用持续连接(persistentconnection),即利用同一个TCP连接传输多个对象。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。请求报文是从客户端向服务器发送的报文,响应报文是从服务器到客户端的报文。下面分别介绍请求报文和响应报文的具体格式。
1.HTTP请求报文格式
HTTP请求报文的由请求行、请求头部行、空行和请求数据四部分构成,具体格式如下所示:
(请求行)方法名+空格+URL+空格+版本+回车换行(\r\n)
(请求头部行1)关键字+“:”+空格+值+回车换行(\r\n)
……
(请求头部行N)关键字+“:”+空格+值+回车换行(\r\n)
(空行)回车换行(\r\n)
(请求数据)……
(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。最后由回车和换行表示请求行结束。例如:
GET www.sdu.edu.cn HTTP/1.1回车换行(\r\n)
其中“方法”字段表示该请求报文希望服务器做什么,请求报文的类型就是由所采用的方法决定的。HTTP请求报文的主要方法包括:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT等。最常见的方法有GET和HEAD。
GET是最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。GET方式不适合传送私密数据和大量数据。
HEAD的功能与GET相似,只是服务器端接收到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
(2)请求头部行(header)
请求头部行包括若干行,每行由关键字及其值构成的,关键字和值用英文冒号“:”分隔,每一行都由回车换行表示结束。请求头部通知服务器有关于客户端请求的信息,典型的请求头部关键字有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Accept-Language:客户端可识别的语言类型
。
Host:请求的主机名。
Connection:告知服务器发送完文档后释放连接还是保持连接。
(3)空行
最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部了。
(4)请求数据
GET方法中没有请求数据的内容,POST方法使用请求数据,用于客户端向服务器端填写表单等操作。
比如浏览器使用GET方法访问山东大学主页中的“学校简介”文档(URL为www.sdu.edu.cn/2010/xxjj.htm),则其HTTP请求报文可以为:
GET /2010/xxjj.html HTTP/1.1 \r\n
Host: www.sdu.edu.cn\r\n
User-Agent:Mozilla/5.0
Accept-Language:cn */*\r\n
2.响应报文格式
HTTP响应也由四个部分组成,分别是:状态行、消息头部、空行和响应正文。其具体格式如下:
(状态行)版本+空格+状态码+空格+短语+回车换行
(消息头部1)关键字+“:”+空格+值+回车换行
……
(消息头部N)关键字+“:”+空格+值+回车换行
(空行)回车换行(\r\n)
(响应正文)……
在响应报文的状态行中,版本字的表示服务器HTTP协议的版本,状态码字的表示服务器发回的响应状态代码;短语字段表示状态代码的文本描述。状态码由三位十进制数字组成,第一个数字定义了响应的类别,有五种可能取值(1-5),每种状态码的含义如下:
1xx:指示信息。表示请求已接收,继续处理。
2xx:成功。表示请求已被成功接收、理解、接受。
3xx:重定向。要完成请求必须进行更进一步的操作。
4xx:客户端错误。请求有语法错误或请求无法实现。
5xx:服务器端错误。服务器未能实现合法的请求。
常见状态码及状态描述的说明如下:
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,比如输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
消息头部与请求头部的格式相似,也是包含若干行,每行由关键字及其值构成,常用的关键字包括:
Date:表示返回消息的时间。
Content-Type:表示返回消息的内容类型。
Content-Length:返回内容的长度(字节数)。
Server:使用的服务器软件及其版本号。
同样,最后一个消息头部之后是一个空行,发送回车符和换行符,通知客户端以下不再有消息头部了。
响应正文部分是服务器端根据客户端的请求发回的具体文档内容,以HTML语言表示。