文章目录
网络及安全
Get和Post区别
Get 和POST 都是http请求,而http请求是基于tcp/ip 协议的。GET产生一个TCP数据包;POST产生两个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。其他,POST 请求不能被缓存,POST对数据长度无限制,POST请求的安全性高些,参数不会显示在地址栏中。
Https协议的实现
HTTPS,也称作HTTP over TLS。TLS的前身是SSL,HTTPS和HTTP协议相比提供了
- 数据完整性:内容传输经过完整性校验
- 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
- 身份认证:第三方无法伪造服务端(客户端)身份
其中,数据完整性和隐私性由TLS Record Protocol保证,身份认证由TLS Handshaking Protocols实现
认证过程:
- [明文] 客户端发送随机数
client_random
和支持的加密方式列表 - [明文] 服务器返回随机数
server_random
,选择的加密方式和服务器证书链 - 客户端验证服务器证书,使用证书中的公钥加密
premaster secret
发送给服务端 - 服务端使用私钥解密
premaster secret
- 两端分别通过
client_random
,server_random
和premaster secret
生成master secret
,用于对称加密后续通信内容
https使用了对称和非对称混合加密,客户端获取内容加密秘钥的过程中使用公私钥非对称加密,随后解密服务端返回的算法和对称密钥,然后传输数据两端通过密码加解密数据。
长连接管理
因为有了长连接通道,服务端有了消息即时触达的能力,这个能力是非常非常重要的,在设计在线网络游戏、IM系统、推送系统时长连接通道不可或缺。浏览器实现长连接,自然想到了websocket
Socket的基本方法
- 服务器端创建ServerSocket,使用**while(true)**循环调用accept()等待客户端连接
- 客户端创建一个socket并请求和服务器端连接
- 服务器端接受请求,创建socket与该客户建立专线连接
- 建立连接的两个socket在一个单独的线程上对话
- 服务器端继续等待新的连接
Socket 是可以基于TCP 也可以基于UDP 的
什么是XSS攻击,如何实现
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等
如何保证系统安全性
使用https替换http
敏感数据使用加密存储,例如MD5加密密码
SQL 注入防护
权限系统控制
访问日志及黑名单过滤
netty可以干什么,NIO,BIO,AIO 都是什么啊有什么区别
Netty是一个NIO框架,是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠的网络服务器和客户端程序。
进程中IO调用的步骤大概如下:
- 进程向操作系统请求数据
- 操作系统把外部数据加载到内核缓冲区内(重要)
- 操作系统把内核缓冲区数据copy到进程缓冲区 (重要)
- 进程获取数据完成自己的功能
IO模型的两个阶段:
- 等待I/O数据准备好,这取决于IO目标返回的速度,譬如网速和数据大小。
- 数据从内核缓冲区拷贝到进程内
BIO 两个阶段都被阻塞,且等待执行;BIO 第一阶段非阻塞,第二阶段阻塞;AIO 两个阶段都是非阻塞,属于异步方式。
首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO;同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
由此可见,同步/异步主要指调用端,阻塞/非阻塞主要指服务端。
TCP /IP四层
TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层
首先我们梳理一下每层模型的职责:
链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;
传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;
应用层:定义数据格式,并按照对应的格式解读数据。
然后再把每层模型的职责串联起来,用一句通俗易懂的话讲就是:
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。
http 的工作流程
- 地址解析
- 封装HTTP请求,其实就是封装数据包
- 封装TCP包,建立TCP 连接,也就是“三次握手”
- 客户端发送请求命令
- 服务器相应
- 关闭连接
http1.1http2.0 的区别
HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能,可以实现静态资源的实时更新
https 的工作流程
- Client发起一个HTTPS(https:/demo.linianhui.dev)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
- Server把事先配置好的公钥证书(public key certificate)返回给客户端。
- Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
- Client使用伪随机数生成器生成加密所使用的会话密钥,然后用证书的公钥加密这个会话密钥,发给Server。
- Server使用自己的私钥(private key)解密这个消息,得到会话密钥。至此,Client和Server双方都持有了相同的会话密钥。
- Server使用会话密钥加密“明文内容A”,发送给Client。
- Client使用会话密钥解密响应的密文,得到“明文内容A”。
- Client再次发起HTTPS的请求,使用会话密钥加密请求的“明文内容B”,然后Server使用会话密钥解密密文,得到“明文内容B”。
TCP的三次握手流程
- 客户端发送建立连接的请求,发送一个SYN包等待服务器响应,
- 服务器收到SYN包之后返回给客户端一个表示确认的SYN包 和 ACK 包
- 客户端收到之后向服务器发送ACK包,发送完之后开发会建立连接
说说TCP,UDP和socket,Http之间联系和区别
TCP和UDP:传输层协议;
HTTP:应用层协议;
SOCKET:TCP/IP网络的API。
TCP/IP代表传输控制协议/网际协议,指的是一系列协议。
TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。
TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
TCP和UDP是FTP、HTTP和SMTP之类使用的传输层协议。
虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。
这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。
客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。
记住,需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。
Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络上的应用程序。
cookie 和session的区别和联系
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
http中的200,301,302,403,404,500,503都代表什么状态
200: 请求成功
301:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI,今后任何新的请求都应使用新的URI代替
302: 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
403: 服务器理解请求客户端的请求,但是拒绝执行此请求
404 : 服务器无法根据客户端的请求找到资源(网页)
500: 服务器内部错误,无法完成请求
503: 由于超载或系统维护,服务器暂时的无法处理客户端的请求
什么是HTTP代理,有什么用
网络代理服务器是介于客户端和服务器之间的中间件,它双向地传送HTTP信息;代理可以做很多有用的事情。他们可以巩固安全、提升性能、以及节省支出,还可以提供一些增值服务。如:内容过滤,安全控制,网络缓存,反向代理。
反向代理,代理服务器可以作为web server使用,他们也因此被称作反向代理。它们可以接受真正的web server请求,但是它们与web servers不同的是,它们可能会再与其他服务器建立另一个连接,以获取客户请求所需的资源。反向代理可以给web servers提速,因为公共的资源都放在反向代理里面了(无需再询问web servers)。在这样的环境(configuration)下,反向代理也被称作服务器加速器(server accelerators)。反向代理也可以与路由协同使用,来创造一个分布式的、负载网络。
什么是DoS、DDoS、DRDoS攻击,如何防御
DoS就是拒绝服务,而DDoS就是分布式拒绝服务,而DRDoS就是分布反射式拒绝服务。这三种方法都是利用TCP三次握手的漏洞进行攻击的,所以对它们的防御办法都是差不多的。
DoS攻击是最早出现的,它的攻击方法说白了就是单挑,假如你的机器每秒能够发送10个攻击用的数据包,而被你攻击的机器(性能、网络带宽都是顶尖的)每秒能够接受并处理 100攻击数据包,那样的话,你的攻击就什么用处都没有了,而且非常有死机的可能。要知道,你若是发送这种1Vs1的攻击,你的机器的CPU占用率是 90%以上的,你的机器要是配置不够高的话,那你就死定了。
DDoS攻击。它的原理说白了就是群殴,用好多的机器对目标机器一起发动DoS攻击,但这不是很多黑客一起参与 的,这种攻击只是由一名黑客来操作的,他的机器在网络上占领很多的“肉鸡”,并且控制这些“肉鸡”来发动DDoS攻击。
DRDoS分布反射式拒绝服务攻击这是DDoS攻击的变形,它与DDoS的不同之处就是 DrDoS不需要在攻击之前占领大量的“肉鸡”。它的作用原理是基于广播地址与回应请求的。一台计算机向另一台计算机发送一些特殊的数据包如ping请求时,会接到它的回应;如果向本网络的 广播地址发送请求包,实际上会到达网络上所有的计算机,这时就会得到所有计算机的回应。这些回应是需要被接收的计算机处理的,每处理一个就要占用一份系统 资源,如果同时接到网络上所有计算机的回应,接收方的系统是有可能吃不消的,就象遭到了DDoS攻击一样。黑客向广播地址发送请求包,所有的计算机得到请求后,却不会把回应发到黑客那里,而是发到被攻击主机。这是因为黑客冒充 了被攻击主机。
为什么UDP 是不可靠的,TCP 是可靠的
UDP在传输数据之前不需要先建立连接,远地主机的运输层在接收到UDP报文后,不需要确认,优点是传输效率高。
TCP提供面向连接服务,传输数据前必须先建立连接,接收方确认,数据传输后要释放链接,TCP因为其拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠