1、套接字
在建立通信连接的每一端,进程间的传输要有两个标志:
IP地址和端口号,合称为套接字地址socket address ,套接字文件定义了ip地址和端口号,用于不同进程间通信使用。比如mysql服务器端的进程和客户端的进程进行通讯。
客户机套接字地址定义了一个唯一的客户进程
服务器套接字地址定义了一个唯一的服务器进程
- Socket:套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换。
- Socket Domain:根据其所使用的地址
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程之间通信时使用 - 套接字相关的系统调用:
socket(): 创建一个套接字
bind():绑定IP和端口
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收
close():关闭连接
2、HTTP通信过程
http: Hyper Text Transfer Protocol, 80/tcp,超文本传输协议。
html: Hyper Text Markup Language 超文本标记语言,编程语言,是http协议传输的一种文件格式。
MIME:Multipurpose Internet Mail Extensions
多用途互联网邮件扩展 /etc/mime.types
格式:major/minor
text/plain
text/html ---也就是传输的文件的不同格式
text/css
image/jpeg
image/png
video/mp4
application/javascript
参考:http://www.w3school.com.cn/media/media_mimeref.asp
3、Web资源:web resource
一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每个资源都要单独请求。因此,一个“Web 页面”通常并不是单个资源,而是一组资源的集合
静态文件:无需服务端做出额外处理
文件后缀:.jpg, .html, .txt, .js, .css, .mp3, .avi
动态文件:服务端执行程序,返回执行的结果
文件后缀:.asp, .php, .jsp
4、URI
URI: Uniform Resource Identifier 统一资源标识,分为URL和URN
URN: Uniform Resource Naming,统一资源命名
示例:P2P下载使用的磁力链接是URN的一种实现
magnet:?xt=urn:btih:660557A6890EF888666
URL: Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
URL组成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
schame:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔,可以在当前页进行跳转,跳转至当前网页的特定行,比如当前页面篇幅比较长时,可以跳转到当前页面的指定位置。
5、网站访问量
IP(独立IP):记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标,一天内来自相同客户机IP地址只计算一次。
PV(访问量):即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
UV(独立访客):即Unique Visitor,访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。
网站统计:http://www.alexa.cn/rank/
6、一次完整的http请求处理过程
1、建立连接:接收或拒绝连接请求,即三次握手的过程。
2、接收请求:接收客户端请求报文中对某资源的一次请求的过程
Web访问响应模型(Web I/O)
单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
复用I/O结构:启动一个进程,同时响应N个连接请求
实现方法:多线程模型和事件驱动
多线程模型:一个进程生成N个线程,每线程响应一个连接请求
事件驱动:一个进程处理N个请求
复用的多进程I/O模型:启动M个进程,每一个进程开多个线程,每个线程响应多个连接请求
3、处理请求:服务器对请求报文进行解析,并获取客户端请求的资源及请求的方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
HTTP常用请求方式Method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4、访问资源:负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,用户将指令发送给内核,内核到磁盘上去调取客户端要访问的资源数据到内核空间,再将资源发送到用户的内存空间。
5、构建响应报文:一旦Web服务器识别从出了资源,就执行请求方法中描述的动作,封装http的头部信息的响应报文,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。
1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Content-Length
实际报文的主体内容
此命令可以查看响应报文的头部信息
[root@centos6 network-scripts]#curl -I www.qq.com
HTTP/1.1 200 OK
Server: squid/3.5.20
Content-Type: text/html; charset=GB2312
Cache-Control: max-age=60
Expires: Tue, 26 Sep 2017 12:34:04 GMT
Date: Tue, 26 Sep 2017 12:33:04 GMT
Connection: keep-alive
2)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
永久重定向:http://www.360buy.com ---用户访问这个网站的时候会跳转到https://www.jd.com/这个网站。
临时重定向:http://www.taobao.com
6、发送响应报文
7、记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
7、Httpd特性和MPM工作模式
- 高度模块化:core + modules
- DSO: Dynamic Shared Object 动态加/卸载
- MPM:multi-processing module多路处理模块
这些特性和内核很相似。 -
MPM工作模式
①prefork:多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
②worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
③event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程生成n个线程来响应n个请求,有专门的服务线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
httpd-2.2: event测试版,centos6
httpd-2.4:event稳定版,centos7
8、httpd的功能特性
虚拟主机
IP、Port、FQDN
一个物理服务器上可以额搭建多个web网站。
CGI:Common Gateway Interface,通用网关接口
网关用来解决不同网段、不同协议之间的通信。
反向代理
假如有好几个服务器提供相同的web服务,并且网站信息都是一样的,反向代理服务器的作用相当于一个调度器,将用户发送的请求转发给相应的服务器。
正向代理
比如用户要访问一个网站,它先把请求发送给正向代理服务器,然后代理服务器去替你去访问这个网站,并且下载网站的资源,一份发送给你,一份保存到自己的缓存中,当有下一个用户要访问相同的网页资源时,因为代理服务器上已经有缓存,就直接将资源发送给用户,节省了带宽。
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块