HTTP(超文本传输协议)也许是互联网(或WEB)中使用的最流行的应用协议。
- HTTP是一个非对称的请求 - 响应客户端 - 服务器协议,如图所示。HTTP客户端向HTTP服务器发送请求消息。服务器又会返回一个响应消息。换句话说,HTTP是一种拉协议,客户机拉动从所述服务器信息(而不是服务器推送信息到客户端)。
- HTTP是一个无状态的协议。换句话说,当前的请求不知道以前的请求已经做了什么。
- HTTP允许协商数据类型和表示,以便允许独立于正在传输的数据构建系统。
- 超文本传输协议(HTTP)是一种用于分布式,协作式,超媒体信息系统的应用级协议,它是一种通用的,无状态的协议,可用于除超文本之外的许多任务,例如作为名称服务器和分布式对象管理系统,通过扩展它的请求方法,错误代码和头文件。
浏览器
无论何时从浏览器发出一个URL来获取使用HTTP的Web资源,例如http://www.nowhere123.com/index.html
,浏览器将URL转换为请求消息并发送到HTTP服务器。HTTP服务器解释请求消息,并返回一个适当的响应消息,这是您请求的资源或错误消息。这个过程如下图所示:
![](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_Steps.png)
统一资源定位符(URL)
URL(统一资源定位符)用于唯一标识网络上的资源。网址具有以下语法:
协议:// 主机名:端口 / 路径和文件名
网址中有4个部分:
- 协议:客户端和服务器使用的应用层协议,如HTTP,FTP和Telnet。
- 主机名:服务器的DNS域名(例如
www.nowhere123.com
)或IP地址(例如192.128.1.2)。 - 端口:服务器正在侦听来自客户端的传入请求的TCP端口号。
- 路径和文件名称:服务器文档基础目录下的请求资源的名称和位置。
例如,在URL中http://www.nowhere123.com/docs/index.html
,通信协议是HTTP; 主机名是www.nowhere123.com
。端口号未在URL中指定,并且具有缺省编号,即HTTP的TCP端口80。要找到的资源的路径和文件名是“ /docs/index.html
”。
其他URL的例子有:
ftp://www.ftp.org/docs/test.txt 邮寄地址:user@test101.com 新闻:soc.culture.Singapore 远程登录://www.nowhere123.com/
HTTP协议
如前所述,无论何时在浏览器的地址栏中输入URL,浏览器都会根据指定的协议将URL转换为请求消息; 并将请求消息发送给服务器。
例如,浏览器将URL http://www.nowhere123.com/doc/index.html
转换为以下请求消息:
GET /docs/index.html HTTP / 1.1 主持人:www.nowhere123.com 接受:image / gif,image / jpeg,* / * Accept-Language:en-us Accept-Encoding:gzip,deflate 用户代理:Mozilla / 4.0(兼容; MSIE 6.0; Windows NT 5.1) (空行)
当这个请求消息到达服务器时,服务器可以采取以下任一操作:
- 服务器会把接收到的请求,该请求到映射文件服务器的文件目录下,并返回请求的客户端的文件。
- 所述服务器解释接收到的请求,所述请求为映射程序保存在服务器上,执行该程序,并且该程序的输出返回到客户端。
- 请求不能满足,服务器返回错误信息。
HTTP响应消息的示例如下所示:
HTTP / 1.1 200 OK 日期:Sun,18 Oct 2009 08:56:53 GMT 服务器:Apache / 2.2.14(Win32) 最后修改:星期六,2004年11月20日07:16:26 GMT ETag:“10000000565a5-2c-3e94b66c2e680” 接受范围:字节 内容长度:44 连线:关闭 内容类型:文本/ HTML X-Pad:避免浏览器错误 <html> <body> <h1>有用!</ h1> </ body> </ html>
浏览器收到响应消息,根据响应的媒体类型(如Content-Type响应头)解释消息并在浏览器窗口中显示消息的内容。常见的媒体类型包括“ text/plain
”,“ text/html
”,“ image/gif
”,“ image/jpeg
”,“ audio/mpeg
”,“ video/mpeg
”,“ application/msword
”和“ application/pdf
”。
在空闲状态下,HTTP服务器只会侦听传入请求配置中指定的IP地址和端口。当请求到达时,服务器分析消息头,应用在配置中指定的规则,并采取适当的操作。网站管理员对Web服务器动作的主要控制是通过配置进行的,后面将详细介绍这些配置.
HTTP over TCP / IP
HTTP是客户端 - 服务器应用程序级别的协议。它通常运行在TCP / IP连接上,如图所示。(HTTP不需要在TCP / IP上运行,它只是假定一个可靠的传输,任何提供这种保证的传输协议都可以使用)。
![](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_OverTCPIP.png)
TCP / IP(传输控制协议/互联网协议)是一组传输和网络层协议,用于机器在网络上相互通信。
IP(Internet Protocol)是网络层协议,用于处理网络寻址和路由。在IP网络中,每台计算机都分配一个唯一的IP地址(例如,165.1.2.3),IP软件负责将来自源IP的消息路由到目标IP。在IPv4(IP版本4)中,IP地址由4个字节组成,每个字节的范围是从0到255,用点分隔,称为四点形式。该编号方案支持网络上最多4G的地址。最新的IPv6(IP版本6)支持更多的地址。由于记忆数字对于大多数人来说是困难的,所以英文域名如www.nowhere123.com
被用来代替。DNS(域名服务)将域名转换为IP地址(通过分布式查找表)。一个特殊的IP地址127.0.0.1总是指你自己的机器。它的命名是“ localhost
”,可以用于本地环回测试。
TCP(传输控制协议)是一种传输层协议,负责在两台机器之间建立连接。TCP由2个协议组成:TCP和UDP(用户数据报包)。TCP是可靠的,每个数据包都有一个序列号,并且有一个确认。如果数据包未被接收器接收到,数据包将被重新传输。在TCP中保证数据包传送。UDP不保证数据包传输,因此不可靠。但是,UDP具有较少的网络开销,可用于视频和音频流等应用,而可靠性并不重要。
TCP 在IP机器内复用应用程序。对于每台IP机器,TCP从端口号0到65535支持(多路复用)多达65536个端口(或套接字)。应用程序(如HTTP或FTP)在传入请求的特定端口号上运行(或侦听)。端口0至1023被预先分配给流行的协议,例如,80处的HTTP,21处的FTP,23处的Telnet,25处的SMTP,119处的NNTP以及53处的DNS。端口1024及以上对用户可用。
尽管TCP端口80已预先分配给HTTP,但是作为默认HTTP端口号,这并不禁止您在其他用户分配的端口号(1024-65535)(如8000,8080)上运行HTTP服务器,特别是对于测试服务器。您也可以在同一台计算机上的不同端口号上运行多个HTTP服务器。当一个客户端发出一个URL而没有明确指出端口号时,例如,http://www.nowhere123.com/docs/index.html
浏览器将连接到主机的默认端口号80 www.nowhere123.com
。您需要明确指定URL中的端口号,例如,http://www.nowhere123.com:8000/docs/index.html
如果服务器正在监听端口8000而不是默认端口80。
简而言之,要通过TCP / IP进行通信,您需要知道(a)IP地址或主机名,(b)端口号。
HTTP Request Message
The format of an HTTP request message is as follow:
![](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_RequestMessage.png)
Request Line
The first line of the header is called the request line, followed by optional request headers.
The request line has the following syntax:
request-method-name request-URI HTTP-version
- request-method-name: HTTP protocol defines a set of request methods, e.g., GET, POST, HEAD, and OPTIONS. The client can use one of these methods to send a request to the server.
- request-URI: specifies the resource requested.
- HTTP-version: Two versions are currently in use: HTTP/1.0 and HTTP/1.1.
Examples of request line are:
GET /test.html HTTP/1.1 HEAD /query.html HTTP/1.0 POST /index.html HTTP/1.1
Request Headers
The request headers are in the form of name:value
pairs. Multiple values, separated by commas, can be specified.
request-header-name: request-header-value1, request-header-value2, ...
Examples of request headers are:
Host: www.xyz.com Connection: Keep-Alive Accept: image/gif, image/jpeg, */* Accept-Language: us-en, fr, cn
Example
The following shows a sample HTTP request message:
![](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_RequestMessageExample.png)
HTTP Response Message
The format of the HTTP response message is as follows:
![](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_ResponseMessage.png)
状态行
第一行称为状态行,随后是可选的响应标题(s)。
状态行具有以下语法:
HTTP版本 状态码 原因短语
- HTTP版本:在此会话中使用的HTTP版本。HTTP / 1.0和HTTP / 1.1。
- 状态码:由服务器生成的一个3位数字,以反映请求的结果。
- 原因短语:对状态码给出一个简短的解释。
- 常见的状态码和原因短语是“200 OK”,“404 Not Found”,“403 Forbidden”,“500 Internal Server Error”。
状态行的例子是:
HTTP / 1.1 200 OK HTTP / 1.0 404未找到 HTTP / 1.1 403禁止
响应头
响应标题为表单name:value
对:
response-header-name:response-header-value1,response-header-value2,...
响应标头的例子是:
内容类型:文本/ HTML 内容长度:35 连接:保持活跃 保持活跃:超时= 15,最大= 100
响应消息主体包含请求的资源数据。
例
以下显示一个示例响应消息:
HTTP请求方法
HTTP协议定义了一组请求方法。客户端可以使用这些请求方法之一向HTTP服务器发送请求消息。方法是:
- GET:客户端可以使用GET请求从服务器获取Web资源。
- HEAD:客户端可以使用HEAD请求获取GET请求获得的头。由于标题包含数据的最后修改日期,因此可用于检查本地缓存副本。
- POST:用于将数据发布到Web服务器。
- PUT:请求服务器存储数据。
- 删除:请求服务器删除数据。
- 跟踪:请求服务器返回所需操作的诊断跟踪。
- 选项:请求服务器返回它支持的请求方法列表。
- CONNECT:用于告诉代理与另一个主机建立连接,只是回复内容,而不尝试解析或缓存。这通常用于通过代理进行SSL连接。
- 其他扩展方法。
“GET”请求方法
GET是最常见的HTTP请求方法。客户端可以使用GET请求方法从HTTP服务器请求(或“获取”)一段资源。GET请求消息采用以下语法:
GET 请求 - URI HTTP版本 (可选请求头) (空白行) (可选请求主体)
- 关键字GET区分大小写,并且必须大写。
- request-URI:指定请求的资源路径,它必须从
/
文档基目录的根“ ” 开始。 - HTTP版本:HTTP / 1.0或HTTP / 1.1。该客户端协商用于当前会话的协议。例如,客户端可能会请求使用HTTP / 1.1。如果服务器不支持HTTP / 1.1,则可能会通知客户端使用HTTP / 1.0的响应。
- 客户端使用可选的请求头(例如
Accept
,Accept-Language
等)与服务器进行协商,并要求服务器传送首选内容(例如,以客户端首选的语言)。 - GET请求消息有一个可选的请求体,它包含查询字符串(稍后解释)。
测试HTTP请求
有很多方法可以测试出HTTP请求。您可以使用“ telnet
”或“ hyperterm
”(搜索“ telnet.exe
”或“