http 和 https
http: 超文本传输协议,未加密,端口是80,
https: 是基于 http + ssl 构建的,可进行加密身份认证的网络协议,端口是443
https 作用:
1. 建立安全的信息安全通道,来保证数据传输的安全
2. 确认网站的安全性
GET 和 POST 的区别
GET 方法请求一个指定资源的表现形式,使用 GET 的请求应该只被用于获取数据。
POST 方法用于将实体提交到指定的资源,通常用来修改数据
区别:
- GET 在浏览器回退时是无害的,而 POST 会再次提交请求
- GET 产生的 URL 地址可以被书签化,而 POST 不可以
- GET 请求会被浏览器主动 cache ,而 POST 不会,除非手动设置
- GET 请求只能进行 URL 编码,而 POST 支持多种编号方式
- GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留
- GET 请求在 URL中传送的参数是有长度限制的(浏览器的限制),而 POST 没有
- 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有
- GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息
- GET 参数通过 URL 传递,POST 放在 Request Body 中
TCP/IP 网络模型
OSI 七层模型 | TCP/IP 概念层模型 | 功能 | TCP/IP 协议族 | |
应用层 | 应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP、HTTP、SMTP、FTP、SNMP、DNS、Telnet | |
表示层 | 数据格式化、代码转换、数据加密 | 没有协议 | ||
会话层 | 解除或建立别的接点的联系 | 没有协议 | ||
传输层 | 传输层 | 提供段对端的接口 | TCP、UDP | |
网络层 | 网络层 | 为数据包选择路由 | IP、ICMP、RIP、OSPF、BCP、IGMP | |
数据链路层 | 链路层 | 传输有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、ARP、RARP、MTU | |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO20110、IEEE802、IEEE802.2 |
TCP/IP 协议
TCP/IP,传输控制协议/网际协议,是指能够在多个不同网络间实现信息传输的协议族
TCP 和 UDP
TCP | UDP | |
是否连接 | 有连接 | 无连接 |
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
连接对象个数 | 只能一对一通信 | 支持一对一、一对多、多对一和多对多交互通信 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅 8 字节 |
使用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(IP 电话、视频会议、直播等) |
三次握手
1. 客户端先发一个请求( SYN )询问服务器能否连接;
2. 服务器同意客户端连接( SYN + ACK)
3. 客户端连接服务器(ACK),连接建立成功
为什么是三次连接而不是两次连接?
为了解决网络信道不可靠的问题,防止已失效的报文又突然传到服务器引起错误,
四次挥手
1. 客户端主动向服务器发起连接关闭请求( FIN ),自己进入终止等待 1 状态
2. 服务端收到( FIN ),发送( ACK ),表示自己进入关闭等待状态,客户端进入终止等待 2 状态
3. 服务端发送未发送的数据,待服务端发送完数据后,发送( FIN ),进入最后确认状态
4. 客户端收到之后,回复( ACK ),服务端立即关闭连接,客户端进入超时等待状态,超时之后关闭连接
WebSocket
是一种网络协议,位于 OSI 模型的应用层。可在单个 TCP 连接上进行全双工通信,能更好的的节省服务器资源和带宽并达到实时通讯。客户端和服务器端只需要一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输
WebSocket 通过 send() 方法发送数据
WebSocket 事件
事件 | 事件处理程序 | 描述 |
open | WebSocket.onopen | 连接建立时触发 |
message | WebSocket.onmessage | 客户端接受服务器数据时触发 |
error | WebSocket.onerror | 通信发生错误时触发 |
close | WebSocket.onclose | 连接关闭时触发 |
全双工:[全双工通信是指两方能同时发送和接受数据。半双工通信是指传输过程中只能向一个方向传输,一方的数据传输结束后,另外一方再回应 ]
特点:
二进制帧:[语法、语义与 HTTP 完全不兼容,相比 http/2,WebSocket 更侧重与 “实时通信”,而 HTTP/2 更侧重于提高传输效率 ]
协议名:[ws://www.baidu.com]
握手:需要一次握手
优点:
- 较少的控制开销:数据包头部协议较小,不同于 http 每次请求需要携带完整的头部
- 更强的实时性:相对于 HTTP 请求需要等待客户端发起服务端才能响应(三次握手),延迟明显更少
- 保持创连接状态:创建通信后,可省略状态信息,不同于 HTTP 每次请求需要携带身份验证
- 更好的二进制支持:定义了二进制帧,更好的处理二进制内容
- 支持扩展:用户可以扩展 WebSocket 协议、实现部分自定义的子协议
- 更好的压缩效果:WebSocket 在适当的扩展支持下,可以沿用之前的上下文,在传递类似的数据是,可以显著的提高压缩率
应用场景:
- 弹幕
- 媒体聊天
- 协同编辑
- 基于位置的应用
- 体育实况更新
- 股票基金报价实时更新
DNS
域名系统,是互联网一项服务,是进行域名和与之相对应的 IP 地址进行转换的服务器
DNS的查询过程:
- 首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址对应表
- 若没有命中,则继续搜索操作系统的 DNS 缓存
- 若仍然没有命中,则操作系统将域名发送至本地服务器,本地服务器采用递归查询自己的 DNS 缓存,查找成功则返回结果
- 若本地域名服务器的 DNS 缓存没有命中,则本地服务器向上级域名服务器进行迭代查询
- 1)首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
- 2)本地域名服务器拿到这个顶级域名服务器的地址后,就向其发送请求,获取权限域名服务器的地址
- 3)本地域名服务器根据权限域名服务器的地址向其发起最终请求,最终得到该域名对应的 IP 地址
- 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
- 操作系统将 IP 地址返回浏览器,同时自己也将 IP 地址缓存起来
- 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
CDN ( 内容分发网络 )
构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN 的关键技术主要有内容存储和分发技术
简单的来讲,CDN 就是根据用户的位置分配最近的资源,用户在上网的时候不用直接访问源站,而是访问离他 "最近的 " 一个节点,术语叫 边缘节点,其实就是缓存了源站内容的代理服务器
原理分析:
在没有应用 CDN 时,我们使用域名访问某一个站点时的路径为:
用户提交域名 ---> 浏览器对域名进行解释 ----> DNS 解析得到的目的主机的 IP 地址 ---> 根据 IP 地址访问发出请求 ---> 得到请求数据并回复
应用 CDN 后,DNS 返回的不再是 IP 地址,而是一个 CNAME 别名记录,指向 CDN 的全局负载均衡,CNAME 实际上在域名解析的过程中承担了中间人(代理)的角色,这是 CDN 实现的关键
HTTP1.0/1.1/2.0 的区别
HTTP1.0 | HTTP1.1 | HTTP2.0 |
浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接 |
|
|
HTTP 状态码
状态码第一位决定了不同的响应状态:
- 1 表示消息
- 2 表示成功
- 3 表示重定向
- 4 表示请求错误
- 5 表示服务器错误
1XX
代表请求已被接受,需要继续处理。这类响应是临时响应,质保函状态行和某些可选的响应头信息,并以空行结束
- 100 (客户端继续发送请求,这是临时响应)
- 101
2XX
代表请求已成功被服务器接受、理解、并接受
- 200 (成功):请求已成功,请求所希望的响应头或者数据体将随此响应返回
- 201 (已创建):请求成功并服务器创建了新的资源
- 202 (已创建):服务器已经接收请求,但尚未处理
- 203 (非授权信息):服务器已成功处理请求,但返回的信息可能来自另一源
- 204 (无内容):服务器成功处理请求,但没有返回任何内容
- 205(重置内容):服务器成功处理请求,但没有返回任何内容
- 206(部分内容):服务器成功处理了部分请求
3XX
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向
- 300(多种选择):针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或者提供操作列表工请求者选择
- 301(永久移动):请求的网页已永久移动到新位置。服务器返回次响应(对 GET 或 HEAD 请求的响应 )时,会自动将请求者转到新位置
- 302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
- 303 (查看其他位置):请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
- 304 (协商缓存)
- 305(使用代理):请求者只能使用代理访问请求的页面。如果服务器返回此响应,还表示请求者应使用代理
- 307(临时重定向):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
4XX
代表了客户端看起来可能发生了错误,妨碍了服务器的处理
- 400 (错误请求):服务器不理解请求的语法
- 401 (未授权):请求要求身份验证,对于需要登录的网页,服务器可能返回此响应
- 403(禁止):服务器拒绝请求
- 404(未找到):服务器找不到请求的网页
- 406(不接受):无法使用请求的内容特性响应请求的网页
- 407(需要代理授权):此状态代码与 401 (未授权) 类似,但指定请求者应当授权使用代理
- 408 (请求超时):服务器等候请求发生超时
5XX
表示服务器无法完成明显有效的请求,这类状态代码代表了服务器在处理请求的过程中有错误或者异常状态发生
- 500(服务器内部错误):服务器遇到错误,无法完成请求
- 501(尚未实施):服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
- 502(错误网关):服务器作为网关或代理,从上游服务器收到无效响应
- 503(服务不可用):服务器目前无法使用(由于超载或者停机维护)
- 504(网关超时):服务器作为网关或代理,但是没有及时从上游服务器收到请求
- 505(HTTP 版本不受支持):服务器不支持请求中所用的 HTTP 协议版本
适用场景
- 100:客户端在发送 POST 数据给服务器,征询服务器情况,看服务器是否处理 POST 的数据,如果不处理,客户端则不上传 POST 数据,如果处理,则 POST 上传数据。常用于 POST 大数据传输
- 206:一般用来做断点续传(下载文件不必重头开始下载),或者是视频文件等大文件的加载
- 301:永久重定向,会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用 301 就重定向到新的域名
- 302:临时重定向,不会缓存。常用于未登陆的用户访问用户中心重定向到登录页面
- 304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回的之后头部信息,是没有内容部分
- 400:参数有误,请求无法被服务器识别
- 401 (未授权):请求要求身份验证,对于需要登录的网页,服务器可能返回此响应
- 403:告诉客户端访问站点或者资源不可用,如在外网环境下,然后访问只有内网 IP 才能访问的时候则返回
- 404:服务器找不到资源,或者服务器拒绝请求又不想说明理由时
- 503:服务器停机维护时,主动用 503 响应请求或者 nginx 设置限速,超过限速,会返回 503
- 504:网关超时
中间人攻击
- 服务器向客户端发送公钥
- 攻击者拦截公钥,保留在自己手上
- 然后攻击者自己生成一个【伪造的】公钥,发给客户端
- 客户端收到伪造的公钥后,生成加密 hash 值发送给服务器
- 攻击者获得加密 hash 值,用自己的私钥解密获取真密钥
- 同时生成假的加密 hash 值,发给服务器
- 服务器用私钥解密获得的假密钥
- 服务器用加密钥加密传输信息