传输层:提供进程地址
TCP:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路。端口号:0-65535
UDP:用户报文协议,无连接的协议。端口号:0-65535
IANA(互联网数字分配机构)
0-1023:知名端口,永久的分配给固定的应用使用,特权端口,22/TCP(SSH),80/TCP(HTTP),443/TCP(HTTPS),53/TCP|UDP(DNS),21/TCP(FTP)等。
1024-41951:亦为注册端口,单要求并不严格分配给程序注册为某应用使用,11211/TCP, 11211/UDP (memcached), 3306/TCP(mysql)等。
41952-65535:客户程序随机使用的端口;动态端口,或私有端口,其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
Socket:IPC(进程间通信)的另一种实现,允许位于不同主机(甚至同一主机)上不同的进程之间进行通信,数据交换,Socket API, 1983年,4.2 BSD。
SOCK_SREAM:TCP套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:裸套接字
IPv4地址分类:
IPv4共分为5大类:
A类:1.0.0.0-126.255.255.255,netmask:8,每个网络有2^24-2个可用IP
B类:128.0.0.0-191.255.255.255,netmask:16,每个网络有2^16-2个可用IP
C类:192.0.0.0-223.255.255.255,netmask:24,每个网络有2^8-2个可用IP
D类:224.0.0.0-239.255.255.255,组播
E类:240.0.0.0-255.255.255.255,科研等其他用途
私有IP:
A:10.0.0.0/8
B:172.16.0.0/16-172.16.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
本地环回地址:
127.0.0.0/8
TCP协议特性:
建立连接:三次握手
将数据打包成段:校验和(CRC-32)
确认、重传以及超时;
排序:逻辑排序
流量控制:滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
Socket Domain:指明通信的“域”(范围),我们是在IPv4还是IPv6这个范围内通信,也就决定了我们通信的地址是IPv4格式还是IPv6格式。
AF_INET:Adress Family,IPv4
AF_INET6:Adress Family,IPv6
AF_UNIX:同一主机上不同进程之间通信时使用。
每类套接字都至少提供了两种socket:流、数据报。
流:可靠的传递,面向连接,无边界。
数据报:不可靠的传递、有边界、无连接。
套接字相关的系统调用:
socket():创建一个套接字
bind():绑定
listen():监听
accept():接收请求
connet():请求连接建立
write():发送
read():接收
send(), recv(), sendto(), recvfrom()
HTTP:hpyer text transfer protocol(超文本传输协议),80/TCP
html:编程语言,超文本标记语言
<html> <head> <title>TITLE</title> </head> <body> <h1>这是一个标题</h1> <p>这是一个段落</p> <a href=https://www.baidu.com>这是一个连接</a> </body> </html>
CSS:Cascading Style Sheet,层叠样式表
js:javascript
MIME:Multipurpose Internet Mail Extesion,多用途互联网邮件扩展协议,参考连接:https://baike.baidu.com/item/MIME/2900607?fr=aladdin
工作机制:参考http://blog.csdn.net/hguisu/article/details/8680808
http请求
http响应
Web资源:web resource
静态文件:.jpg .gif .html .txt .js .css .mp3 .mp4
动态文件:.php .jsp...
媒体:
媒体类型(MIME类型):major/minor
text/html
text/plain
image/jpeg
image/gif
URI:Uniform Resource Identifier,统一资源标识符。
URL:Uniform Resource Locator,统一资源定位符,用于描述某服务器特定资源的位置
Scheme://Server:port/path/to/resoource
http://www.magedu.com/images/logo.jpg
URN:Uniform Resource Nameing,统一资源名称,目前较少使用
http的协议版本
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个被广泛使用的版本,支持MIME.
HTTP/1.1:在1.0的版本上改良了某些特性,如增强了缓存功能。
HTTP/2.0:HTTP/NG下一代的HTTP
一次完整的http请求处理过程:
1.建立或处理连接;接收请求或拒接请求。
2.接收请求:接收来自于网络的请求报文中对某资源的一次请求的过程。
并发访问相应模型(Web I/O):
单进程I/O结构:启动一个进程处理用户请求,一次只能处理一个,多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应N个请求;
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动:event-driven;
复用的多进程I/O结构:启动M个进程,每个进程响应N个请求;
3.处理请求,对请求报文进行解析,并获取请求的资源及请求方法等相关信息。
元数据:请求报文首部
<method><URL><VERSION>
Host:www.baidu.com 请求的主机名称
Connection:
4.访问资源:获取请求报文中请求的资源。
web服务器即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态生成的资源;这些资源放置域本地文件某路径下,此路径通常称之为DocRoot.
/www/var/html/
images/1.jpg
http://www.magedu.com/images/1.jpg
web服务器资源路径映射方式:
a.docroot
b.alias
c.虚拟主机docroot
d.用户家目录docroot
5.构建响应报文
资源的MIME类型:
显示分类
魔法分类
协商分类
URL重定向:web服务器构建的响应并非客户端请求的资源,而是另外一个访问路径下的资源。
6.发送响应报文
7.记录日志
http服务器程序
httpd
lighttpd
应用程序服务器:
IIS
Tomcat,Jetty,Jboss,Resin
Webshpere,Weblogic,oc4j
www.netcraft.com (查看各程序的使用主机量占比)
httpd的安装配置和使用:
httpd:apache
a patchy server =apache
ASF:apache software foundation(Apache软件基金会)
httpd的特性:
高度模块化:core+modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Modules(多道处理模块)
prefork:多进程模型,每个进程响应一个请求;一个主进程负责生成N个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个。
worker:多线程模型,每个线程响应一个请求;一个主进程生产多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求。
m进程,n线程:m*n个请求
event:事件驱动模型,每个线程响应N个请求;一个主进程生成m个子进程,每个进程字节n个请求
httpd-2.2:event为测试使用
httpd-2.4:event可生产使用
httpd的功能特性:
虚拟主机
IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口
反向代理
负载均衡
路径别名
丰富的认证机制:basic|digest
支持第三方模块
CentOS 6:
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httd.event
/usr/sbin/httpd.worker
日志文件目录:/var/log/httpd/
access_log:访问日志
error_log:错误日志
站点文档目录:/var/www/html
模块文件路径:/uar/lib64/httpd/modules
配置文件组成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment /*全局环境变量*/
### Section 2: ‘Main‘ server configuration/*中心主机配置*/
### Section 3: Virtual Hosts/*虚拟主机配置*/
配置格式:directive value
directive:不区分字符大小写
value:为路径时,取决于文件系统
常用配置:
1.修改监听的IP和Port:Listen [IP:]PORT(省略IP表示监听本机所有IP;Listen可以重复出现多次)
2.持久连接:Persistent Connection;连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成;
如何断开:1.数量限制 100,2.时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应。
折中:使用较短的持久连接;(httpd-2.4支持毫秒级的持久时间)
非持久连接:每次发起请求是都需要进行三次握手和四次断开。
KeepAlive On|Off --开启或关闭持久连接
MaxKeepAliveRequests # --最大连接数
keepAliveTimeout # --持久连接保持时间
3.MPM:prefork|worker|event
http-2.2不支持同时编译多个模块,只能编译时选定一个;rpm安装的包提供了三个二进制程序文件,分别用于实现对不同的MPM机制的支持;确认方法为:pa aux | grep httpd
默认为/usr/sbin/httpd,其使用prefork
查看模块列表:
查看静态编译的模块:
# httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c
查看静态编译及动态装载模块:
httpd -M
更换使用的httpd程序:/etc/sysconfig/httpd/ 修改"HTTPD="的值重启即可。
#prefork的配置 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> #worker的配置 <IfModule worker> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 0 </IfModule>
PV,UV:PV:Page Vies:页面浏览量;UV:User View,用户浏览量(独立IP量)
4.DSO
配置指令实现模块加载:LoadModule <mod_name> <mod_path>
模块路径可使用相对地址:1.相对于ServerRoot(/etc/httpd)指向的路径而言:/etc/httpd/modules
5.定义‘Main‘ server的文档页面路径,DocumentRoot
文档路径映射:DocumentRoot指向的路径为URL路径的启始位置:DocumentRoot "/var/www/html"
test/index.html -->http://HOST:PORT
/test/index.html
6.站点访问控制:可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory ""> </Directory>
<File ""> </File>
<FileMatch ""> </FileMatch>
URL路径
<Location ""> </Location>
...
7.Directory中“基于来源地址”实现访问控制
1.Options:所有可用特性:Indexes Includs
FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None,ALL
Indexes:索引
FollowSymlinks:运行跟踪符号链接文件
2.基于来源地址的访问控制机制
Order:检测次序
Order allow,deny
Order deny,allow
Allow from IPaddr
Deny from ipaddr
来源地址:
1.IP
2.NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8.定义默认主页面:DirecotryIndex index.html index.html.var
9.日志设定:
错误日志:ErrorLog logs/error_log
Loglevel warn(日志级别):debug info notice warn error crit alert emerg
访问日志:CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"{User-Agent}i\"" combined
%h:客户端IP地址
%l:Remote logname(from identd,if supplied),远程登录名,-表示为空
%u:Remote user,(from auth;may be bogus if return status (%s) is 401);
%t:Time the request was received(standard english format),服务器收到请求的时间
%r:First line of request,请求报文的首行信息(method url version)
%>:响应状态码
%b:响应报文的大小,单位是字节,不包括响应报文的首部;
%{Referer}i:请求报文当中“referer”首部的值;当前资源的访问入口,及从哪个页面中的超链接跳转而来。
%{User-Agent}i:请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序。
参考连接:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10.路径别名
DocumentRoot "/www/htocs"
http://www.magedu.com/download/
bash-4.4.2-3.el6.x86_64.rpm
-->/www/htdocs/download/
bash-4.4.2-3.el6.x86_64.rpm
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.magedu.com/bbs/index.html
-->/forum/htdocs/bbs/
11.设定默认字符集
AddDefaultCharset UTF-8
GBK,GB2312,GB18030
12.基于用户的访问控制
认证质询:WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:Authorization,客户端用户填入账号和密码后再次发送请求报文认证通过,则服务器发送响应的资源;
认证类型:1.basic 明文 2.digest,消息摘要
安全域:需要用户认证后方能访问的路径,应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于位置:
虚拟账号:仅用于访问某服务器时用到的认证标识
存储:文本文件、SQL数据库、LDAP、NIS
basic认证:
1.定义安全域
<Directory "">
Options None
AllowOverride None
AuthTye Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2
......
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
2.提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [option] passwordfile username
-c:自动创建passwordfile,因此仅应该在添加第一个用户时使用
-m:md5加密用户密码
-s:sha1加密用户密码
-D:删除指定用户
3.实现基于组进行认证:
<Directory>
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2
</Directory>
要提供:用户账号文件和组文件
组文件:每一行第一一个组
GRP_NAME:user1 user2 user3
示例:
<Dircectory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administrator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpdconf.d/.htgroup"
Require group webadmin
</Directory>
13.虚拟主机
有三种实现方案:
基于IP:为每个虚拟主机准备至少一个IP地址
基于PORT:为每个虚拟主机准备至少一个专用port;实践中很少使用
基于hostname:为每个虚拟主机准备至少一个专用的hostname;
可混合使用上述三种方式中的任意方式。
注意:一般虚拟主机莫与中心主机很用,所以要使用虚拟主机,先禁用中心主机;方法:注释DocumentRoot
每个虚拟主机都有专有的配置:
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>
ServerAlias:虚拟主机的别名
ErrorLog
CustomLog
<Directory ""> </Directory>
示例1.基于IP
<VirtualHost 172.16.100.250:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.251:80>
ServerName web2.magedu.com
DocumentRoot "/vhost/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost 172.16.100.251:80>
ServerName web2.magedu.com
DocumentRoot "/vhost/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.251:8080>
ServerName web3.magedu.com
DocumentRoot "/vhost/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.251:80>
ServerNme web2.magedu.com
DocumentRoot "/vhost/web2/htdocs"
</VirtualHost>
<VirtualHost>
ServerName web4.magedu.com
DocumentRoot "/vhost/web4/htdocs"
</VirtualHost>
<VirtualHost>
ServerName web5.magedu.com
DocumentRoot "/vhost/web5/htdocs"
</VirtualHost>
14.内置的status页面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>
实现:基于账号实现访问控制;