我们每天都会浏览各种网站,打开不同的链接,这一切都是web在为我们提供服务。通俗的讲,web服务就是运行在服务器端的web应用程序响应客户端的请求(主要是我们的客户端浏览器)。今天我们简单介绍下web服务的基本概念,在一个整体的框架下来看web服务。
本文的主要内容包括:
简单概念
http的相关概念
http报文简析
web服务的简单I/O结构
web请求过程
一、简单概念
web服务是运行在服务器端的web应用程序提供服务,客户端浏览器请求响应交互的一个过程。双方通信是通过套接字socket来进行的,在通信双方都会有一个套接字文件产生,客户端使用本机IP地址加随机端口号,服务器端使用服务器IP加监听的IP地址。双方通过TCP套接字进行通信。
web服务基于传输层的TCP协议,因此需要建立安全的连接。如下图
左侧为客户端浏览器,右侧为服务器端。客户端浏览器发出请求,生成套接字文件,并缓存到本地,然后交给网络进行通信。通信子网经过三次握手,同服务器建立连接,服务器端收到请求后,内核获取到相关请求。用户进程(web服务进程)实现在内核中注册了自己监听的端口,生成套接字文件。内核根据注册的信息,将数据分配给不同的服务。当数据接收完成之后,tcp连接断开。web连接是一种无状态的连接。
二、http的相关概念
http协议是web服务运行在应用程序的具体实现。http:hypertext transport protocol,超文本传输协议,在早期,仅能传输文本文件,随着版本的更新,加入了MIME功能,才实现传输图片、视频等非文本信心。http版本及功能对照如下:
http0.9 | 最早的版本,仅能传输文本文档 |
http1.0 | 引入了MIME,支持多媒体的数据传输,并且支持持久连接keep-alive,有一定的缓存功能 |
http1.1 | 提供了更多的请求方法,更精细的缓存控制,更加完善的持久连接 |
MIME:Multipurpose Internet Mail Extension,最早是用于改善邮件传输的,使得邮件能够传输多媒体信息,他使用base64的编码方式,将二进制的数据编写成文本进行发送,并能放接受放还原为原来的格式。
三、http报文简析
http每次的请求和服务器端的响应组成了一次http事务。客户端发出请求,服务器端回馈应答。这里简单分析下http的请求和应到报文。
1、请求报文
请求报文的简单格式
<method> <request-URL> <version>
<headers>
<entity-body>
<method> | 请求方法,请求服务器做的动作 | GET HOST HEAD PUT 等 |
<request-URL> | 请求的资源 | 可以是相对路径,也可以是完整的url |
<version> | 协议版本,格式HTTP/<major>.<minor> | http/1.0 http/1.1 |
<headers> | HTTP首部,格式Name: Value | Content-type: p_w_picpaths/gif |
<entity-body> | 主体部分 | 请求报文一般为空 |
<method>是客户端对服务器端发起请求使用的方法,主要使用的方法有如下表
GET | 请求获取一个资源,需要服务器发送数据 |
HEAD | 跟GET相似,但其不需要服务发送资源而仅传回响应首部 |
POST | 支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置 |
PUT | 与GET相反,向服务写入文档 |
DELETE | 请求删除URL指向的资源 |
OPTIONS | 探测服务器端对某资源所支持的请求方法 |
TRACE | 跟踪请求要经过的防火墙、代理或网关等 |
扩展的方法 | LOCK、MKCOL、COPY、MOVE |
请求首部,包含了丰富的信息,可以有多个同时存在,如下图
常见的请求首部信息如下
Client-IP | 源地址IP | |
Host | 请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机 | |
Referer | 当前请求资源的url的原始资源,比如说我们从www.baidu.com跳转过来,那么referer就是http://www.baidu.com | |
User-Agent | 用户代理,通常是浏览器信息 | |
Accept首部 用户标明客户自己更倾向于支持的能力 | Accept | 指明服务器能发送的媒体类型 |
Accept-Charset | 支持使用的字符集 | |
Accept-Encoding | 支持使用的编码方式 | |
Accept-Language | 支持使用语言 | |
条件请求首部 | Expect | |
If-Modified-Since | 是否在指定时间以来修改过此资源 | |
If-None-Match | 判断请求的文件是否被修改 | |
跟安全相关的请求首部 | Authorization | 客户端提交给服务端的认证数据 |
Cookie | 客户端发送给服务器端身份标识 | |
Cookie2 | cookie的升级版 |
2、响应报文
响应报文格式
<version> <status> <reason-phrase>
<headers>
<entity-body>
version | 协议版本 |
status | 状态码 |
reason-phrase | 原因短语,数字状态码的易读信息 |
headers | 首部信息 |
entity-body | 主题部分,一般为网页信息 |
status是服务器对客户端的请求报文的回应状态码,主要有以下
1xx | 信息性状态码 |
2xx 成功状态码 | 200: OK 201: Created |
3xx 重定向状态码 | 301:Moved Permanently, 在响应报文中使用首部“Location: URL”指定资源现在所处的位置; 302:Found, 在响应报文中使用首部“Location: URL”指定临时资源位置; 304:Not Modified, 条件式请求中使用; |
4xx 客户端类的错误 | 403:Forbidden,请求被服务器拒绝 404:Not Found,服务器无法找到请求的URL 405:Method Not Allowed,不允许使用此方法请求相应的URL |
5xx 服务器类的错误 | 500:Internal Server Error,服务器内部错误; 502:Bad Gateway,代理服务器从上游收到了一条伪响应; 503:Service Unavailable,服务器此时无法提供服务,但将来可能可用; |
同样的响应首部也可以同时出现多个,一般较常见的如下
Age | 期限 |
Server | 向客户端标明服务器程序名称和版本 |
协商首部 | Accept-Ranges:对当前资源来讲,服务器所能够接受的范围类型 |
Vary: 首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端 | |
跟安全相关的响应首部 | Set-Cookie: 服务器端在某客户端第一次请求时发给令牌 |
Set-Cookie2: | |
WWW-Authentication: 质询,即要求客户提供帐号和密码 |
除了请求首部和响应首部外,还有通用首部、实体首部、扩展首部
通用首部顾名思义,是请求和响应都可以使用的首部信息,主要包括
Connection | 定义C/S之间关于请求/响应的有关选项,对于http/1.0, Connection: keep-alive |
Via | 显示了报文经过的中间节点 |
Cache-Control | 缓存指示 |
Pragma | http/1.0 |
实体首部常见的有
Location | 资源的新位置 |
Allow | 允许对此资源使用的请求方法 |
内容首部 | Content-Encoding Content-Language Content-Length Content-Location Content-Range Content-Type |
缓存首部 | ETag: 实体标签 Expires: 过期期限 Last-Modified: 上一次的修改时间 |
四、web服务的简单I/O结构
在服务器端,页面存放在物理磁盘上,因此,I/O经常会成为整体性能的瓶颈。这里简单介绍下,web服务下的简单I/O模型
1、单线程I/O结构,这种结构下,一个web进程只能响应一个请求
2、多线程I/O结构
web服务器同时发起多个进程,每个进程都响应一个请求
3、复用的I/O结构
一个进程响应多个请求,在这种情况下,一个进程崩溃也不至于影响其他进程的工作。
4、服用的多进程I/O结构
在此结构下,服务器发起多个进程,每个进程可处理多个请求
五、web请求过程
接下来简单描述下一次web事务的基本过程
借鉴一张图来描述,所有权归画图人所有
1、我们客户端从浏览器发起请求,经过TCP/IP协议栈的工作,三次握手,同服务器间建立起连接,客户端将请求发送给了服务器
2、服务器端通过监听在内核中的端口等信息接收到客户端请求
3、服务器端的web服务器调用模块等处理客户端的请求
4、web服务器程序根据需求通过I/O获取资源
5、web服务处理资源,构建响应
6、服务器发送响应信息给客户端
7、在构建响应时,服务器端会在磁盘中写入处理事务的过程,这里可以理解为日志信息
六、小结
这里简单的描述了一些web服务器的简单内容,由于刚刚接触,还没有完全形成体系架构,可能有会疏漏与凌乱的地方,请读者批评指正。下一篇,将以httpd为具体实例来进行介绍。
2014-3-18 V1.0 初始版本