一步步实现WebServer中间件——Http协议

来源:互联网 发布:mysql in 个数限制 编辑:程序博客网 时间:2024/06/05 21:20

要说Http协议就不得不先一下计算机网络的OSI网络七层协议,从上到下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

应用层

是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务,包括TELNET,HTTP,FTP,NFS,SMTP等协议

表示层

可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

会话层

通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识

可以是IP也可以是MAC或者是主机名)。

传输层:

定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量

大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的),

主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,常常把这一层数据叫做段。主要是TCP和UDP协议

网络层:

在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择,Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络

层正是管理这种连接的层。最有名的IP协议就是在网络层。

数据链路层:

定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输。

包括的协议有Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网路 ·FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP

物理层:

主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为

电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特。物理层主要是一些网络的物理

设备以太网路卡 · 调制解调器 · 电力线通信(PLC) · SONET/SDH(光同步数字传输网) ·G.709(光传输网络) · 光导纤维 · 同轴电缆 · 双绞线




不过,我们接触最多的还是TCP/IP四层模型

应用层:

对应OSI中的应用层、表示层、会话层

传输层

TCP、UDP

网络层

IP、ICMP

物理链路层:

对应OSI中的数据链路层、物理层(也有叫网络接口层)



数据从上层向下层传输的时候,每层会给数据添加一个当层的头部,同理,数据在从下层传入上层的时候,相应层会解析相应的头部,

比如在经过网络层的时候,就会添加IP协议的头部,告诉下层本机的IP是多少,要把数据传输到网络IP为多少的机器上去



接下来是TCP/IP协议,IP协议是在网络层,其实就是用来标明一个主机在网络中的位置的,这不难理解

TCP协议是基本IP协议的,TCP协议在传输层,提供可靠的字节流服务,TCP采用了著名的三次握手策略,即发送方先给接收方发送一个接收方在线确认消息

如果接收方在线则返回一个确认在线消息,然后发送方才会真正发送数据给接收方

而UDP则是一种不可靠的基于数据报的协议,UDP不能保证数据一定能到达,因为UDP是没有维持连接的,但UDP的数据传输速度比TCP要优秀一些,在一些对

数据的完整性要求不高的情况下使用较多,比如网络视频传输


扯了一下TCP、UDP、IP协议后回到正题HTTP协议,

HTTP在应用层上, 是一个B/S架构,客户端向服务器端发送请求,请求类型常用折有GET、POST、HEAD、PUT等待,并且HTTP是无连接的,每次的连接只能处理

一个请求,服务器处理完一次请求返回结果后就会断开与客户端的连接,因此HTTP协议也是一种比较快速而且轻量级的协议,我们在JavaWeb中的Session保存会话协议

其实是利用了Cookie在客户端与服务器端来回传输来保存在服务器端有客户端的一个状态保持的。

HTTP的全称是HyperText Transfer Protocol即超文本传输协议

先来说说HTTP协议的URL

URL是指统一资源定位符,要和URI统一资源标识符区别,应该可以这样说,URL是一种具体的URI,因为URL不公可以标识一个网络资源,还可以去定位一个网络

资源。HTTP URL包括请求协议、主机域名或IP地址、端口号、请求资源URI,比如http://127.0.0.1/index其中的http就是协议,127.0.0.1就是主机IP,index就是资源的URI

接下来就是HTTP请求的结构

HTTP请求包括

请求行:

以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF  

其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用Request-URI作为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,... (CRLF)
...
HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF)         //该CRLF表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234  //此行以下为提交的数据

HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。

请求头:

请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:
http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:
www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

空行:

在请求头和主体之间需要一个空行

请求主体:

其实中请求主要可以是文件也可以是请求参数之类的


然后是响应消息

请求一样,响应也有状态行、响应头、空行和响应正文

状态行:

比如  HTTP/1.1 200 OK

其中和HTTP/1.1表示协议版本,200表示响应状态码,

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见的状态码有:
200 OK                        //客户端请求成功400 Bad Request               //客户端请求有语法错误,不能被服务器所理解401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden                 //服务器收到请求,但是拒绝提供服务404 Not Found                 //请求资源不存在,eg:输入了错误的URL500 Internal Server Error     //服务器发生不可预期的错误503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

OK表示状态消息

然后下面的是响应消息头,比如

Date: Fri, 22 May 2009 06:07:21 GMTContent-Type: text/html; charset=UTF-8
表示时间和响应的数据类型

然后又是一个空行

最后就是响应正文,比如返回一个网页

<html>      <head></head>      <body>            <!--body goes here-->      </body></html>


关于协议的内容大概就是这些
在下一篇中将会用Socket来实现Http协议实现一个简单的http服务器

原创粉丝点击