网络基础TCP/IP

一、TCP/IP分为4个层: 应用层、传输层、网络层、数据链路层

    应用层: 向用户提供应用服务FTP和DNS服务

    传输层: 两台计算机之间的数据传输,两种协议TCP和UDP

    网络层: 用来处理网络上的数据包

    链路层: 处理连接网络的硬件部分

IP、TCP和DNS

与HTTP关系的协议: 

    1、IP协议: 将把各种数据包传到指定位置,两种重要的条件就是IP地址和MAC地址

    2、TCP协议: 确保数据能到达目标,TCP协议采用了三次握手策略

    3、DNS服务: 负责将域名转换成IP地址之间的解析服务

URI和URL

URI: HTTP使用URI可以让客户端找到指定的资源 

URL: 服务器的

HTTP协议

HTTP超文本传输协议,是用于客户端和服务器端之间的通信,HTTP从客户端发起请求,最后服务器端响应请求并返回

一、请求方式的总类

    GET: 获取资源,不返回主体部分,GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端,向服务器请求通过 URL?id=100&user='siguang'来传递

    POST: 传输实体主体,客户端向服务器传输内容比较多时使用POST,

    PUT: 传输文件,象FTP的文件上传一样

    HEAD: 获取报文首部

    DELETE: 删除文件,与PUT相反

    OPTIONS: 用来查询针对请求资源的方法

    TRACE: 追踪路径

    CONNECT: 隧道协议连接代理

二、持久连接节省通信量 Kepp-alive

    每建立一次HTTP通信流程,建立一次TCP连接 -> HTTP请求 -> 服务器HTTP响应 -> 断开TCP连接

    持久连接也就是只要任意一端没断开,TCP连接状态就一直保持连接状态,这种好处就是减少TCP连接的重复建立和断开,增加的额外开销,减轻服务器端的负载

三、HTTP报头、报文

    客户端请求的HTTP报文叫请求报文,服务器端响应的叫响应报文

    报文分为: 报文首部 和 报文主体

四、Gzip压缩

    服务器将资源用zip压缩在发送给客户端,客户端接收后在进行解压缩

HTTP状态码

一、状态码由三位数字组成,第一个数字定义了响应的类别,共分五种类别:

    1xx:指示信息--表示请求已接收,继续处理

    2xx:成功--表示请求已被成功接收、理解、接受

    3xx:重定向--要完成请求必须进行更进一步的操作

    4xx:客户端错误--请求有语法错误或请求无法实现

    5xx:服务器端错误--服务器未能实现合法的请求


二、常见的状态码有如下几种:

    1xx:临时回应,表示客户端请继续

    200 OK 客户端请求成功

    301 Moved Permanently 请求永久重定向

    302 Moved Temporarily 请求临时重定向

    304 Not Modified 客户端已有本地缓存的版本

    400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解

    401 Unauthorized 请求未经授权

    403 Forbidden 无权限

    404 Not Found 请求页面不存在

    500 Internal Server Error 服务端错误

    503 Service Unavailable 服务端暂时性错误,一会在再试

缓存Cache

缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存减少对服务器的访问

一、缓存分类:          

    1、缓存服务器: 客户端请求资源先到缓存服务器查看是否到期,如果还在缓存期直接返回给客户端,否则去服务器取最新的资源

    2、客户端缓存: 浏览器将缓存资源存到磁盘的指定文件夹内

    3、数据库缓存: 

    4、CDN内容分发:

    另外两种客户端缓存: LocalStorage 和 SessionStroage

    LocalStorage: 在PC上的兼容性不太好,而且当网络速度快、协商缓存响应快时使用localStorage的速度比不上304并且不能缓存css文件而移动端由于网速慢,使用localStorage要快于304


二、缓存一般是GET请求,而POST一般不缓存,客户端缓存是否需要是在服务器端代码控制,那就是响应头,响应头告诉是否缓存

    注意,所有缓存如果强制刷新的话,所有的资源都会重新从服务器加载

# Expires: 缓存过期时间,用来指定资源到期的时间,Expires=max-age + 请求时间,需要和Last-modified结合使用但在上面我们提到过,cache-control的优先级更高 

# Cache-control: (单位 秒)指定设置缓存最大的有效时间,定义的是时间长短 
    Cache-control:max-age=2592000  缓存有效期为30天
    public        所有内容都将被缓存
    private        内容只缓存到私有缓存中
    no-cache    所有内容都不会被缓存
    no-store    绝对禁止缓存,一看就知道如果用了这个命令当然就是不会进行缓存啦~每次请求资源都要从服务器重新获取
    must-revalidation/proxy-revalidation    指定如果页面是过期的,则去服务器进行获取这个指令并不常用,就不做过多的讨论了
    max-age=xxx (xxx is numeric)    缓存的内容将在 xxx 秒后失效, 并如果和Last-Modified一起使用时, 优先级较高

# Last-Modified: 服务器端文件的最后修改时间,需要和cache-control共同使用,是检查服务器端资源是否更新的一种方式,当浏览器再次进行请求时,会向服务器传送If-Modified-Since报头,询问Last-Modified时间点之后资源是否被修改过如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源

# ETag: web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定),生成算法的话,我测试etag效果的时候用的是MD5值,Apache可以配置对静态文件生成Etag

请求头 Request Header

HTTP协议的请求和响应报文中包含的HTTP首部

一、HTTP报文首部包括

    报文首部(客户端和服务器处理时需要的信息)、报文主体(资源信息)


二、HTTP通用头 General

    # Request URL: http://mjdcom/        请求的URL

    # Request Method: GET                 请求类型

    # Status Code: 200 OK                 请求状态码

    # Remote Address: 36110181152:80    服务器地址及端口号


三、请求头 Request Headers

    # Accept: 浏览器接收的格式,文本 text/html、图片 images/jpeg、视频 video/mp4、二进制 application/octet-stream

            Accept: text/html,application/xhtml+xml,application/xml;q=09,image/webp,*/*;q=08

    # Accept-Charset: 优先的字符集

    # Accept-Encoding: 浏览器接收的编码方式  Accept-Encoding:gzip, deflate, sdch

    # Accept-Language: 接收的语言  Accept-Language:zh-CN,zh;q=08

    # Host: HTTP访问的域名 Host:mjdcom

    # Cache-Control: 控制缓存的时效性 max-age=315360000、no-cache、max-age、

    # Connection: 连接方式,如果是keep-alive,则会复用连接

    # If-Modified-Since: 上次访问时的更改时间,如果服务端认为此时间没有更新,则会给出304响应

    # If-None-Match: 比较实体标记(与If-Match相反),如果与Etag不同相将资源更新给客户端
            If-None-Match:"57724c86-1232"

    # If-Match: If-xxx 条件请求,客户端的if-match值与服务器的Etag值相匹配,如果相同就返回

            If-Match: "57724c86-1232"、 ETag: "57724c86-1232"

    # User-Agent: 将浏览器和代理用户的信息传给服务器

            User-Agent:Mozilla/50 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/53736 (KHTML, like Gecko) Chrome/490262387 Safari/53736

    # If-Range: 如果If-Range与Etag相同,就作用范围请求处理

    # Range: 实体字节请求范围

    # Referer: http://mjdcom/ 告知服务器请求资源的原URI

响应头 Response Headers

# Expires: 将失效日期告诉客户端, Expires是HTTP10的内容,如果同时 Expires 和 Cache-control:max-age 存在的话,Expires会被覆盖

# Cache-control: 缓存控制,服务器设置Response Header中能看到,Cache-control:max-age=3600

    public        所有内容都将被缓存
    private        内容只缓存到私有缓存中
    no-cache    所有内容都不会被缓存
    no-store    所有内容都不会被缓存到缓存或 Internet 临时文件中
    must-revalidation/proxy-revalidation    如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证
    max-age=xxx (xxx is numeric)    缓存的内容将在 xxx 秒后失效, 并如果和Last-Modified一起使用时, 优先级较高

# Content-type: 内容类型

    application/json - JSON类型
    application/x-www-form-urlencoded - 默认
    multipart/form-data - 文件上传
    text/xml - xml文件

# Content-Length: 45783        表名实体部分的大小

# ETag: web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定),生成算法的话,我测试Etag效果的时候用的是MD5值,
        Apache可以配置对静态文件生成Etag
        ETag:"57724c86-1232"
        If-None-Match:"57724c86-1232"

# Date: 首部字段Date表明创建HTTP报文的日期和时间    Date: Fri, 12 Aug 2016 16:25:13 GMT

# Server: apache  nginx  服务器类型

# Via: 是为了追踪客户端与服务器端之间请求和响应报文传输的路径
        Via: http/11 BJ-Y-JCS-204 ( [cRs f ]), http/11 BJ-GWBN-1-JCS-160 ( [cRs f ])

# Accept-Ranges: 用来告诉客户端,服务器是否能处理范围请求
        Accept-Ranges: 1000bytes, 或none

# Age: 告诉客户端,源服务器在多久前创建了响应,单位以秒
        Age: 600

# Last-Modified: 指名了资源最终修改的时间,
        Last-Modified:Mon, 14 Mar 2016 08:04:07 GMT

# Set-Cookie: 设置cookie

浏览器缓存

页面的浏览器缓存状态是由header决定的,header参数有四种:

一、Cache-Control: 

    1、max-age - 指定设置缓存的最大有效时间,当浏览器向服务器发送请求后,如果还在max-age有效期里就不会在向服务器发送请求

    2、public - 指定响应会被缓存,并且在多用户间共享

    3、private - 响应只作为私有缓存,不能在用户间共享,如果要求http认证,响应会自动设置为private

    4、no-cache - 指定不缓存响应

    5、no-store - 绝对禁止缓存,每次请求资源都要从服务器获取 

二、Expires - 设置缓存过期时间,用来指定资源的到期时间,是服务端的具体时间,Expires = max-age + 请求时间,需要和Last-modified结合使用

三、last-modified - 服务器端文件最后修改时间,需要和cache-control共同使用,是检查服务资源是否更新的一种方式,浏览器再次请求会向服务器传送if-Modified-Since报头,询问Last-Modified时间点之后的资源是否被修改,如果没有则返回304,使用缓存,如果修改过,在去服务器请求资源返回200

四、Etag - 根据实体内容生成一段hash字符串,由服务端产生,浏览器会将这字符串传回给服务器,验证资源是否已经被修改

使用缓存流程:

使用缓存流程

cache-control指令使用:

cache-control指令使用

200和304的产生

200 OK( from cache )不向服务器发送请求,直接使用本地缓存文件, Ctrl+F5 直接返回200
304 Not Modified则向服务器询问,若服务器认为浏览器的缓存版本还可用,那么便会返回304, F5 返回304

    200 OK( from cache ) 出现操作: 1.地址栏回车   2.页面链接跳转   3.前进、后退  

    304 Not Modified 出现操作: 1.F5刷新   2.新开窗口

缓存机制
缓存机制

前端安全

一、XSS 跨站脚本攻击

    通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击


二、SQL注入

    SQL 注入就是指在输入的字符串中注入 SQL 语句,如果应用相信用户的输入而对输入的字符串没进行任何的过滤处理,那么这些注入进去的 SQL 语句就会被数据库误认为是正常的 SQL 语句而被执行。

    1、以服务器为目标的主动攻击,SQL注入攻击和OS命令注入功击

    2、以服务器为目标的被动攻击,设计好一个陷阱来让用户打开网站,来获取用户的登录信息

    3、跨站脚本攻击 XSS: 

HTTPS

HTTPS的特点: 一是确定请求的目标服务端身份,二是保证传输的数据不会被网络中间节点窃听或者篡改

HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费

HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的

HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443

HTTPS

HTTP2

HTTP2特点: 一是支持服务端推送,二是支持TCP连接复用

1、服务端推送: 能够在客户端发送第一个请求到服务器,提前把一部分内容推荐给客户端,放入缓存中,避免客户端请求顺序带来的并行不够,导致性能问题

2、TCP连接复用: 则使用同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接建立时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。

| 参考资料
| http://www.alloyteam.com/2016/03/discussion-on-web-caching/
| http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/
| http://www.cnblogs.com/lovesong/p/5352973.html
| http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html