前言要了解Web服务器程序的工作原理,首先我们需要对HTTP协议有一个基本的了解。HTTP(HypertextTransferProtocol,超文本传输??协议)是一种用于网络通信的协议方案。浏览器、服务器和相关的Web应用程序都通过HTTP相互通信。HTTP是现代全球互联网中使用的通用语言。HTTP概述每天,数十亿的图像、html、文本文件、电影、音频、小程序和其他资源在网络上传输。HTTP可以快速轻松地将这些信息从世界各地的服务器传送到您面前的浏览器。HTTP使用可靠的数据传输协议,即使数据来自世界的另一端,也能保证数据在传输过程中不被损坏或混淆。联想到我们日常的上网需求,可以看出HTTP在其中起到了举足轻重的作用。这时候我就很好奇客户端和服务端,或者说web应用程序是如何使用HTTP进行通信的,HTTP又是如何完成它的传输工作的。客户端如何与服务器通信服务器使用HTTP协议,因此常被称为HTTP服务器。客户端向服务器发送HTTP请求,服务器在HTTP响应中返回请求的数据。因此,HTTP客户端和HTTP服务器共同构成了Web的基本组件。我们每天都使用HTTP客户端。最常见的客户端是浏览器,它从服务器请求HTTP对象并将这些对象显示在屏幕上。例如,浏览网页(www.91wutong.com)时,浏览器会向服务器www.91wutong.com发送HTTP请求。服务器将寻找所需的对象,如果成功,则将对象、对象类型、对象长度和其他信息通过HTTP响应发送给客户端。网页内容资源从何而来?我们每天请求的内容都存储在服务器上,服务器是请求资源的宿主。最简单的Web资源是服务器文件系统中的静态文件。比如福星有一个static7.com服务器。每次我把我要用的图片发给他,让他放到服务器里,只要他的服务器还在维护,我在地球的任何一个角落都可以通过url访问。还有其他资源是按需生成内容的软件程序,例如股票交易、关键字搜索数据或在线购买商品。任何可以提供内容的东西都是网络资源。Web事务如何工作HTTP事务由请求命令(从客户端发送到服务器)和响应结果(从服务器发送回客户端)组成。这种通信通过称为HTTP消息的格式化数据块进行。方法HTTP支持几种不同的请求命令,这些命令称为HTTP方法。每个HTTP请求消息都包含一个方法。GET从服务器向客户端发送命名资源PUT将来自客户端的数据存储到命名服务器资源中返回时将带有状态代码。状态代码是一个三位数的代码,它告诉客户端请求是否成功或是否需要其他操作。一些常见的HTTP状态码:200ok302Redirect重定向到其他地方获取资源404NotFound找不到这个资源...状态码范围说明2xx200-206success3xx300-305redirect4xx400-415clienterror5xx500-505servererrorHTTP通信目前使用的消息格式,我们了解到HTTP通信需要客户端发送HTTP请求。服务器收到请求后,寻找期望的资源并返回一个响应对象。来回的请求和响应构成了一个http事务,这个通信过程是通过被称为HTTP消息的格式化数据块来进行的。一个完整的HTTP消息包括:起始行、头字段和正文。起始行描述了请求消息中要做什么以及响应消息中发生了什么;头域包含一个名称和一个值,用冒号分隔,表示请求或响应对象的类型和数据量;主体部分,请求体包含要发送给服务器的数据,响应体包含要返回给客户端的数据。通信过程大概是这样的,但是我又在想,client是怎么建立这个通信的,连接之后怎么互相调用呢?就像找对象一样,每天看着身边的人和对象,当初是怎么谈恋爱的。要理解这一点,有必要理解互联网协议。在客户端向服务器发送消息之前,互联网协议首先在客户端和服务器之间建立一个TCP(传输控制协议)连接,就像日常打电话一样拨打对方的号码。在不知道对方物理位置的情况下将数据从一个地方传输到另一个地方,你不觉得很神奇吗?你是怎么做到的?这就是Internet协议可以做的。Internet的核心是一系列统称为“Internet协议”的协议。他们对计算机的连接和联网方式做出了详细的规定。层模型Internet就像生活中的建筑物。它是一个多层模型,一层依赖于另一层,每一层都依赖于下一层的支持,每一层都有自己的功能。关于互联网分层的理论有很多种,包括七层模型和五层模型,名称各不相同。但是在功能上,名字叫什么无所谓,只要你知道互联网是分几个层次的。下面来分析一下五层:应用层、传输层、网络层、数据链路层、物理层(physicallayer),最顶层是用户接触到的应用层,最底层是物理层。中间三层从下到上分别是链路层、网络层和传输层。层数越低,离硬件越近;上层越高,离用户越近。每一层都是完成一个特定的功能。为了实现功能,大家需要遵循共同的规则,达成一个好的协议。每一层都定义了很多协议,这些协议统称为互联网协议,是互联网的核心。我们每天接触最多的就是应用层,下面的楼层我们完全感受不到。要了解互联网,就必须自下而上地了解每一层的功能。当物理层(physicallayer)的计算机需要联网时,首先要做的是什么?当然,连接计算机可以使用光缆、电缆、双绞线、无线电波等。物理层的作用是连接计算机的物理手段,作用是传输电信号。你能猜出这里传输的信号是什么吗?当然是二进制数据,像0和1这样的电信号。链路层位于物理层之上,决定了0和1如何分组。解读0和1,多少个电信号组成一组,每个信号位代表什么意思。这很像接到电报后的翻译等等,多少是一组,这个组是什么意思。在以太网协议的早期,每个公司都有自己的电信号分组方式,后来称为以太网的协议作为解释标准占据主导地位。以太网规定一组电信号构成一个数据包,称为“帧”。每一帧分为两部分:头部和数据。Header头:包含数据包的一些描述项,如发送方、接收方、数据类型等;长度固定为18字节data:数据包的具体内容;最小长度为46字节,最长为1500字节。所以整个“帧”最少64字节,最多1518字节。如果数据很长,就必须分成多帧来传输。MAC地址数据我知道,但是header中的信息是怎么来的呢?header中包含了sender和receiver的信息,那么这两个是用来标识什么的呢?以太网规定所有接入网络的设备都必须有“网卡”接口。数据包必须从一个NIC发送到另一个NIC。网卡的地址就是数据包的发送地址和接收地址,称为MAC地址。每块网卡出厂时都有一个全球唯一的MAC地址,长度为48位二进制,通常用12位十六进制表示。一个网卡怎么知道另一个网卡的MAC地址呢?(ARP协议)如果知道这个地址,如何将数据包准确的发送给接收方呢?以太网采用了一种非常“原始”的方法。它不是点对点传输数据,而是将数据发送给网络中的所有计算机,让每台计算机通过数据包的包头信息来判断自己是否是接收者。这种方法称为“广播”。有了数据包的定义,网卡的MAC地址,广播的发送方式,以及“链路层”,数据就可以在多台计算机之间传输。但是,所有的计算机都使用一个“数据包”进行广播来寻找对应的机器,效率低下且仅限于发送方所在的子网。如果所有的机器都在一个子网中,每台机器都会收到所有的数据包并比较MAC地址,这是一场灾难。互联网应该是一个由无数子网组成的巨网,从而导致了“网络层”的诞生。网络层的作用是引入一组新的地址,以便我们区分不同的计算机是否属于同一个子网。这组地址称为“网络地址”,简称“URL”。因此,每台计算机都有两个地址,一个网络地址和一个MAC地址,两个地址之间没有相互联系。URL帮助我们确定计算机在哪个子网上,MAC地址将数据包发送到子网上的目标NIC。从逻辑上看,这两个地址的处理顺序是先是网络地址,再是MAC地址。IP协议规定了网络地址的协议,称为IP协议。它定义的地址称为IP地址。网络上的每一台计算机都会被分配一个IP地址,IP地址分为两部分,前一部分代表网络,后一部分代表主机。子网上的计算机必须具有相同的IP地址网络部分。但是现在有一个问题,但是从IP地址,我们无法判断网络部分。以192.168.20.8为例,无法看出他的网络部分是前24位还是前16位。那么如何从IP地址判断两台机器是否在同一网络呢?这也使用了另一个参数“子网掩码”。所谓“子网掩码”,就是一个代表子网特性的参数。它在形式上相当于一个IP地址,也是一个32位的二进制数。它的网络部分全为1,主机部分全为0。比如192.168.20.8,已知的子网掩码是11111111.11111111.11111111.00000000写成十进制是255.255.255.0。知道了“子网掩码”,我们就可以判断任意两个IP地址是否在同一个子网中。方法是分别对两个IP地址和子网掩码进行AND运算。(两位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是,则说明在同一个子网,否则则不同。IP协议的主要作用有两个,一个是给每台计算机分配一个IP地址,另一个是判断哪些地址在同一个子网中。IP数据包按照IP协议发送的数据称为IP数据包,其中必须包含IP地址信息。如前所述,以太网数据包中只包含MAC地址,没有IP地址字段。此时IP信息是如何添加到数据包中的呢?我们可以将IP数据包直接放入以太网数据包的“数据”部分,所以根本不需要修改以太网规范。这就是互联网分层结构的好处:上层的变化根本不涉及下层的结构。ARP协议IP包是在以太网包中发送的,所以我们必须知道两个地址,一个是对方的MAC地址,一个是对方的IP地址。通常,对方的IP地址是已知的(稍后解释),但我们不知道它的MAC地址。因此,我们需要一种从IP地址中获取MAC地址的机制。这里有两种情况。第一种情况,如果两台主机不在同一个子网,那么实际上是没有办法得到对方的MAC地址的,只能把数据包发送到位于的“网关”(gateway)两个子网的连接由网关处理。第二种情况,如果两台主机在同一个子网,那么我们就可以使用ARP协议来获取对方的MAC地址。ARP协议还发送一个数据包(包含在以太网数据包中),其中包含它要查询的主机的IP地址。在对方MAC地址一栏,填写FF:FF:FF:FF:FF:FF,表示这是一个“广播”地址。其所在子网中的每一台主机都会收到这个数据包,从中提取IP地址,并与自己的IP地址进行比较。如果两者相同,则都回复并向对方报告自己的MAC地址,否则丢弃该数据包。总之,利用ARP协议,我们可以获取同一子网内主机的MAC地址,并将数据包发送给任意一台主机。有了传输层的MAC地址和IP地址,我们就已经可以在Internet上任意两台主机之间建立通信了。下一个问题是同一台主机上的许多程序需要使用网络。例如,您在浏览网页的同时与朋友在线聊天。当一个数据包从互联网发出时,你怎么知道它代表的是网页的内容还是在线聊天的内容?“传输层”的作用是建立“端口到端口”的通信。相比之下,“网络层”的功能是建立“主机到主机”的通信。只要确定了主机和端口,我们就可以实现程序之间的通信。UDP协议现在,我们必须将端口信息添加到数据包中,并将其放在IP数据包中。前面说过,IP数据包是放在以太网数据包里面的,所以现在整个以太网数据包就变成了下面这样:这就是UDP协议。它简单易行,但可靠性较差。数据包一旦发送出去,就无法知道对方是否收到了。为了解决这个问题,提高网络的可靠性,TCP协议诞生了。TCP协议TCP协议很复杂,但可以近似为带有确认机制的UDP协议,可以保证数据不会丢失,每发送一个数据包都需要确认。如果数据包丢失,则不会收到确认,发送方知道有必要重新发送数据包。只要建立了TCP连接,客户端和服务器之间的消息交换就不会丢失、损坏或乱序接收。应用层应用程序接收“传输层”数据,然后对其进行解释。由于互联网是一个开放的架构,数据来自各种来源,必须事先指定格式,否则无法解读。“应用层”的作用是规定应用程序的数据格式。例如,TCP协议可以为各种程序传输数据,如Email、WWW、FTP等。那么,必须有不同的协议来规定电子邮件、网页、FTP数据的格式,而这些应用协议就构成了“应用层”。这是最高层,直接面向用户。它的数据放在TCP数据包的“数据”部分。因此,当前的以太网包变成如下。示例:访问网页节点基础模块HTTP
