用不完的好奇心 2020-02-17
一、网络协议分层
OSI七层: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP四(五)层 : 物理层(主要是光电信号的传输)、 数据链路层(MAC地址、以太网协议)、网络层(IP协议、主机到主机的通信)、传输层(TCP协议,端口到端口的通信)、应用层(HTTP、SSL、FTP等)。 ps: 物理层考虑的比较少,可以把物理层和数据链路层并称物理链路层。
分层好处:
各自独立、灵活,一层改变不会引起系统问题。结构上易分割,容易调试,促进标准化工作。
二、HTTP和HTTPS的区别
1.端口: HTTP 80 | HTTPS 443
2.安全性: HTTP 明文传输 | HTTPS 加密传输
3.证书申请方式: HTTP 免费申请 | HTTPS 需要到ca申请,一般需要交费。
4.连接方式: HTTP 无状态 | HTTPS SSL+ HTTP 可加密传输、身份认证等。
(PS: 因为https 需要在http的基础上加上ssl 也就是 需要交换TCP的3个包的基础上还要交换SSL的9个包,所以HTTP比HTTPS快)
三、 HTTPS 的连接过程
1.首先客户端先给服务器发送一个请求
2.服务器发送一个SSL证书给客户端,内容包括:证书的发布机构、有效期、所有者、签名以及公钥
3.客户端对发来的公钥进行真伪校验,校验结果为真则使用公钥对对称加密算法以及对称密钥进行加密
4.服务器端使用私钥进行解密并使用对称密钥加密确认信息发送给客户端
5.随后客户端和服务端就使用对称密钥进行信息传输
四、HTTP请求过程
1. 域名解析IP (浏览器DNS缓存、系统DNS缓存、host文件、dns域名服务器查询)
2.TCP 三次握手建立连接状态
3.服务器响应请求、浏览器获取响应结果。(具体到php项目的话 此步骤应该为 tcp建立了端口的连接后,将请求指定给监听80端口的nginx,nginx识别到php请求,不能直接与php通信,故将请求转发给了fastcgi模块,也就是实现程序php-fpm。php-fpm会有一个master进程管理着多个worker进程,多个worker进程通过争抢accept锁的方式获得这次请求的执行权,一系列的初始化后,zend引擎对被请求页面进行语法和词法解析,生成opcode,然后按顺序执行opcode,最终将处理结果返回给nginx,再由nginx返回给终端)
4.浏览器根据响应结果渲染页面。
五、TCP协议三次握手、四次挥手过程
1.建立连接(三次握手) 图片引用。 图中的SYN_SENT状态应该是拼写错误,正确为SYN_SEND。
2. 断开连接(四次挥手) 图片引用。
六、HTTP状态码
1xx 信息型状态码,接收的请求正在处理。
2xx 成功状态码 请求正常处理完毕。
3xx 重定向状态码 需要加附加操作来完成请求。
4xx 客户端错误状态码 服务器端无法处理请求。
5xx 服务端错误状态码 服务器处理请求出错。
301 永久重定向 302暂时重定向 401未授权 403禁止访问 404文件未找到 499 超时(服务端处理时间过长,客户端主动断开连接) 500 服务器内部错误 502 网关接到的上游服务器响应无效 504 网关超时
七、GET和POST的区别
1. url可见性 get可见,参数在url中。 post不可见,参数在http包内(request body)。
2.数据长度限制。 get 受不同浏览器的url长度限制,基本上在2k-4k之间。 理论上post无长度限制,起限制作用的是服务器的处理程序的处理能力 ,可以修改服务器相关配置。
3.安全性上, post比get安全稍微好一些,但是没什么用,抓包一样可见,防君子不防小人。
4.编码方式上,get只支持url编码,post支持多种编码方式。
5.数据类型上,get只支持ASCII, post无限制,支持二进制数据。
6.缓存上,get的数据可以缓存。 post的无法缓存 (GET请求会被浏览器主动cache,而POST不会,除非手动设置)
7.后退按钮get参数还在,历史记录中也可追溯。 post的参数均丢失。
8. get 的 效率 高!
八、cookie和session 的区别
session 是 服务端 保存的数据结构。 一般用来跟踪用户状态。
cookie 是 客户端 保存用户信息的一种机制。 用来记录用户信息。 一般大小不超过4k。
session 一般用session_id 来进行唯一性标识。 cookie是实现并传递session_id的一种方式, 也可以通过url和header传递。