HTTP笔记1

传输层:提供进程地址

  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

    nginx

    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>

        实现:基于账号实现访问控制;

原文地址:https://www.cnblogs.com/qingfengfumian/p/8438514.html