计算机网络

137 阅读13分钟

一,OSI七层网络协议与TCP/IP四层网络协议

OSI七层网络协议TCP/IP四层网络协议用途常见协议
应用层应用层文件传输HTTP,FTP,SNMP, DNS
表示层应用层数据格式化,代码转换,数据加密,
会话层应用层建立,解除会话
传输层传输层提供端对端的接口TCP,UDP
网络层网络层为数据包选择路由IP,ICMP,ARP
数据链路层网络接口层传输有地址的帧PPP
物理层---二进制的数据形式在物理媒体上传输数据IEEE 802.1A, IEEE 802.2到IEEE 802.11
应用层:
HTTP:超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
FTP:文本传输协议。
SNMP:简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议。
DNSDNS域名系统主要负责记录互联网中主机名和该主机IP地址之间的映射关系。
传输层:
TCPUDP:处理传输过程中的数据包。
网络层:
IP:进行主机与主机,主机与网关,网关之间的通信
ICMP:主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
ARP:地址解析协议,将IP地址转化成MAC帧地址
数据链路层:
PPP:点到点协议(Point to Point ProtocolPPP)是为在同等[单元]之间传输[数据包]这样的简单链路设计的[链路层]协议。

二,HTTP

1)http1.0和http1.1

1,缓存处理
http1.0通过If-Modified-Since,Expires来做为缓存判断的标准; 
http1.1增加了e-tag,If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。  
If-Match:通常用在使用PUT方法对服务器资源进行更新的请求中,当前文件为旧的的情况下可以进行更新。
2,带宽优化和网络连接:
http1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了;又比如下载大文件时不支持断点续传功能,在发生断连后不得不重新下载完整的包。
http1.1中在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。例如:Content-Range:bytes0- 499/1234,表示请求头500个字节,实体常熟为12343,错误通知:http1.1新增了了24个错误状态响应码;  
4,host头处理:
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。  
5,长连接:在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
6,实现HTTP管道机制解决了部分队头阻塞情况。
HTTP管道机制(pipelining)
它指的是在一个TCP连接内,多个HTTP请求可以并行,客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。

2)http1.1和HTTP2.0

1、 HTTP2.0采用二进制格式而非文本格式:二进制协议解析起来更加高效,错误更少;
2、 HTTP2.0是完全多路复用的,代替原来的序列和阻塞机制——只需要一个连接即可实现并行:多路复用能同时处理多个消息的请求和响应,甚至可以在传输过程中将一个消息和另外一个消息掺杂在一起,所以客户端只需要一个连接就能加载整个页面;
3、 压缩头部信息减小开销:
4、 HTTP2.0允许服务器主动推送应答到客户端的缓存中:当浏览器请求一个页面时,服务器会首先返回HTML,浏览器解析HTML和发送所有内嵌资源的请求,服务器才开始发送JS、CSS、图片等,而服务器“推送”服务通过“推送”那些它认为客户端可能需要的内容到客户端的缓存中,从此来避免往返的延迟。
5、数据流(stream):请求数据流的编号ID为奇数,响应数据流的编号ID为偶数。每个数据包在发送的时候带上对应数据流的编号ID,这样服务器和客户端就能分区是属于哪一个数据流。最后,客户端还能指定数据流的优先级,优先级越高,服务器会越快做出响应。

3)http2.0和http3.0

http3.0主要解决http2.0中的丢包阻塞问题
Http2.0通常只使用一个 TCP 连接进行传输,在丢包或网络中断的情况下后面的所有数据都被阻塞。
HTTP3.0 背后的主要思想是放弃 TCP,转而使用基于 UDPQUIC (快速UDP互联网连接)协议。
与 HTTP2 在技术上允许未加密的通信不同,QUIC 严格要求加密后才能建立连接.
为了解决传输级别的线头阻塞问题,通过 QUIC 连接传输的数据被分为一些流。流是持久性 QUIC 连接中短暂、独立的“子连接”。每个流都处理自己的错误纠正和传递保证,但使用连接全局压缩和加密属性。每个客户端发起的 HTTP 请求都在单独的流上运行,因此丢失数据包不会影响其他流/请求的数据传输。

三、HTTP和HTTPS

http

一、特点

1)明文传输
2)简单快速
3)无状态的
无状态是指http对于处理事务没有记忆功能,当客户端再一次请求url时,并不会携带上一次发送请求时携带的信息。
4)无连接的
风险:信息窃听,信息篡改,信息劫持
- 如何解决http的无状态性?
(一)cookie + sessionId
    1)客户端登录,发送http请求给服务器;
    2)服务器把用户状态存储为session,生成一个sessionId;
    3)服务器返回set-cookie字段将cookie中的sessionId存储到浏览器中;
    4)浏览器下一次请求就携带cookie,服务端查 sessionId 校验 session;
    5)服务器返回响应数据。
    缺点:
      1,服务器需要存储sessionId对应的session信息,存储量较大,通常存储在Redis上;
      2,通常服务端是集群,而用户请求过来会走一次负载均衡,不一定打到哪台机器上。那一旦用户后续接口请求到的机器和他登录请求的机器不一致,或者登录请求的机器宕机了,session 不就失效了吗?这个问题现在有几种解决方式。
         一是从「存储」角度,把 session 集中存储。如果我们用独立的 Redis 或普通数据库,就可以把 session 都存到一个库里。
         二是从「分布」角度,让相同 IP 的请求在负载均衡时都打到同一台机器上。以 nginx 为例,可以配置 ip_hash 来实现。
    
 (二) token
     1)客户端登录,服务器校验账号密码,获取用户信息;
     2)将用户信息,token编码成token,返回给浏览器;
     3)下一次请求携带token
     4)服务器劫持到token,验证其有效性。
     JWT:防止token被篡改;
     JSON Web Token (JWT) 是一个开放标准,定义了一种传递 JSON 信息的方式。这些信息通过数字签名确保可信。
     缺点:
     一)注销登录等场景下 token 还有效,知道令牌过期才失效。
     解决方式:
         1)黑名单机制:注销的账户加入黑名单中,每次请求先拿到token判断是否在黑名单中,如果在直接返回。
         2)保持令牌有效期短并经常轮换。
     二)token设置时间短,用户频繁登录体验差
     解决方式:
        access token 用来访问业务接口,由于有效期足够短,盗用风险小,也可以使请求方式更宽松灵活。
        refresh token 用来获取 access token,有效期可以长一些,通过独立服务和严格的请求方式增加安全性;由于不常验证,也可以如前面的 session 一样处理。当token失效后,使用本地存储的refresh_token发送请求获取新的token和refresh_token并更新本地存储。
      

二、jwt的生成方式 截屏2022-05-23 下午12.30.22.png 将上述的三个部分用base64-url组合一起

三、cooke常见属性

- cooke常见字段有哪些属性?
  1)Domain / Path
  Domain属性指定浏览器发出 HTTP 请求时,哪些域名要附带这个 Cookie,如果没有指定domain,浏览器默认设置为请求url的一级域名,如果访问该域名的任何子域名,浏览器默认也携带cookie;
  Path属性🔝浏览器发出http请求时,哪些路径要附带这个cookie,请求路径包含path并在domain的域名下,那么就会懈怠cookie。
  2)Expires与maxAge
  Expires属性指定一个具体的到期时间,到了指定时间以后,浏览器就不再保留这个 Cookie。
  maxAge是从现在开始cookie存储的秒数,过了一段时间后,浏览器就不再保留这个cookie。maxAge如果为负数,表示临时cookie,当前浏览器关闭则删除这个cookie,如果为0,表示删除该cookie。
  如果同时指定了Expires和Max-Age,那么Max-Age的值将优先生效。
  如果Set-Cookie字段没有指定Expires或Max-Age属性,那么这个 Cookie 就是 Session Cookie,即它只在本次对话存在,一旦用户关闭浏览器,浏览器就不会再保留这个 Cookie。
  3)Secure/HttpOnly 
  Secure属性指定浏览器只有在https情况下,才能将当前的cookie发送给服务器。
  HttpOnly属性指定该cookie能否通过js脚本获取到,只能通过 HTTP 响应报文的 Set-Cookie 来新增或更新 cookie,而通过Document.cookie,xmlhttrequest等API无法获取到cookie的值,使得只有在浏览器发送http请求时才会携带该cookie。
  4)name/value
  cookie的姓名及值,一旦cookie被创建,那么对应name就不能更改
  5)SameSite
  SameSite表示是否允许跨域请求携带cookie。
  属性值:
  Strict:跨域请求严禁携带本站 cookie。
  Lax:默认值。可通过顶级导航的方式并使用 GET 请求发时可以携带。
  none:可以携带cookie,前提是secure为true,https请求时可以设置
  

四、单点登录SSO
定义 不同域名下,实现一次登录,全线通用。 SSO需要一个独立认证中心,只有认证中心提供登录入口,接受用户名和密码,然后携带令牌返回对应子系统。

1. 主域名相同  
    设置domain 为主域名下,可以实现cookie。  
2. 主域名不同
    1,用户访问系统A,处于未登录状态,重定向到sso认证中心,将当前地址作为url上的参数传过去;
    2,sso认证中心发现该用户未登录,跳入登录页面,输入账户和密码登录,sso认证中心认证通过,将token存在本地,下发令牌(token)给系统A3,重定向回系统A,携带token到sso认证中心认证成功后,正常返回数据。
    4,用户访问系统B,处于未登录状态,重定向到sso认证中心,将当前地址作为url上的参数传过去;
    5,sso认证中心发现该用户已经登录,下发令牌;
    6,重定向回系统B,携带token到sso认证中心认证成功后,正常返回数据。
    
    处理cookie跨域,可以在返回url中拼接callback回调,执行时获取到token。

加密: 对称加密和非对称加密
对称加密 对称加密是指通信双方都持有同一个密钥;用该密钥进行加密和解密;
非对称加密 非对称加密中有两把密钥,一把公钥一把私钥,用公钥加密后必须用对应的私钥解密;私钥加密后也必须用对应公钥解密。
https是用对称加密和非对称加密相结合
客户端加密过程

  • 某网站服务器拥有公钥A,私钥A';

  • 浏览器向服务器发送请求,服务器收到请求后利用明文传输将公钥A发送给浏览器;

  • 浏览器随机产生一个用于对称加密的密钥X,利用公钥A加密后传输给服务器;

  • 服务器收到拿到后用私钥A'解密,得到密钥X;

  • 浏览器和服务器双方将共同使用密钥X进行加密;
    中间人搞鬼

  • 在服务器将公钥A传输给浏览器的过程中,将公钥A劫持下来;

  • 中间人自己生成一个公钥B;明文传输给浏览器;

  • 浏览器收到公钥B后,随机生成一个密钥X,利用公钥B加密,然后发送给服务器;

  • 中间人劫持到密钥X,然后用公钥A加密,发送给服务器;

  • 在浏览器和服务器都不知道的情况下;每一次加密中间人都能用密钥X对内容进行解密。 ca认证安全证书

  • 网站在使用https前,需要先向“CA机构”申请颁发一份数字证书,数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证一样,可以证明“该公钥对应该网站”。
    如何防止Ca证书传输过程中被劫持
    数字签名

  • 制作过程ca拥有非对称的公钥和私钥,用哈希函数对证书中的信息进行解析;将解析后的信息利用ca公钥进行加密生成数字签名;

  • 浏览器验证过程用ca中的私钥对数字签名进行解析,利用哈希函数对证书信息进行解析,若两者一致,则签名成功,反之,则签名失败。