目前,市场上流行有很多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. js继承

    js继承有5种实现方式: 继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function ...

  2. 按Enter键触发事件

    1.document.onkeydown=function(e){        var keycode=document.all?event.keyCode:e.which;        if(k ...

  3. centos 如何清理/dev/vda1系统盘

    df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr 2.du -sh * 看哪个目录占用空间大 3.重复前两步,根据实际情况删除或者移走 4.日志的话可以运行 ...

  4. 再牛逼的梦想,也抵不住SB似的坚持

    说起梦想,哪都是好几年前的事了.自从毕业之后,梦想不知道去哪了.可能一次次的失败,找不到了梦想的方向了吧! 自从毕业去了深圳,为了能够在这个城市安稳下来,白天正常上班晚上在街上摆地摊给人下载音乐和电影 ...

  5. JavaScript-在当前显示区范围内实现点不到的小方块

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Java学习笔记 06 数字格式化及数学运算

    一.数字格式化 DecimalFormat类 >>DecimalFormat是NumberFormat的子类,用于格式化十进制数,可以将一些数字格式化为整数.浮点数.百分数等.通过使用该类 ...

  7. IAR之文件路径设置

    1.命令解释 $PROJ_DIR$表示工程所在路径 $TOOLKIT_DIR$表示IAR安装目录所在头文件路径 \..\表示返回上一级目录. 2.头文件路径设置 打开工程文件,找到"opti ...

  8. 为什么一个类的全局变量默认以m开头?

    某天闲着无聊,突然想起来为什么大家都习惯将全局变量使用m开头,于是追根求源,查了一些资料,虽然并不是我想要的,但是也总结一下. 在stackoverflow上就有人问: Why do most var ...

  9. A List of Social Tagging Datasets Made Available for Research

    This list is not exhaustive - help expand it! Social Tagging Systems Research Group Source Year Obta ...

  10. Changing the Color of Linux ls Command 改变Linux的ls命令显示的颜色

    Linux command ls basically use the file /etc/DIR_COLORS or /etc/DIR_COLORS.xterm to define the color ...