sjmuvx

网络模型

OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

TCP/IP四层模型:网络接口层、网络层、传输层、应用层

其中ARP和RARP在OSI模型中是数据链路层协议,在TCP/IP模型中是网络层协议

网络层协议包括IP、ICMP

传输层协议包括TCP、UDP

应用层协议包括DNS、HTTP、SMTP、FTP

TCP协议

三次握手

过程

  1. Client发送带有SYN(seq=j)标志的数据包给Server (序列号是随机的,防止被黑客搞到后获得与其他主机之间通信的初始序列号)
  2. Server发送带有SYN(seq=k)/ACK(ack=j+1)标志的数据包给Client
  3. Client发送带有ACK(ack=k+1)标志的数据包

为什么要三次握手?

  • 为了建立可靠的通信通道,即确认Client和Server的收发功能都正常

    第一次握手,Client什么都无法确认;Server确认发送端发送正常,自己接收正常

    第二次握手,Client确认自己和Server发送、接收正常;Server确认Client发送正常,自己接收正常

    第三次握手,双方都确认自己和对方发送、接收正常

  • 防止超时的连接到达服务器,让服务器打开错误的连接(为什么不是两次握手的原因)

  • SYN/ACK在同一个包中发送,提高连接的速度和效率(为什么不是四次握手的原因)

为什么要回传SYN?回传SYN是为了建立并确认从Server到Client的通信

为什么三次握手的时候ack=seq+1?用于向发送端表示接收端已经收到了,且收到的信息确实就是你发送的信息

https://www.cnblogs.com/xiao-longxia/p/13646898.html

四次挥手

过程

  1. 主动关闭方A发送一个FIN,用来关闭A到被动关闭方B的数据传送
  2. B收到FIN,发回一个ACK,进入COLSE_WAIT状态。
  3. B发送一个FIN,用来关闭与A的连接
  4. A收到FIN后,进入TIME_WAIT状态,发回ACK并等待2MSL(MSL大于TTL衰减至0的时间,即报文最大生存时间),如果又收到B的FIN,则重发ACK并重新计时

为什么连接的时候是三次握手,而断开连接的时候是四次呢?

建立连接时,Server将ACK和SYN放在一个报文里发送给Client;而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,自己也许还有一些数据要发给对方,发送完后再发送FIN报文表示同意关闭连接,因此,ACK和FIN一般都会分开发送。

为什么要有CLOSE_WAIT状态? 通知应用程序发送剩余数据,处理现场,关闭相关资源。

服务器有大量CLOSE_WAIT可能的原因:1)资源没有关闭;2)请求调用超时引起连接关闭(SLB关闭连接)

为什么Client收到FIN后还要等待2MSL?

  • 保证TCP协议的全双工连接能够可靠关闭

    如果Server没有收到Client最后回复的ACK,超时后Server再次发送FIN,Client再次收到FIN时能保证对方收到ACK

  • 保证这次连接的重复数据段从网络中消失

    如果Client直接关闭后又请求建立新连接,且端口号与老连接的相同,如果前一次连接某些数据滞留在网络中,在新连接建立后才到达,Client会将这些旧数据与新连接的数据发生混淆

保证可靠传输

  • 校验和:首部与数据都参与校验

  • 序列号与确认应答:接收端每次收到数据报后,都会发送确认应答

  • 超时重传:当TCP发出报文后,它启动一个定时器,等待接收端的确认应答。如果不能及时收到一个确认,将重发这个报文段。

    使用ARQ(Automatic Repeat-reQuest)协议实现超时重传,包括停止等待ARQ协议和连续ARQ协议

    • 停止等待ARQ协议:每发完一个分组就停止发送,等待对方确认。如果超时后,还是没有收到ACK确认,则重新发送,直到收到确认后再发下一个分组;若接收方收到重复分组,就丢弃该分组,但同时还要发送确认

      优点:简单

      缺点:1)信道利用率低;2)等待时间长

    • 连续ARQ协议:发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

      优点:信道利用率高,容易实现

      缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

  • 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP用可变大小的滑动窗口协议实现流量控制

  • 拥塞控制:当网络拥塞时,减少数据的发送。

    拥塞控制和流量控制的区别

    拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。发送方让自己的发送窗口取为拥塞窗口(cwnd)和接收方的接受窗口中较小的一个。

    TCP的拥塞控制算法包括慢开始、拥塞避免、快重传/快恢复

    • 慢开始:由小到大逐渐增大拥塞窗口数值。拥塞窗口初始值为1,每经过一个传播轮次,拥塞窗口加倍。阈值(门限值)是默认的64KB,或者是和接收方协商过的阈值,超过阈值时进入拥塞避免
    • 拥塞避免:让拥塞窗口缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口加1
    • 快重传/快恢复:当发送方收到三个重复确认(TCP在收到乱序到达包时会立即发送ACK),它认为数据丢失了,立即重传这些丢失的数据。

    https://www.cnblogs.com/never--more/p/7193628.html

UDP协议

什么时候数据会乱序?网络非常拥塞的时候

数据乱序会产生什么影响?会造成音、视频的卡顿(因为少帧),但不会有太严重的影响

如何解决数据乱序问题?在数据报中加入数据报序号

使用场景?音、视频传输

可靠、低延迟的UDP协议(QUIC)

QUIC(Quick UDP Internet Connection),在UDP基础上实现类似于TCP+TLS+HTTP2的功能

特点:

  • 0RTT快速连接
  • 连接迁移:比如WIFI切换到4G时,客户端的IP会发生变化,需要重新建立TCP连接。而QUIC不以IP和端口作为标识,而是以客户端产生的一个64位作为连接标识
  • 改进的拥塞控制
    • 由应用程序实现不同的拥塞算法;
    • 一个应用程序不同的连接能配置不同的拥塞控制算法;
    • 拥塞算法的变更不需要停止服务,只需要修改配置然后reload
  • 双级别流控:基于Stream(类比于HTTP请求)和Connection(类比于TCP连接)级别的流量控制
  • 没有队头阻塞的多路复用:多路复用让所有请求在一个TCP连接上,如果某个资源的某个包丢失了,由于TCP用序列号标识数据的顺序,就会在接收端形成队头阻塞,直到丢包恢复;QUIC基于UDP,UDP一个连接上的多个Stream之间没有依赖,如果某个资源的某个包丢失了,只会影响单个资源(单个Stream)
  • 单调递增的 Packet Number:代替TCP的序列号。严格递增可以解决延迟情况下RTT采样不准确的问题(TCP延迟时重发同一个序列号,接收端拿到序列号不能判断是延迟到达的数据还是后面新发的数据)。保证有序的方式是用Stream的offset保证的
  • Ack Delay:TCP没有减去接收端从收到数据到发送ACK的时间差,导致RTT计算有误差;而QUIC减去了这段时间
  • 不允许Reneging:一个Packet只要被Ack,就认为它一定被正确接收,不允许丢弃该数据
  • 加密认证的报文:QUIC的头部是经过认证的,报文内容是经过加密的

https://cloud.tencent.com/developer/article/1405624

https://zhuanlan.zhihu.com/p/32553477

TCP与UDP的区别

TCP:面向连接的;可靠交付;面向字节流;只能一对一

UDP:无连接;尽最大努力交付;面向报文;支持一对一、一对多和多对多;无拥塞控制

网络攻击

DDOS攻击

SYN攻击

Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址不存在,因此Server需要不断重发直至超时。服务器端为了维护数以万计的半连接而消耗非常多的资源,无暇理睬客户的正常请求,甚至崩溃。

防御:

  1. 减少SYN的超时时间
  2. 增加半连接的队列

CC攻击

应用层攻击。

原理:对一些资源消耗较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的(服务器查询数据库、计算等操作)

防御:

  1. 数据缓存,从而减轻数据库检索压力和服务器计算压力
  2. 页面静态化

前端攻击

CSRF攻击

跨站请求伪造(Cross Site Request Forgery)

如何攻击?

  1. 用户在A网站登录,并用Cookie作登录凭证
  2. 攻击者诱导用户访问B网站
  3. B网站向A网站发送请求,浏览器默认会携带A网站的Cookie
  4. A网站验证了请求并进行了处理

如何防范?

可以用token来防范。用户登录获得token后,将它放到local storage中,当需要向服务端请求的时候,加上token

如何生成token?一种方法是使用JWT(Json Web Token)。JWT是无状态的,它包括JWT头、有效载荷、签名三部分,认证过程为:

  1. 用户登录成功后,服务器通过密钥生成一个JWT对象,返回给客户端
  2. 客户端每次请求都要携带JWT对象
  3. 服务端收到请求,用密钥计算用户信息的签名
  4. 比较JWT携带的签名和计算出来的签名是否一致,如一致可以进行处理并返回请求结果

XSS攻击

跨站脚本攻击(Cross Site Scripting)。攻击者将脚本嵌入到正常页面中,当用户访问该页面时,恶意脚本会执行。

如何防范?

  • 过滤标签,如<script>、<img>、<a>
  • 编码,对常见的符号如<、>在输入的时候要对其进行转换编码,这样浏览器就不会对该标签进行解释执行

https://zhuanlan.zhihu.com/p/26177815

SQL注入

攻击者在Web应用程序中事先定义好的查询语句结尾添加额外的SQL语句,使数据库执行非授权的操作。

如何防范?

  • 使用预编译的SQL语句
  • 严格控制数据类型,对数据类型进行校验
  • 对特殊的字符进行转义,如对单引号\'进行转义,可以防止攻击者来闭合语句
  • 对用户进行分级管理,严格控制用户的权限

https://zhuanlan.zhihu.com/p/320579411

HTTP

请求方法

  • GET:获取资源
  • HEAD:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。(可用来测试超链接的有效性
  • POST:发送、提交资源
  • PUT:更新资源
  • DELETE:删除资源
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理Server
  • OPTIONS:允许客户端查看服务器的性能
  • TRACE:回显服务器收到的请求,主要用于测试或诊断

GET和POST的区别

  • 浏览器在回退时,GET不会重新请求,POST会重新请求。【重要】
  • GET请求会被缓存,POST不会。【重要】
  • GET请求的参数会保留在浏览器的历史记录,而POST不会。因此,GET会导致CSRF攻击(跨域请求伪造)。【重要】
  • GET请求传递的参数大小有限制,POST没有
  • GET的参数是在URL中的,POST是放在请求体内的

状态码

2xx

  • 200(OK):请求已成功,默认是可缓存的
  • 206(Partial Content):可用于断点续传

3xx

  • 301(Moved Permanently):请求的资源已被永久的移动到新URI
  • 302(Found):临时重定向

4xx

  • 400(Bad Request):客户端请求的语法错误,服务器无法理解
  • 401(Unauthorized):需要认证
  • 403(Forbidden):服务器理解请求客户端的请求,但是拒绝执行此请求
  • 404(Not Found):资源不存在

5xx

  • 500( Internal Server Error):服务器内部出错,无法完成请求
  • 502(Bad Gateway):其实是连接超时,我们可以用Ctrl+F5来刷新服务器

报文结构

由开始行、首部、实体主体组成。

  • 开始行
    • 请求报文开始行:方法+空格+URL+空格+HTTP版本。例子:GET /profile/4270609/following-posts?tags=&page=5 HTTP/1.1
    • 响应报文开始行:HTTP版本+空格+状态码。例子:HTTP/1.1 200
  • 首部:通用首部(Date、Connection等)、请求首部(Accept-Encoding、Host等)、响应首部(Location,重定向用)、实体首部(Content-Type、Content-Length等)
  • 实体:表单信息

各版本区别

  • HTTP/0.9:仅支持GET请求,不支持请求头
  • HTTP/1.0:默认短链接,支持POST、HEAD请求
  • HTTP/1.1:默认长连接,支持PUT、DELETE、PATCH请求,支持断点续传
  • HTTP/2.0:服务器主动推送相关资源,请求报头压缩

HTTPS工作流程

  1. 客户端发送在客户端生成的随机数A,以及客户端支持的加密方法
  2. 服务器确认双方使用的加密方法,并给出数字证书、服务端生成的随机数B
  3. 客户端确认数字证书的有效性,然后生成一个新的随机数C,使用证书中的公钥加密后发送
  4. 服务器使用私钥解密,得到随机数C
  5. 客户端和服务器根据约定的加密方法,使用前面三个随机数,生成“会话密钥”(session key,是对称密钥),用于加密接下来的整个对话过程

SSL/TLS协议工作流程

HTTP与HTTPS的区别

  • 端口:HTTP默认80端口;HTTPS默认443端口

  • 安全性:HTTP传输的内容是明文,客户端和服务端都无法验证对方的身份;HTTPS传输的内容是经过加密的,传输的内容使用对称加密,但对称加密的密钥用服务器的证书进行了非对称加密

    • 对称加密:密钥只有一个,加解密速度快,典型的有DES、AES。

    • 非对称加密:密钥成对出现,加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),公钥是可以公开给其他人的,加密速度较慢,有RSA、DSA。

      RSA算法步骤:

      1. 选择两个不相等的质数p和q
      2. 计算p和q的乘积n(n的位数就是密钥的长度,一般是1024位,重要场合为2048位)
      3. 计算n的欧拉函数$\phi(n)$
      4. 随机选择一个整数e,满足$1<e<\phi(n)$并且e与$\phi(n)$互质
      5. 计算e在模$\phi(n)$ 意义下的逆元d
      6. 将n和e封装成公钥(n,e),n和d封装成私钥(n,d)

      RSA的安全如何保证?只要n未能被因数分解,就能保证安全。而大整数的因数分解是非常困难的。

      RSA的加解密过程:设要加密的信息为m(必须为整数),公钥加密为$m^e \equiv c(mod \ n)$,c就是要发送的信息。解密过程是$c^d \equiv m(mod \ n)$。(m必须小于n)

      RSA算法原理

  • 资源消耗:HTTP少;HTTPS多

Session和Cookie

Session和Cookie是用来跟踪浏览器用户身份的方式

  • Session存放在服务器端;Cookie存放在浏览器端,不是很安全
  • Session会在服务器上保留一定时间,访问增多时会影响服务器性能
  • Cookie能存放的数据比Session少

分类:

技术点:

相关文章: