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]图 ...
随机推荐
- 流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细 ...
- 开发前准备 va2015安装
1.下载vs2015 2.进行安装(同时安装node.js.npm与Android SDK,会省很多时间) 安装的时候要选择自定义安装 如果先安装了Android SDK的话就不要勾选了,我就是勾选了 ...
- OD使用教程9
先运行程序打开about,发现这是一个未注册的软件需要注册后才能使用里面的工具,所以随便注册一下,跳出一个提示说注册的是非法的邮箱,所以就可以以此做为突破口来破解这个程序 将提示的语句作为关键字去找出 ...
- React jQuery公用组件开发模式及实现
目前较为流行的react确实有很多优点,例如虚拟dom,单向数据流状态机的思想.还有可复用组件化的思想等等.加上搭配jsx语法和es6,适应之后开发确实快捷很多,值得大家去一试.其实组件化的思想一直在 ...
- Win7 64位 VS2015环境使用qt-msvc2015-5.6.0
QT下载 http://www.qt.io/download-open-source/#section-2 我用的是 qt-opensource-windows-x86-msvc2015-5.6.0. ...
- iOS App打包上架的流程
一.申请苹果开发者账号 首先需要申请苹果开发者账号才能在APP store 里发布应用. 开发者账号分为:(1)个人开发者账号 (2)企业开发者账号 主要的区别是:点击打开链接 1.个人开发者 ...
- 『TCP/IP详解——卷一:协议』读书笔记——13
2013-08-24 16:03:39 4.6 ARP代理 ARP代理(Proxy ARP):如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求.这样可 ...
- 最小和(min)
题目描述: N 个数排成一排,你可以任意选择连续的若干个数,算出它们的和.问该如何选择才能 使得和的绝对值最小. 如:N=8 时,8个数如下: 1 2 3 4 5 6 ...
- IQueryable<T> 与 ObjectQuery<T> 差异
命名空间:System.Data.Objects程序集: System.Data.Entity(在 System.Data.Entity.dll 中)public class ObjectQuery ...
- 为什么page对象不适合用ThreadLocal
今天测试了下,在action中决定是否设置page,在dao层中取出分页,确实没有问题.但是,有一种情况不行,在service中查询了两次数据库,都共享这个page对象了?结果就乱了. 谁有更好解决方 ...