余为前端菜鸟,感姿式水平匮乏,难观前端之大局。遂决定循前端知识之脉络,以兴趣为引,辅以几分坚持,望于己能解惑致知、于同道能助力一二,岂不美哉。css
本系列代码及文档均在 此处html
实体层(物理层):链接计算机(光纤、电缆线、无线电波、双绞线等)。前端
连接层(数据链路层):肯定0 1的分组形式。nginx
以太网协议git
一组电信号组成一帧,一帧分为head和data两部分,head中包含接收方MAC地址信息,以广播的方式向本网络内全部计算机发送数据包,由接收方本身比对MAC地址判断是否接收。github
网络层:主机到主机的通讯。web
互联网由许多子网络组成,在同一子网中能够经过MAC地址以广播形式找到目标,可是不一样子网广播不过去,因此须要在网络层引入新的地址用于查找子网络,即网址。算法
IP协议chrome
IPV4规定网络地址由32个二进制位组成,以IP地址与子网掩码相加是否相等判断是否位于同一个子网络。IP数据包放入到以太网数据包的data部分,IP数据包一样包含head和data两部分。浏览器
ARP协议
经过IP地址获取MAC地址(不在同一子网交由网关处理),在同一个子网络中广播发出数据包包含目标IP地址,MAC地址为FF:FF:FF:FF:FF:FF目标主机接收到后比对成功后报告本身的MAC地址,因而获取到了MAC地址,能够把数据包发送到子网络里任一主机。
传输层:端口到端口的通讯。(端口为每一个使用网卡的程序的编号)
UDP协议
数据包放入到IP数据包的data中,一样由head和data组成,head主要定义发出端口和接收端口,data为具体内容。
TCP协议
有确认机制的UDP,每一个数据包须要确认,过程复杂,消耗更多的资源。
应用层:规定应用程序的数据格式。(DHCP,DNS,HTTP,FTP,SSH等)
网络通讯是主机间数据包交换,要交换数据须要知道双方的MAC地址和IP地址。
用户能够经过静态IP和动态IP两种方式实现网络通讯配置。
实例:访问页面。
应用层协议,无状态。
请求/响应模型
客户端向服务端发送请求,服务端根据接收到的请求,处理后向客户端返回响应信息。
url
协议类型:[//[访问资源须要的凭证信息@]服务器地址[:端口号]][/资源层级UNIX文件路径]文件名[?查询][#片断ID]
用于定位资源,输入url->客户端展现的过程再也不赘述
请求/响应结构
get和post区别在于前者参数在url后,后者在请求正文;前者有大小限制,后者无,后者有请求体,前者无
关于状态码,通常来讲简单记忆以下:1XX 可续发 2XX 成功 3XX 重定向 4XX 客户端错误 5XX 服务端错误
长链接
// 请求头、响应头中包含
Connection: keep-alive
复制代码
1.1默认开启长链接,使得链接在一段时间内维持开启,后续请求可复用,减小创建链接的成本
协议升级
// 请求头中包含
Connection: Upgrade
Upgrade: websocket
复制代码
升级为websocket协议,后续会谈到
缓存控制
1.0的expires -> 1.1的cache-control
后者是相对时间,二者都存在时,之后者为判断过时依据(浏览器判断)
Etag与Last-Modified
若是上次返回头中有Etag,则带上if-none-match信息请求到服务端,服务端进行判断Etag是否修改,选择304/200
若是上次返回头中有Last-Modified,则带上if-modified-since信息请求道服务端,服务端判断是否失效,返回304/200
痛点
需优化点
HTTPS运行在SSL/TLS上,SSL/TLS运行在TCP上,全部传输内容都是须要加密的,能够有效防劫持
握手阶段:
加密解密
对称加密/非对称加密
github免费的github pages用来搭建我的博客很是方便,感兴趣的能够参考这里
在项目设置下选择开启HTTPS便可
小绿锁很醒目
我的站点升级HTTPS
从域名服务商获取免费的SSL证书
按照流程填写
下载证书到服务器(个人是一年免费的谷歌gce)
修改nginx配置
server {
listen 80;
server_name pandora.derekz.cn;
# 重定向到https
rewrite ^(.*)$ https://$host$1 permanent;
location / {
root html;
index index.html index.htm;
}
}
server {
# 顺便换http2吧
listen 443 ssl http2;
server_name pandora.derekz.cn;
root html;
index index.html index.htm;
# 你的证书路径
ssl_certificate /etc/nginx/cert/xxxxxxx.pem;
ssl_certificate_key /etc/nginx/cert/xxxxxxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
复制代码
重启nginx,稍稍等待访问我的网站
SPDY与HTTP2区别在于前者强制使用SSL传输协议,以及二者在首部算法上有所区别,SPDY出现于HTTP2前,特色与HTTP2相似:多路复用、服务器推送、头部压缩等。这里暂不讨论。
不须要域名分区,由于不限制,并且能够双向并行多个请求/响应
HTTP2的多路复用与1.x的keep-alive本质上有区别,一个位于传输层,一个位于应用层,且后者是串行的,前者容许多个文件传输帧在图个TCP链接中同时流式传输
location / {
root /usr/share/nginx/html;
index index.html index.htm;
http2_push /style.css;
http2_push /example.png;
}
复制代码
http2_push
字段,只请求了/index.html 却返回了style.css等额外数据。待研究
细心的小伙伴也许发现了上面的nginx conf文件内有这么一行
listen 443 ssl http2;
复制代码
从HTTPS迁移到HTTP2很是简单,只须要修改nginx配置便可,最后打开chrome能够看到http2的链接状况
咱们说一个网页的性能多好,最直接的一个表现是从enter敲下到页面展现花的时间多短,也就是咱们追求的低延迟高带宽。带宽随着网络基础建设不断提升,因此性能瓶颈主要在于低延迟的难实现。
想一想看,咱们又要DNS解析,又要创建链接,还要加密解密,历经千难万险才能把请求信息送到服务器上。完了之后那一头的人还得礼尚往来,这之间每一个步骤都是咱们实现低延迟的障碍,也是咱们优化的方向。
好比DNS预解析、HTTP2的多路复用使用一条链接、头部压缩、对称加密+非对称加密、缓存策略等等。理解这样一个过程之后,要怎么作就得实际动手处理问题中积累经验啦。
虽发表于此,却毕竟为一人之言,又是每日学有所得之笔记,内容未必详实,看官老爷们还望海涵。