http协议

##socket套接字
– 套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换。
– socketAPI:封装了内核中所提供的socket通信相关的系统调用
– socketDomain:根据其所使用的地址
– AF_INET:Address Family,Ipv4
– AF_INET6:IPv6
– AF_UNIX:同一主机上不同进程之间通信时使用(在同一机器上完成,不需要解封装)
– socket Type:根据使用的传输层协议
– SOCK_STREAM:流,tcp套接字,可靠地传递、面向连接
– SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无连接
– SOCK_RAM:裸套接字,无须tcp或tdp,APP直接通过IP包通信

###套接字相关的系统调用:
– socket():创建一个套接字
– bind():绑定ip和端口
– listen():监听
– accept():接收请求
– connect():请求连接建立
– write():发送
– read():接收
– close():关闭连接

##**http协议介绍**
– http/0.9:原型版本,功能简陋,服务器只能回应html格式字符串,不能回应别的格式
– http/1/0:支持cache,MIME,method;引入POST命令和HEAD命令。头信息是ASCII码,后面是任何格式。服务器回应时告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义类型。
– http/1.1
– 引入持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明keep-alive,对于同一域名,大多数浏览器允许同时建立6个持久连接
– 引入管道机制,即在同一个tcp连接里,客户端可以同时发送多个请求。
– 新增put patch options delete
– 同一个tcp连接里面,所有的数据通信是按次序进行的。前面的回应慢,会有许多请求排队,造成‘队头堵塞’
– 为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。
– http协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度。
– spdy:谷歌开发,解决http/1.1效率不高的问题
– http:/2.0
– 头信息和数据体都是二进制,称为头信息帧和数据帧
– 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞”,此双向的实时通信称为多工
– 头信息压缩机制,头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度。
– http/2.0允许服务器未经请求,主动向客户端发送资源,即服务器推送

##**http工作机制**
– 工作机制:
– http请求:http request
– http响应:http response
– 一次http事务:请求 <–> 响应
– web资源:web resource
– 通常web页面不是单个资源,而是一组资源的集合
– 静态文件:.jpg .html .txt .js .css .mp3 .avi
– 动态文件:.asp .php .jsp
– 提高http连接性能
– 并行连接:通过多条TCP连接发起并发的HTTP请求
– 持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延。
– 管道化连接:通过共享TCP连接发起并发的HTTP请求
– 复用连接:交替传送请求和响应报文

##**URI**
– uri称为统一资源标标识,分为URL和URN
– URN:统一资源命名,示例P2P,仅用于命名,而不指定地址
– URL:统一资源定位符,用于描述某服务器某特定资源位置

##**网站访问量**
– IP,一天内来自相同IP地址只计算一次。
– PV,页面浏览量或点击量,用户每刷新一次即被计算一次。
– UV(独立访问),一天内相同客户端只被计算一次。判断电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,UV不变

##**web服务请求处理**
– (1)建立连接:接收或拒绝连接请求
– (2)接收请求:接收客户端请求报文中对某资源的一次请求的过程
– (3)处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
– http常用请求方式,Method:GET POST HEAD PUT DELETE TRACE OPTIONS
– (4)访问资源:服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
– (5)构建响应报文:一旦web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。
– (6)发送响应报文
– (7)记录日志

– web访问响应模型(I/O)
– 单进程io模型:启动一个进程处理请求,而且一次只处理一个,多个请求被串行响应
– 多进程io模型:并行启动多个进程,每个进程响应一个连接请求
– 复用io结构:启动一个进程,同时响应N个连接请求
– 实现方法:多线程模型和事件驱动
– 多线程模型:一个进程生成N个线程,每个线程响应一个连接请求
– 事件驱动:一个进程处理N个请求
– 复用的多进程io模型:启动M个进程,每个进程响应N个连接请求,同时接受M*N个请求

##**HTTP服务器应用**
– http服务器程序:apache Nginx lighttpd
– 应用程序服务器
– IIs .asp
– tomcat .jsp
– jetty 开源的servlet容器
– Resin 支持servlets和jsp的引擎

##**HTTP功能特性**
– 虚拟主机:IP、Port、FQDN
– CGI:通用网关(相当于翻译,两端是不同的协议)接口(不仅可以执行静态页面,还可以编译动态程序)
– 反向代理:外部客户端访问专有网络时,会访问代理服务器,充当调度员,通过内部系列算法,指向一台web服务其中
– 负载均衡:同上,调度到负载较小的web服务器中去,实现均衡负载。
– 路径别名
– 丰富的用户认证机制:basic digest
– 支持第三方模块

##HTTP安装
– 版本:CentOS 6:2.2 CentOS 7:2.4
– 安装方式
– rpm:centos发行版
– 编译:定制或特殊需求
– Centos 6程序环境:httpd-2.2
– 配置文件:
– /etc/httpd/conf/httpd.conf
– /etc/httpd/conf.d/*.conf
– 检查配置语法:httpd -t service httpd configtest
– 服务脚本:/etc/rc.d/init.d/httpd
– 脚本配置文件:/etc/sysconfig/httpd
– 服务控制和启动:
– chkconfig httpd on|off
– service {start | stop | restart | status | configtest | reload} httpd
– 站点网页文档根目录:/var/www/html
– 模块文件路径:/etc/httpd/modules /usr/lib64/httpd/modules
– 主程序文件:
– /usr/sbin/httpd
– /usr/sbin/httpd.worker
– /usr/sbin/httpd.event
– 主进程文件:/etc/httpd/run/httpd.pid
– 日志文件目录:
– /var/log/httpd
– access_log:访问日志
– Error_log:错误日志
– 帮助文档包:
– httpd-manual

##**httpd 2.2常见配置**
– 1.grep “Section” /etc/httpd/conf/httpd.conf
– 配置格式:directive value
– directive:不区分字符大小写
– value:为路径时,是否区分大小写,取决于文件系统
– 不想显示apache版本信息,需要设置ServerTokens Prod #(配置第45行),完成后service httpd reload
– 2.修改监听的IP和Port
– Listen [IP:]PORT 省略IP表示本机所有IP
– Listen指令至少一个,可重复出现多次
– 例如:Listen 80 Listen 192.168.1.100:8080
– 3.持久连接
– Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
– 设置方法: (1) KeepAlive On | Off (2) KeepAliveTimeout 15
– 测试方法: (1) telnet WEB_SERVER_IP PROT (2) GET /URL HTTP/1.1
– 4.加载动态模块配置DSO:Dynamic Shared Object
– /etc/httpd/conf/httpd.conf
– 配置指定实现模块加载格式:
– LoadModule <mod_name> <mod_path>
– 相对于ServerRoot的默认路径(可使用的相对路径)是/etc/httpd
– 示例
– LoadModule auth_basic_module modules/mod_auth_basic.so
– 5.定义’Main’server的文档页面路径
– DocumentRoot “/path”
– 文档路径映射:DocumentRoot指向的路径为URL路径的起始位置
– 示例:
– DocumentRoot “/app/data”
– http://HOST:POST/test/index.html –> /app/data/test/index.html
– 同时要注意SELinux和iptables状态
– 6.定义站点主页面
– DirectoryIndex index.html index.html.var
– 7.站点访问控制常见机制
– 访问控制机制有两种:客户端来源地址、用户账号
– 文件系统路径
– <Directory “/path”>…</Directory>
– <File “/path/file”>…</File>
– <FileMatch “PATTERN”>…</FileMatch>
– URL路径:
– <Location “”>…</Location>
– <LocationMatch “”>…</LocationMatch>
– 8.<Directory>中“基于源地址”实现访问控制
– 9.日志设定
– 访问日志:LogFormat format strings LogFormat “%h %l %u %t \”%r\” %>s %b\”%{Referer}i\” \”%{User-Agent}i\”” combined
– 使用日志格式:CustomLog logs/access_log combined
– %h:客户端ip %l:远程用户 %u:验证 %t:服务器收到请求时间 %r:请求报文首行 %>s:响应状态码 %b:响应报文大小 %{Referer}i:请求报文中首部referer的值 %{User-Agent}i:请求报文中“user-Agent”的值;

##**设置三个虚拟主机网站**
– 1.在一个目录里中创建三个目录,每个目录分别建3个站
– 2.方法1:可以设置临时的ip地址给这三个网站,ip add a 192.168.183.11/24 dev eth0 方法2:端口访问, 方法3(常用):配置DNS,用域名访问
– 3.配置vim /etc/httpd/conf.d/*.conf *名字可以任意取。格式仿照tail /etc/httpd/conf/httpd.conf中<virtual…:80>内容

##**常见的httpd程序**
– 默认为Prefork
– MaxClients 256 最大并发
– ServerLimit 256 最多进程数
– MaxRequestPerChild 4000
– 当MaxRequestPerChild个请求之后,子进程将会被父进程终止,这时候内存会被释放
– 更换使用的httpd程序(worker):
– /etc/sysconfig/httpd
– HTTPD = /usr/sbin/httpd.worker
– 重启服务生效
– pstree -p | grep httpd 查看进程和线程

##HTTP状态码分类
– 100-101 信息提示
– 200-206 成功
– 300-305 重定向
– 400-415 错误类信息,客户端错误
– 500-505 错误类信息,服务器错误

##**COOKIE**
– HTTP是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。随着web的发展,很多业务都需要对通信状态进行保存。于是引进了cookie技术。
– 过程:(1)客户端向服务器发送请求 (2)服务器响应,并携带有set-cookie首部字段信息,通知客户端保存Cookie。(3)当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值 (4)服务端发现客户端发送过来的Cookie后,会去检查从哪个客户端发来的连接请求,最后得到 之前的状态信息。
– session:比如购买商品的这些信息,会伴随cookie标识信息,被保存在web服务器中。
– 如何实现session的共享?
– (1) 代理服务器做Ip记录,下次调度时,还向原web服务器调度。
– (2) web服务器间进行session复制
– (3) 专门搭建一个session服务器(redis服务器)

##**HTTPS**
– 对称加密:A和B之间沟通需要一个共同的key来做加密解密
– 非对称加密:A(A的公钥,A的私钥),B(B的公钥,B的私钥)。共4把。
– (1) 2把公钥之间相互知道,A发送东西给B时,将文件用B的公钥加密,B才能解密。
– (2) A把文件用自己的私钥加密的时候,广播出去,别人(A公钥)解密后,就知道这是A发送的文件。
– 数字签名:CA认证机构,A和B不认识的时候,确认对方信息正确,A的公钥通过CA机构的私钥加密,加上A的认证信息,再加上过期时间,一起发送给B,B通过CA的公钥,解密,就能够得到A的公钥等信息。完成信息安全传输。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89583

(0)
miraclermiracler
上一篇 2017-12-06 16:51
下一篇 2017-12-06 22:21

相关推荐