HTTP学习笔记(五)
目前,市场上流行有很多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学习笔记(五)的更多相关文章
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
随机推荐
- 20145229&20145316《信息安全系统设计基础》实验一 开发环境的熟悉
实验封面 实验内容 本次实验使用 Redhat Linux 9.0 操作系统环境,安装 ARM-Linux 的开发库及编译器.创建一个新目录,并在其中编写 hello.c 和 Makefile 文件. ...
- interactivePopGestureRecognizer
苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni ...
- photoshopcc基础教程
web项目中,除了最基础的用java存取数据外,还有重要的h5+css排版以及图片的ps,排版多多看网上人家的好看的界面设计,至于图片,只能自己上手了,设计最终的目的是好看,好看,好看. 接下来,做个 ...
- android 常见面试题以及答案
http://blog.csdn.net/bobo1808/article/details/6783344 1. 请描述下Activity的生命周期.2. 如果后台的Activity由于某 ...
- OD使用教程
OD使用教程: 跳转指令.满足才能跳转成功
- js 变量提升和函数提升原理
关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代 ...
- spring mvc 使用ehcache
一.需要导入的jar包 1.ehcache.jar 2.ehcache-spring-annotations-1.2.0.jar 3.guava-r09.jar 4.slf4j-api-1.6.6.j ...
- 【react学习笔记】-jsx
//jsx定义组件 var Divider = React.creatClass({ getIsComplete:function(){ return 'is-complete' }, handleC ...
- 关于ubuntu16.4 中安装最新的eclipse或者是STS出现页面特卡,且新建项目没有提示,preference选项中点击左侧标签右侧没反应的解决办法,参照google, 排版不太好,希望对一些小伙伴有所帮助
up vote21down votefavorite 12 Eclipse was working as good as anything on 14.04. I did a clean instal ...
- Linux下VirtualBox启动物理硬盘上已安装的Window 8系统
创建虚拟机 1.创建一个没有硬盘的windows虚拟机,与已安装在物理硬盘上的系统一致.2.通过命令行在创建的虚拟机目录下创建一个指向物理硬盘的虚拟硬盘 VBoxManage internalcomm ...