目前,市场上流行有很多web服务器软件,每种服务器都有自己的特点。我们在开发的过程中,经常要和它们打交道,所以了解它们的工作原理也是很重要的。

几款比较流行的服务器

它们会做些什么?

第三篇中有这样的一张图片,它演示了客户端和服务器在发起事务时它们需要做的几个事情。

这里就详细地谈谈服务器在运行过程中会做什么。

首先服务器在完全运行起来之后,客户端就可以向服务器发起连接了(关于这个部分,大家可以看第三篇笔记)。现在的web服务器大多数都是多线程服务器了,一般在服务器上配置连接池,限制连接的数量,可以大大减轻服务器的连接压力,以保证网络服务的质量。

在这个阶段,服务器也会判断客户端的身份,比如一些有恶意行为的IP地址,服务器会拒绝建立连接。

接下来,服务器就会开始接受客户端发出的报文并解析它们(关于报文可以看第四篇笔记)。服务器首先会读取报文的起始行。从它请求的方法中以确定这个请求需要给予什么样子的响应,在这之后,服务器就会去读取uri,确定资源的地址,最后在这行信息中检测客户端使用的http版本,以确定首部的一些信息解读的方式。之后就是读取各行的信息,直到检测到以CRLF( Carriage-Return Line-Feed 回车换行)结束的标识。在这之后服务器就会对请求开始处理了,比如像post中的一些数据传递到程序中。

此时,服务器要开始很重要的步骤了,找到客户端希望得到的资源,开始构建一个特别的内容给客户端,这些都是程序处理的部分了。当然,这里请求的资源使用路径都是服务器上的虚拟路径,不是服务器文件系统上的绝对路径。这个虚拟路径恰好把资源封闭在一个固定的路径中,不让访问突破规定范围。在linux中有一种SELinux的机制,进程只能访问那些在他的任务中所需要文件。

在确定了要发送的内容之后,服务器会构建一个响应报文并发送它们。这里面通常会包括一个响应主体的MIME类型响应主体的Content-length以及响应主体页面。发送完毕后,服务器会检测这是不是一个持久连接,并根据此,决定是不是要关闭连接。

字符编码

我想凡是做过开发的人一定都遇到过字符编码乱码的问题。关于字符编码的问题非常复杂。其中有一些就和web服务器接收和构建报文有关系。

一个客户端吧请求报文在发送给服务器时,可以在发送前,在首部通过设置Accept-Charest和Accecpt-Encoding告诉服务器自己期待的字符编码方式。服务器会根据这条信息给予客户端最优化的方案。但有时,乱码依旧。而这些乱码是从哪里来的呢?

这要从它的历史说起了,最早的ASCII码并不支持中文,为了满足我们国家的需要,有人对ANSi(ASCII的扩充)码进行了扩充,制作了GB2312,后来发现GB2312不能显示一些生僻的字,于是gbk编码就诞生了,在这之后,有进行了几次扩展。

但是在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字,这就是意味着不同国家的人相互访问网站的时候,由于不同的编码,我们就会看见不同的内容(大部分都是不知所云的乱码)。

后来有了Unicode编码,每个符号对应一个唯一的编码,乱码问题就不存在了。但是这样做这个库就非常庞大,UTF-8可以根据不同的符号自动选择编码的长短,这样又一次提高了字符编码的效率。

所以,utf-8应该是我们最好的选择。如果我们使用GB2312,我们在URL传递中文数据时,就会变成一堆符号和数字,而我们采用utf-8时,就不会有这个问题。有时候,我们很少注意,自己在开发时,页面本身的字符编码格式。所以很多不同字符编码定义,就让服务器不知所措了,有时候数据库的字符编码和接收的字符编码又是不同的,这里又一次造成了编码的不和谐。

HTTP学习笔记(五)的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  9. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  10. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

随机推荐

  1. 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'

    error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Tra ...

  2. 【Mail】JavaMail介绍及发送邮件(一)

    JavaMail介绍 JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP.POP3.IMAP,开发人员使用JavaMail ...

  3. DUT Star Round2

    A.Zeratu的军训游戏 Problems: 开灯问题,问无数次操作之后第n盏灯的状态 Analysis: cj:平方数有奇数个约数 Tags: Implementation B.Zeratud的完 ...

  4. new出对象的作用

    new调用了构造函数以后 构造函数会返回一个对象的实例

  5. thinkphp3.2.3批量执行sql语句(带事务)

    /** * 事务封装方法 * @access public 将此方法放入框架model.class.php中 * @param array $sqls 要执行的sql数组或语句 * @param ar ...

  6. The Template method pattern

    public class TemplateMethodDemo { public static void main(String[] args) { Teacher test=new Javatrea ...

  7. iOS App打包上架的流程

    一.申请苹果开发者账号 首先需要申请苹果开发者账号才能在APP store 里发布应用. 开发者账号分为:(1)个人开发者账号   (2)企业开发者账号   主要的区别是:点击打开链接 1.个人开发者 ...

  8. svn 版本库的创建和配置

    1.创建SVN版本库 mkdir trunk svnadmin create /root/trunk/svntest #这里是路径和即将创建的版本库名称 2.配置svn cd /root/trunk/ ...

  9. 自己封装的一个无限滚动 mark 待传

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  10. linux系统启动时更改MAC地址

    vim /etc/rc.local #change the server's MAC address("00:50:56:84:5C:76" change to 00:50:56: ...