超文本传输协议(hypertext transfer protocol,HTTP)是在互联网上应用最为广泛的一种网络协议。所有的WWW服务器都基于该协议。HTTP设计最初的目的是提供一种发布Web页面和接受Web页面的方法。
本章向大家介绍TCP、HTTP协议、HTTP资源定位、HTTP请求及相应头详细信息、HTTP状态码及MIME类型详解等内容。
1.1 TCP协议与HTTP协议
1960年,美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),为HTTP超文本传输协议标准架构的发展奠定了根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force)共同合作研究,最终发布了一系列的RFC,其中著名的RFC2616定义了HTTP 1.1 。
很多人对TCP协议与HTTP协议存在疑问,这两者有和区别,从应用领域来说,TCP协议主要用于数据传输控制,而HTTP协议主要用于应用层面的数据交互,本质上两者没有可比性。
HTTP协议属于应用层协议,是建立在TCP协议基础上的,HTTP协议以客户端请求和服务器端应答为标准, 浏览器通常称为客户端,而Web服务器称之为服务器端。客户端打开任意一个端口向服务器端的指定端口(默认为80)发起HTTP请求,首先会发起TCP三次握手,TCP三次握手的目的是建立可靠的数据连接通道,TCP三次握手通道建立完毕,进行HTTP数据交互,如下图所示。
当客户端请求的数据接收完毕后,HTTP服务器端会断开TCP连接,这个HTTP连接过程非常短。HTTP连接也称为无状态的连接,无状态连接是指客户端每次向服务器发起HTTP请求时,每次请求都会建立一个新的HTTP连接,而不是在一个HTTP请求基础上进行所有数据的交互。
9.2 资源定位标识符
HTTP请求的内容资源由统一资源标识符(uniform resource identifiers,URI)来标识,关于资源定位及标识有三种:URI、URN、URL,三种资源定位详解如下:
- 统一资源标识符(uniform resource identifier,URI),用来唯一标识一个资源;
- 统一资源定位符(uniform resource locator,URL),是一种具体的URI,URL可以用来标识一个资源,而且可以访问或者获取该资源;
- 统一资源命名(uniform resource name,URN),通过名字来标识识别资源。
URI、URN、URL关联与区别
三种资源标识,其中URL资源标识方式使用最为广泛,完整的URL标识格式如下:
protocol://host[:port]/path/.../[?query-string][#anchor]
参数详解如下:
- protocol:基于某种协议,常见协议有HTTP,HTTPS,FTP,RSYNC等。
- host:服务器的IP地址或者域名。
- port:服务器的端口号,如果是HTTP 80端口,默认可以省略。
- path:访问资源在服务器的路径。
- query-srting:传递给服务器的参数及字符串。
- anchor:锚定结束。
HTTP URL案例演示如下:
参数对应关系如下:
- protocol:HTTP协议
- host:www.zeyunanke.com
- path:无
- query-srting:无
- anchor:yunan
9.3 HTTP与端口通信
HTTP Web服务器默认在本机会监听80端口,不仅HTTP会开启监听端口,其实每个软件程序在Linux系统运行,会以进程的方式启动,程序就会启动并监听本地接口的端口,那么为什么会引入端口这个概念呢?
端口是TCP/IP协议中应用层进程与传输层协议实体间的通信接口,端口是操作系统可分配的一种资源,应用程序通过系统调用与某个端口绑定后,传输层传给该端口的数据会被该进程接收,相应进程发给传输层的数据都通过该端口输出。
在网络通信过程中,需要唯一识别通信两端设备的端点,就是使用端口识别运行某主机中的应用程序。如果没有引入端口,则只能通过PID进程号进行书别,而PID进程号是系统动态分配的,不同的系统会使用不同的进程标识符,应用程序在运行之前没有明确的进程号,如果需要运行后在广播进程号则很难保证通信的顺利进行。
而引入端口后,就可以利用端口号识别应用程序,同时通过固定端口号来识别和使用某些公共服务,例如HTTP默认使用80端口,而FTp使用21,20端口,MySQL则使用3306端口。
使用端口还有一个原因就是随着计算机网络技术的发展,物理机器上的硬件接口已不能满足网络通信的要求,而TCP/IP协议模型作为网络通信的标准就解决了这个通信难题。
TCP/IP协议中引入了一种被称为套接字(socket)的应用程序接口。基于socket接口技术,一台计算机就可以与任何一台具有socket接口的计算机进行通信,而监听的端口在服务器端也称之为socket接口。
9.4 HTTP request与response详解
客户端浏览器向Web服务器发起request,Web服务器接到request后进行处理,会生成相应的response信息返给浏览器,客户端浏览器收到服务器返回的response信息,会对信息进行解析处理,最终用户看到浏览器展示Web服务器的网页内容。
客户端发起request,request消息分为3奔赴,分别包括request line,request header,body,如下图所示。
HTTP request message组成
UNIX/Linux系统中执行curl -v命令可以打印访问Web服务器的request及response详细处理流程,命令如下,流程如下图。
curl -v http://192.168.22.12/index.html
request及response请求回应流程
(1)request信息详解如下表所示。
GET/index.html HTTP/1.1 | 请求行 | request message |
Server: Apache/2.4.6 (CentOS) Date: Wed, 16 Dec 2020 06:49:25 GMT Content-Type: text/html; charset=UTF-8 ... | 响应头部 | |
> | 空行 | |
<h1>www.zeyunanke.com</h1> | 响应body |
说明:
- 第一部分:相应状态行,包括HTTP协议版本号,状态码,状态消息。HTTP/1.1表示HTTP协议版本号,200表示返回状态码,OK表示状态消息。
- 第二部分:消息包头,响应头部附加信息。Date表示生成响应的日期和时间;Content-Type表示指定MIME类型的HTML(text/html),编码类型是UTF-8,记录文件资源的Last-Modified时间。
- 第三部分:空行,表示消息报头相应完毕。
- 第四部分:响应正文,服务器返回给客户端的文本信息。
(3)request请求方法根据请求的资源不同,有如下请求方法。
- GET方法:向特定的资源发出请求,获取服务器端数据。
- POST方法:向Web服务器提交数据进行处理请求,常指提交新数据。
- PUT方法:向Web服务器提交上传最新内容,常指更新数据。
- DELETE方法:请求删除request-URL所标识的服务器资源。
- TRACE方法:回显服务器收到的请求,主要用于测试或诊断。
- CONNECT方法:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS方法:返回服务器针对特定资源所支持的HTTP请求方法。
- HRAD方法:HRAD方法根GET方法相同,只不过服务器响应时不会返回消息体。
1.5 HTTP 1.0/1.1协议区别
HTTP协议定义服务器端和客户端之间文件传输的沟通方式,HTTP 1.0运行方式,如下图所示。
说明如下:
- 基于HTTP协议的客户/服务器模式的信息交换过程,如下图所示,它分为4个过程,即建立连接,发送请求信息,发送响应信息,关闭连接。
- 浏览器与Web服务器的连接过程是短暂的,每次连接只处理一个请求和相应。对每一个页面的访问,浏览器与Web服务器都要建立一次单独的连接。
- 浏览器到Web服务器之间的所有通信都是完全独立分开的请求和响应。
HTTP 1.1运行方式,如下图所示。
说明如下:
- 在一个TCP连接上可以传送多个HTTP请求和相应;
- 多个请求和响应过程可以重叠;
- 增加了更多的请求头和响应头,比如Host,If-Unmodified-Since请求头等。
1.6 HTTP状态码详解
HTTP状态码(HTTP status code)是用来表示Web服务器HTTP response状态的3位数字代码,常见的状态码范围分类如下:
- 100~199:用于桌指定客户端相应的某些动作。
- 200~299:用于表示请求成功。
- 300~399:已移动的文件且被包含在定位头信息中指定新的地址信息。
- 400~499:用于指出客户端的错误。
- 500~599:用于指出服务器的错误。
HTTP协议response常用状态码详解如下图所示。
HTTP状态码 | 状态码英文含义 | 状态码中文含义 |
200 | ok | HTTP请求完成,常用于GET、POST请求中。 |
301 | moved permanently | 永久移动,请求的资源已被永久的移动到新URI。 |
302 | found | 临时移动,资源临时被移动,客户端应继续使用原有URI。 |
304 | not modified | 文件未修改,请求的资源未修改,服务器返回此状态码时,常用于缓存。 |
400 | bad request | 客户端请求的语法错误,服务器无法解析或者访问。 |
401 | unauthorized | 请求要求用户身份认证。 |
402 | payment required | 此状态码保留,为以后使用。 |
403 | forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求。 |
404 | not found | 服务器没有该资源,请求的文件找不到。 |
405 | method not allowed | 客户端请求中的方法被禁止。 |
406 | not acceptable | 服务器无法根据客户端请求的内容特性完成请求。 |
499 | client has closed connection | 服务器端处理的时间过长。 |
500 | internal server error | 服务器内部错误,无法完成请求。 |
502 | bad gatewy | 服务器返回错误代码或者代理服务器错误的网关。 |
503 | service unavailable | 服务器无法响应客户端请求,或者后端服务器异常。 |
504 | gateway time-out | 网关超时或者代理服务器超时。 |
505 | HTTP version not supported | 服务器不支持请求的HTTP协议版本,无法完成处理。 |
1.7 HTTP MIME类型支持
浏览器接收到Web服务器的response信息,浏览器会进行解析,在解析页面之前,浏览器必须启动本地相应的应用程序来处理获取到的文件类型。
基于多用途互联网邮件扩展类型(multipurpose internet mail extensions,MIME),可以明确某种文件在客户端用某种应用程序来打开,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开,设计之初是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持后,它使得HTTP传输的不仅是普通的文本,可以支持更多文件类型,多媒体音,视频等。
在HTTPResponse消息中,MIME类型被定义在Content-Type header中,例如,Content-Type:text/html,表示默认指定该文件为HTML类型,在浏览器端会以HTML格式来处理。
在最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML文档,为了支持多媒体数据类型,新版HTTP协议中就使用了附加在文档之前的MIME数据类型信息来表示数据类型,如下表所示。