http协议----基于请求报文和响应报文完成一次http事务

应用层协议格式有两种: 文本(开发容易,但交互解析困难如http smtp),二进制(交互解析容易,但理解起来困难memocache)

状态码:304 已经请求过,但是资源没什么改变返回304;对于get请求,只返回head,以表示资源有没有

缓存:在速度不匹配之间的网络组件之间添加缓存以达到性能最优。请求首部中的if-Modified-Since,If-None-Match是关键信息

user-agent加载的仅仅是web框架,资源家在的过程就是向服务器请求的过程,如果一个页面有很多url,逐一请求主机的话,浪费时间,就需要通过缓存提高加载速度,如果是多核资源,可能并发2个请求

所以,对于服务器,可能同时接受到2个或多个请求,但这可能来自同一个请求客户端!!!

现如今,服务器面对的成千上万的并发也就毫不奇怪了,常见的优化方式:例如看到第一屏,(只加载第一屏,除非添加滚轮),或者压垮所有服务。

pv:整个页面有很多请求(链接),通过日志数据挖掘做广告投放和用户行为分析,虽然有站长统计工具,但大型网站最好自行统计pv;计算标准是访问一个网站入口后能完整的呈现页面就算是一个pv

uv:独立IP,日uv,一天内有多少独立ip地址发起过页面访问

为了客户端打开页面时尽可能的快:通常的做法有:加载缓存和并发访问,不过现如今浏览器都是多线程的,任意浏览器对于单个域名线程数是有上限的,例如访问域名A,开启两个线程,访问域名B,开启两个线程

所以对于同一网站可以设置多个二级域名,并把资源,如图片,视频,文本文件分散部署到各二级域名的方法来实现一个站点开启多线程的方式达到访问效率的优化。

httpd mpm多路处理模块有三种模式:prefork 主进程以管理员身份启动生成多个子进程,可以监听80端口,凡小于1024端口号的谓之特权端口

  • I/O类型:所谓I/O,一方请求服务,另一方调用服务,那么,请求方如何得知什么时候得知自己的请求被响应了呢(如何通知调用者)

同步synchronous:调用发出后,不会立即返回,一旦返回,则返回最终结果

异步asychronous调用发出后,被调用方立即反馈消息,但并非最终结果,被调用者通过回调函数,状态信息,通知机制等通知调用方处理结果(银行服务,拿到排队号,被叫号的过程)

上述关注的是消息通知的机制

------------------------------------------------------

以下关注的是请求发出者等待被调用者返回结果时的状态

阻塞block:调用者没结果一直出等待状态,被挂起

非阻塞non-block:调用者不会被阻塞

  • 阻塞式I/O blocking I/O:一个进程通常只能处理单步I/O
  • 非阻塞式I/O:盲等待,polling模型正基于此,过一段时间就去咨询是否完成,效率不一定优于阻塞,所谓非阻塞,是指从磁盘加载数据到内核空间这一段;从内核内存复制到应用进程阶段仍是阻塞的
  • I/O多路复用,一个进程只能处理单步I/O,以向服务器请求资源为例,一步负责监听请求(网络I/O),一步负责请求数据,由于从内核空间复制数据到应用进程内存时处于阻塞状态,这时进程处于“不可终止睡眠状态”,即使网络I/O发生异动也不可能作出响应,按理说,在请求时间过长时,我们也无法取消请求,可现实生活中的例子告诉我们,我们确实可以取消请求,这就是多路复用I/O(无非是在网络请求和磁盘请求之间添加了一个“代理”,代i理会转发请求给空闲的进程,支持两路以上的复用----这就是select() 由BSE研发 poll()和select()功能一致,但是局限在于1024条请求,尽管可以改代码,但实际上1024是并发的极限,超出后拒绝服务,select是复用代理)---其实还得阻塞,只不过可以分身干点别的
  • 事件驱动式I/O:被调用者会回复调用者-----你的请求我拿到了,10分钟后ok,你可以先干点别的,这就免去了盲等(这一阶段一个进程可以处理n个请求);然而第二步从内核内存到进程内存的过程依然阻塞;一旦收到就绪的通知,会调用回调函数完成后续的操作(callback),对于进程阻塞在处理请求而无法接收完成通知的情况下,有两种机制完成通知,水平触发(通知多次)和边缘触发(通知一次,而后调用回调函数,犹如端面)
  • 异步I/O:从磁盘load数据到内核内存,再从内核内存复制到应用进程内存后通知调用方就绪,进程打包响应报文。对并发支持好,编程复杂度高

httpd是典型的事件驱动模型服务器,版本2.4以后还支持异步I/O模型,通常数据加载完成后,会缓存在内存里,所以多个请求请求同一数据的时候,其优势是显而易见的

一个典型的应用进程发起I/O请求的步骤

向内核空间请求数据-------->内核没有------>向磁盘请求数据------>把磁盘数据复制到内核内存----->再把数据拷贝到应用进程内存(每个应用进程都有各自独立的空间);真正的I/O过程就是从内核复制数据到应用进程内存的那一步

综上所述,prefork,worker基于多路复用I/O,event基于事件驱动模型,nginx服务器基于事件驱动模型,基于边缘触发,支持异步I/O,内存映射机制进行数据发放,一个进程可处理5000到1万个请求,随你而定,当然不是越高越好

http协议和i/o模型的更多相关文章

  1. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  2. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  3. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  4. HTTP协议和SOCKS5协议

    HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...

  5. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

  6. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  7. 在线聊天室的实现(1)--websocket协议和javascript版的api

    前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...

  8. http协议和web本质

    转载:http://www.cnblogs.com/dinglang/archive/2012/02/11/2346430.html http协议和web本质 当你在浏览器地址栏敲入“http://w ...

  9. oracle网络服务之beq协议和SDU优化(性能提升可达30%)

    oracle网络服务之beq协议和SDU优化(性能提升可达30%) 12.3.1  BEQ协议 如果Oracle数据库服务端和客户端在同一台机器上,可以使用BEQ连接,BEQ连接采用进程间直接通信,不 ...

随机推荐

  1. CRLF、CR、LF详解

    名词解释 CR:Carriage Return,对应ASCII中转义字符\r,表示回车 LF:Linefeed,对应ASCII中转义字符\n,表示换行 CRLF:Carriage Return &am ...

  2. git与gitlab工具

    1.Git和SVN的对比 1)git是分布式的,svn是集中式的.(最核心) 2)git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复.(核心) 3)git可离线完成 ...

  3. python3.6调用c语言动态编译文件 c语言编译可执行文件和动态编译等

    1.c的代码 dfunc.c #include<stdio.h> int dgfunc(int n) { ){ ; }else{ )+dgfunc(n-); } } 2.动态编译 cmd ...

  4. Git和Github的使用

    Git和Github的基本操作 一.了解Git和Github 1.什么是GIT? Git是一个免费.开源的版本控制软件 2.什么是版本控制系统? 版本控制是一种记录一个或若干个文件内容变化,以便将来查 ...

  5. 如何解决Oracle11g使用dmp命令无法导出空表问题

    如何解决Oracle11g使用dmp命令无法导出空表问题 导出:exp  username/password@orcl file=路径 tables=(tb1)    //tables=(tb1)可有 ...

  6. Python 入门 之 反射

    Python 入门 之 反射 1.反射 : (自省) ​ 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省). Python面向对象中的反射:通过字符串的形式操作对象的相关属性.P ...

  7. JavaScript使用readAsDataURL读取图像文件

    JavaScript使用readAsDataURL读取图像文件 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以 ...

  8. Redis: 缓存过期、缓存雪崩、缓存穿透、缓存击穿(热点)、缓存并发(热点)、多级缓存、布隆过滤器

    Redis: 缓存过期.缓存雪崩.缓存穿透.缓存击穿(热点).缓存并发(热点).多级缓存.布隆过滤器 2019年08月18日 16:34:24 hanchao5272 阅读数 1026更多 分类专栏: ...

  9. JS图片轮播[左右轮播

    直接可以用,网上摘下来的! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  10. 我爬的entityFramework的坑

    老师使用的是mysql的数据库,但是我只有sqlserver的数据库,于是就照猫画虎,想连自己的sqlserver,结果一连跳了几个坑: 坑一:appsetting中的字符串连接是后面还有个s, 坑二 ...