基于Socket实现的最简单的Web服务器【ASP.NET原理分析】

基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
通常我们借助浏览器通常是IEFireFox或者Chrome浏览网页例如我们在地址栏中输入DebugLZQ的博客网址DebugLZQ - 博客园回车之后就会在浏览器的窗口中看到Debug的主页如下图所示在这个简单的操作背后影藏了巨大的复杂性。我们在地址栏中输入的内容称为通用资源标记符Universal Resource IdentifierURI它有很多种样式在Web中我们通常称为统一资源定位符Uniform Resource LocatorURL的形式它的格式如下协议//主机[.端口号][绝对路径[?参数]]在DebugLZQ - 博客园中http表示协议名称;www.cnblogs.com表示主机的地址可选的端口号没有出现那么将使用http协议默认的端口号80绝对路径为/DebugLZQ/;在这个例子中没有参数出现。在.NET中不管是URI还是URL都使用定义在System命名空间中得URI类来进行处理。对应上面的介绍这个类定义了5个属性分别对应5个组成部分如下所示Scheme协议的名称Host取得URI地址中得主机部分Port取得端口号AbsolutePath绝对路径部分QueryURI地址中得参数部分下面的例子演示了地址中各个部分usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceURI说明{classProgram{staticvoidMain(string[] args){System.Uri DebugLZQAddress newUri(http://www.cnblogs.com/DebugLZQ/);Console.WriteLine(Scheme: {0},DebugLZQAddress.Scheme );Console.WriteLine(Host: {0}, DebugLZQAddress.Host );Console.WriteLine(Port: {0}, DebugLZQAddress.Port );Console.WriteLine(AbsolutePath: {0}, DebugLZQAddress.AbsolutePath );Console.WriteLine(Query: {0}, DebugLZQAddress.Query );}}}输出结果如下其中绝对路径部分使用类似于Unix的文件目录的形式来描述服务器中得资源这个绝对路径呗传送到服务器之后在Web服务器上通常被称为虚拟路径。我们在地址栏输入URL后如何找到服务器呢互联网上的主机千千万我们要访问的服务器是互联网上数千万台服务器中得一台它很可能远在地球的另一边。浏览器要找到服务器需要提供服务器的网络地址。在当前的TCP/IP协议下所谓服务器的网络地址就是一个IP地址目前我们使用IPv4的地址即IP协议第4个版本规定的地址每个地址由四个字节共32位组成。理论上将可以表示4G个网络地址。通常我们用远点分隔四个数字来表示一个地址每个数字对应地址的一个字节例如微软的IP地址为207.46.19.254直接在地址栏中输入http://207.46.19.254也可以访问网页。但是这些数字实在很难让人记忆人们更愿意通过一个有意义的名字来找到一台主机。在经历了短暂得互联网初期阶段之后1983年保罗·莫卡派Paul Mockapetris发明了域名系统这样在互联网上我们可以为IP地址起一个有意义的名字以方便找寻主机这个名字成为域名。比如微软Web服务器的域名为www.microsoft.com这个名字对应实际IP地址为207.46.19.254。虽然这个名字很好记但是只有这个名字并不能直接找到微软的Web服务器必须建立起名字和IP地址之间的对应关系。这个工作由域名服务器DNS即Domain Name Server完成。DNS服务器提供一个列私语分层的通讯录允许用户通过域名来查找对应的地址或者完成通过地址来查找对应的域名。通常情况下互联网服务商已经为我们自动设置了DNS服务器因此可以简单地通过www.microsoft.com域名找到微软的Web服务器。找到服务器之后需要将请求从我们的客户端传输到服务器那么两台计算机是如何通信的呢他们如何才能理解彼此发送的数据呢这就需要提到协议。当浏览器寻找到Web服务器的地址之后浏览器帮助我们把对服务器的请求转换为一系列参数发送给Web服务器。服务器受到浏览器发来的请求参数之后将会分析这些数据并进行处理。然后向浏览器回应处理的结果也就是一些新的数据这些数据通常是HTML网页或者图片。浏览器收到之后解析这些数据将它们呈现在浏览器的窗口中这就是我们看到的网页。在浏览器与Web服务器的对话中需要使用双方都能够理解的语法规范进行通信这种程序之间进行通信的语法规范我们称之为协议。协议有许多种根据国际标准化组织ISO的网络参考模型程序与程序之间的通信可分为7层从低到高依次为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。每层都有自己对应的协议。比如应用层之间的协议我们称之为应用层协议。不同的应用程序可能有着不同的应用层协议。同一层的协议也可能有很多种。浏览器与Web服务器之间的协议是应用层协议当前我们主要遵循的协议为HTTP/1.1。HTTP协议是Web开发的基础这是一个无状态的协议客户机与服务器之间通过请求和相应完成一次会话Session。每次会话中通信双方发送的数据称为消息Message消息分两种请求消息和回应消息。消息的格式如图所示。图DebugLZQ用绘图画的不太美观。吼吼。。。 博友心声真丑。。。每个消息可能由三部分组成第一部分为请求行或者回应的状态行第二部分为消息的头部第三部分为消息体部分。消息头部分和消息体部分使用一个空行进行分隔。通常情况下我们在客户端使用浏览器来访问服务器浏览器软件帮助我们构造所有的请求消息。使用Fiddler软件可以帮助我们检测到浏览器与服务器之间的通信内容如图所示。上图右上部为浏览器请求的内容可以看到第一行为请求行请求的内容为GET Your request has been blocked. This could be due to several reasons. HTTP/1.1下面的连续N行为请求头部分然后是一个空行由于是GET请求所以没有请求体部分。图右下部为服务器回应的内容第一行为回应的状态行HTTP/1.1 200 OK表示请求的内容可以找到但是需要到另外的地址去取。下面的15行为回应的头部。一个空行分隔了回应的头部和回应体部分回应体中为一个简单的HTML网页。HTTP协议定义了内容的格式这是一个应用层的协议应用层协议的内容需要通过传输层在浏览器和服务器之间传送TCP/IP协议是ISO网络参考模型的一种实现。在TCP/IP协议中与网络程序员相关的主要有两层传输层和应用层。传输层协议负责解决数据传输问题包括数据通行的可靠性问题。传输层依赖更底层的网络层来完成实际的数据传输在TCP/IP网络协议中负责可靠通信的传输层协议为TCP协议。而网络层一般用网络驱动来实现普通的程序员不会涉及在TCP/IP协议中网络层的协议为IP协议。应用层用于在特定的应用程序之间传输数据。HTTP协议就是TCP/IP协议中专门用于浏览器与Web服务器之间通信的应用层协议。应用层协议依赖于传输层协议完成数据传输传输层协议依赖于网络层协议王城数据传输他们之间的关系如下图浏览器与服务器之间网络通信的传输过程