HTTP协议和tomcat中的HTTP实现(一)
这一段时间看了tomcat的HTTP相关的源码实现,重点关注了keep-alive的实现机制。以下是对源码的分析和一些自己的感悟。
谈HTTP的实现还是要对http协议本身做一些了解。下面先对HTTP相关的知识做一些整理,再谈一下HTTP在tomcat的实现。
?
一、HTTP协议
谈HTTP协议之前先谈下TCP/IP协议。
?
1、TCP/IP
TCP/IP:传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol),又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。
TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。
许多用户熟悉使用TCP/IP协议的高层应用协议。包括万维网的超文本传输协议(HTTP),文件传输协议(FTP),远程网络访问协议(Telnet)和简单邮件传输协议(SMTP)。这些协议通常和TCP/IP协议打包在一起。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
?
2、HTTP和TCP/IP的关系
HTTP是使用TCP/IP协议的高层应用协议。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。
HTTP使用TCP而不是UDP的原因在于(打开一个)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
?
3、HTTP
HTTP:超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议。
HTTP是超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
HTTP可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以http://开头的原因。
?
4、HTTP协议的内容
HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个指示头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
?
4.1、HTTP请求消息构成
请求消息格式如下所示:
?
请求行
?
通用信息头|请求头|实体头
?
CRLF(回车换行)
?
实体内容
?
其中“请求行”为:请求行 = 方法 [空格] 请求URI [空格] 版本号 [回车换行]
?
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET???? 请求获取Request-URI所标识的资源
POST??? 在Request-URI所标识的资源后附加新的数据
HEAD??? 请求获取由Request-URI所标识的资源的响应消息报头
PUT???? 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE? 请求服务器删除Request-URI所标识的资源
TRACE?? 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
?
4.2、HTTP响应消息构成
HTTP响应消息的格式如下所示:
?
状态行
?
通用信息头|响应头|实体头
?
CRLF(回车换行)
?
实体内容
?
其中:状态行 = 版本号 [空格] 状态码 [空格] 原因 [回车换行]
?
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK????? //客户端请求成功
400 Bad Request? //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden? //服务器收到请求,但是拒绝提供服务
404 Not Found? //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable? //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
?