参考资料

  1. 《图解网络》-小林coding
  2. SSL/TLS 握手过程详解 -bilibili ANTIBili_MC
  3. ARQ与滑动窗口协议 -CSDN jmq_0000
  4. 帅地编程
  5. COOKIE和SESSION有什么区别? - 码海的回答 - 知乎

    应用层:HTTP/HTTPS

    什么是HTTP?

    HyperText Transmission Protocol,超文本传输协议。就是在两个节点之间传输超文本数据的约定和规范。在web上的超文本一般都是由HTML标记的。

    HTTP的有哪几类状态码?

    1开头的为协议处理的一些中间状态,比较少用;2开头为服务端成功处理后返回的,如200;3开头为重定向;4开头的为客户端错误,说明客户端发送的报文有误,服务端无法处理,比如访问服务器一个不存在的资源,返回404not found;5开头的表示服务器错误,表示服务器在处理报文时出错,如503表示服务器正忙,暂时无法响应;

    HTTP报文的格式?

    HTTP报文分为请求行、请求头、请求体或者响应行、响应头、响应体

    1. 请求报文

image.png
请求方法 请求路径 协议版本
主机名
连接方式:是否持久连接
用户代理(浏览器类型)
语言版本

  1. 接收报文

image.png

  • Last-Modified:服务器上次更新的时间;
  • Content-Length: 实体体的字节数;
  • Content-Type : 实体体中的对象类型;

    GET和POST有什么区别?

    GET一般为获取指定服务器的资源,请求体为空;POST则为向指定服务器提交数据,POST的参数可以写在URL中或请求体中。

    什么是幂等?GET和POST幂等吗?

    幂等指HTTP请求过后,服务器上的资源是否和请求前一致。

    什么是HTTP的长连接和短连接?

    长连接只需要进行一次TCP连接,之后的HTTP请求和响应都建立在一个TCP连接连接之上,在HTTP报文中的格式为Connection: keep-alive;短连接是每次HTTP请求和响应都建立一次TCP连接,在HTTP报文中的格式为Connection: close.

    什么是无状态协议?优缺点?怎么解决缺点?

    因为最开始的web访问没有交互式需求,所以最初的HTTP是无状态的,无状态指的是服务器无需记录HTTP以更新状态,因为不涉及服务器状态的变更,所以每个HTTP请求都是独立且不相互依赖的,每个请求都包含了该请求所需的完整数据;缺点是在发送需要身份验证的请求时,每次都要先进行身份验证;解决方法为Cookie,在客户发送第一次身份验证信息之后,服务器根据用户信息产生一个cookie,在响应的时候返回这个cookie,客户端下一次请求时带上这个cookie就相当于身份验证了。

    HTTP和HTTPS什么区别?

    从名字来看HTTPS: Hyper Text Transfer Protocol over SSL/TLS,指在TCP和HTTP层之间加了一个SSL/TLS安全层的HTTP协议;SSL:Secure Socket Layer,TLS:Transport Layer Security,TLS是SSL被广泛使用后对其进行标准化的协议。

    TSL(SSL)握手过程?

    SSL握手是为在客户和服务器之间安全地产生一个对称加密秘钥。步骤:
  1. 客户端发送Client Hello,包括:客户端生成的随机数R1,客户端支持的加密套件SSL版本
  2. 服务端更具客户端支持的加密套件确定一个加密套件并返还给客户端,该套件了加密和生成摘要的具体算法,此外还发送服务器生成的一个随机数R2和服务端的数字证书;随后服务器发送Client Hello Over通知客户端 Server Hello 过程结束;
  3. 客户端从CA验证数字证书的合法性后,从证书取出服务器公钥,生成一个随机数R3,用公钥对其加密生成R3哈希值(PreMaster Key)并发送给服务器(此时服务器通过自己的私钥解密哈希值得到R3);此时客户端和服务端使用相同的算法对R1+R2+R3进行加密,得到对称的协商秘钥;客户端随后通过协商秘钥对之前的握手信息和握手信息的摘要进行加密发送给服务端;
  4. 服务器通过协商秘钥解密解出握手信息和握手信息的摘要,再对解析出的握手信息哈希,如果得到的摘要和解析出的摘要一致,说明信息没被篡改,密钥也一致;服务器验证完客户端之后使用同样的方式发送信息给客户端,让其验证自己;

    cookie和session是什么?

    cookie

    cookie有两个含义:

  5. cookie是保存在客户端的文件,保存用户访问当前站点的特定消息(如登录信息,用户的行为信息,用户的个性化设置),本地浏览器根据不同的域名保存不同的cookie,访问网站时将cookie文件中的信息放在HTTP请求头的cookie字段中;

  6. cookie是一种验证身份信息的会话机制,这种会话方式通过用户在cookie中保存身份验证信息来实现登录,以及在cookie中保存用户信息来记录用户状态;

    session

    session是一种验证客户端身份信息的会话机制:
  • 服务端在收到客户端的身份验证信息后,服务端生成一个特定的session对象,用于存储和该客户会话的特定信息,比如登录信息和用户状态,并生成一个唯一的sessionID返回给客户端;
  • 客户端下次访问时在cookie中携带sessionID的信息即可完成身份验证和获取用户状态;

同一个服务端的不同服务器如何同步session对象?

  1. 方法一:将session信息的获取做成一个服务,存储在redis等中间件中;
  2. 方法二:将session信息在不同服务器之间同步;
  3. 方法三:通过负载均衡器如Nginx,将特定sessionID黏连在特定的服务器上,每次用户只到记录该用户sessionID的服务器进行访问;

    Token和JWT是什么?

    token也是一种客户端身份的校验机制,服务端根据客户端的身份验证信息生成token并返回,之后客户端再次请求时只需要在请求头中携带该token即可。
    JWT指的是JSON Web Token,是一套token的内容和实现的标准。

    token的实现机制

    一个token的实例:
    1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAxODcyNzQ4ODMyMzU4NSwiZ
    2. XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHVlYmVsbCJ9.lk_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX
    3. 0iZYFx9wU
    token有三个部分(由 . 分割),分别是:
  • Header:存储加密算法,token类型等;
  • Payload:存储user_id,exipre_time(过期时间)等;

    1. iss (issuer):签发⼈
    2. exp (expiration time):过期时间 sub (subject):主题
    3. aud (audience):受众
    4. nbf (Not Before):⽣生效时间
    5. iat (Issued At):签发时间
    6. jti (JWT ID):编号
  • Signature:通过Header指定的算法对Header和Payload用服务端私钥加密后的数字签名;

所以只要服务端的秘钥不泄露,则token就是安全的。

token机制的优缺点

优点:

  1. 实现了单点登录(在多个互相信任的服务中,只要用户登录了一个,就可以访问其余相互信任的所有服务);
  2. 防范了CSRF攻击(因为CSRF只能在请求中携带浏览器的cookie,而这里必须从 cookie中拿出相应的值并放到 authorization 头中。实际上cookie不能跨站(因为同源策略)被取出,因此可以避免 csrf 攻击);

缺点:

  1. token太长了,服务端不存储用户相关的信息,而是都存储在token中;
  2. 不安全,token只能由客户端关闭,服务端即使发现某个token不安全却无法关闭(原因见下文引用);

    token 一旦由 server 生成,它就是有效的,直到过期,无法让 token 失效,除非在 server 为 token 设立一个黑名单,在校验 token 前先过一遍此黑名单,如果在黑名单里则此 token 失效,但一旦这样做的话,那就意味着黑名单就必须保存在 server,这又回到了 session 的模式,那直接用 session 不香吗。所以一般的做法是当客户端登出要让 token 失效时,直接在本地移除 token 即可,下次登录重新生成 token 就好
    作者:码海
    链接:https://www.zhihu.com/question/19786827/answer/2064471064

什么是Refresh Token?

为什么要使用refresh token?
提高token的安全性,当被抓包时,大概率抓到的是access token,将在短时间内失效。

认证步骤:

  1. 客户端使⽤用户名密码进⾏行行认证;
  2. 服务端⽣成有效时间较短的 Access Token(例例如 10 分钟),和有效时间较⻓的 Refresh Token(例如 7 天);
  3. 客户端访问需要认证的接⼝时,携带 Access Token;
  4. 如果 Access Token 没有过期,服务端鉴权后返回给客户端需要的数据;
  5. 如果携带 Access Token 访问需要认证的接⼝口时鉴权失败(例例如返回 401 错误),则客户端使⽤ Refresh Token 向刷新接⼝申请新的 Access Token;
  6. 如果 Refresh Token 没有过期,服务端向客户端下发新的 Access Token;
  7. 客户端使⽤新的 Access Token 访问需要认证的接⼝;

image.png

传输层:TCP/UDP

  1. TCP首部有些啥内容?
  2. 如何确定一个TCP连接?
  3. UDP的格式?
  4. UDP和TCP的主要区别在于?
  5. 为什么TCP首部要有首部长度字段?
  6. TCP三次握手的过程?
  7. 为什么是三次握手?
  8. 既然IP层会根据MTU分片,为什么还需要TCP的MSS?
  9. TCP四次挥手的过程?
  10. 为什么主动关闭连接的一方需要TIME-WAIT?
  11. 为什么TIME-WAIT需要两个MSL?
  12. 什么是超时重传机制?
  13. 什么是确认应答号?
  14. TCP的滑动窗口是用来干嘛的?原理?
  15. 什么是停等ARQ和连续ARQ?
  16. 什么是滑动窗口?
  17. 为什么要进行拥塞控制?什么是拥塞窗口?
  18. 如何判断出现拥塞?
  19. 拥塞控制的总体过程为?

答案

  1. 首部内容:

    1. 源端口号/目标端口号 16 + 16
    2. 序列号 32
    3. 确认号(下一个数据报的序列号)32
    4. 首部长度(数据偏移) 4,标记位 6,窗口大小 16, 保留位 6
    5. 校验和 16, 紧急指针 16
    6. 其余选项(大小不确定)
    7. TCP数据
  2. 源地址 + 源端口 + 目的地址 + 目的端口,其中地址存放在IP首部,端口存放在TCP首部

  3. UDP格式:

    1. 源端口号/目标端口号 16 + 16
    2. 包长度(UDP包的长度:首部+数据) 16 + 校验和 16
    3. UDP数据
  4. 主要区别:

    1. TCP面向连接,UDP传输数据前不需要连接
    2. TCP是两个端口之间的一对一两点连接,UDP支持多对多
    3. TCP是可靠传输,保证数据顺序、无重复、无差错;UDP不是可靠传输,不能保证顺序、无重复、无差错
    4. TCP有拥塞控制和流量控制;UDP没有
    5. TCP首部开销大于UDP
    6. TCP如果大于MSS(Max Segment Size)将在传输层进行分片,目标收到后在传输层进行组装,如果丢失了某个分片,则需重传这个分片;UDP在IP层进行分片,目标收到后在IP层组装数据再传递给传输层
  5. 因为首部中有长度可变的可选字段。

  6. 首先要知道TCP首部的几个标记位的意思。

SYN:synchronize,该标记位1表示连接请求报文;
ACK:acknowledgement,确认标记;
步骤:

  1. 初始状态下,客户端、服务端状态都为:CLOSED
  2. 首先服务端主动监听某个端口,服务端状态为:LISTEN
  3. 客户端发出SYN报文,SYN标记为1,并随机初始化序列号x,之后客户端处于:SYN-SENT状态
  4. 服务端接收到SYN报文后,创建一个SYN+ACK报文,SYN和ACK都标记为1,并随机初始化序列号y,确认应答号设为x+1,之后服务端处于:SYN-RCVD状态(第一次握手)
  5. 客户端收到SYN+ACK报文后,创建一个序号为x+1的确认报文,ACK标记为1,确认应答号设为y+1,此时TCP可以携带数据传输,之后客户端处于:ESTABLISHED状态(第二次握手)
  6. 服务端接收到客户端的确认报文后,也将处于ESTABLISHED状态(第三次握手)
  1. 三次握手的原因:

    1. 首要原因是因为防止旧的连接初始化本次连接,如果服务端返回的旧的SYN+ACK报文比新的SYN+ACK报文先到达服务端,客户端将根据服务端返回的确认应答号和本次的序列号对比,如果不一致说明不是最新连接,将发送RST(Reset)报文给服务端重置本次连接;
    2. 其次是为了防止重复连接的建立,如果客户端的SYN报文阻塞,可能重复发送多个SYN报文,由于服务端无法知道客户端是否确认连接,每次接收到SYN报文都将建立一个连接,造成资源浪费;
  2. MTU指的是一个IP包的最大长度,MSS指的是一个IP包能容纳的最大TCP数据部分长度(MTU-IP首部长度-TCP首部长度)。由于IP层没有超时重传机制,如果用MTU进行分片,一个分片丢失将导致整个报文的所有分片都要重传。

  3. 首先要知道标记位FIN:finish,表示终止标记。双方都可以发起断开请求,如客户端请求断开的步骤:

    1. 客户端判断自己发送完全部数据后,发送一个FIN报文,此时客户端进入FIN-WAIT-1状态;
    2. 服务端接收到FIN报文后发送ACK报文,此时服务端进入CLOSED-WAIT状态,客户端收到ACK后进入FIN-WAIT-2状态;
    3. 服务端在CLOSED-WAIT阶段发送完自己的全部数据后,向客户端开始连续发送FIN报文,此时服务端进入LAST-ACK状态;
    4. 客户端收到服务端的FIN报文后,回应一个ACK报文,客户端进入TIME-WAIT状态,如果2MSL内收到FIN报文,则刷新等待时间,如果2MSL没有重新收到一个FIN报文,进入CLOSE状态;服务端收到ACK后,知道客户端已经收到FIN,停止发送FIN报文,进入CLOSE状态;
  4. 如果没有time wait,无法确认另一方是否正确关闭了该连接。

  5. MSL:Max Segment Lifetime,经过两个MSL,两个端口之间的TCP数据已经全部消亡,本次连接的TCP数据不会影响该端口下一次的TCP连接。

  6. 首先要知道RTT:Round_Trip Time,一个数据包的往返时延;RTO:Restransmission TimeOut,重传超时时间。RTO一般略大于RTT。当A给B发送消息时,如果超过RTO的时间还未接收到B的ACK和确认应答号,则A重新发送数据。

  7. 当B收到A的消息时,返回的确认应答号意思是通知A该确认应答号之前的字节都已收到,下次发送数据报从该确认应答号的序列号开始。

  8. 目的是为了提高ACK确认的效率和进行流量控制。窗口大小指的是发送方不等待ACK可以发送的数据量的最大值,接收端通过TCP首部的窗口大小通知发送方自己还有多少缓冲区能够缓存发送过来的数据。

  9. 停等ARQ指的是在一个分组未收到ACK之前,发送方停止发送分组,如果ACK超时,则重发该分组;连续ARQ指的是发送方连续发送多个分组,接收方更具收到的连续分组的最后一个分组发送ACK,代表该分组和该分组之前的数据全部收到。

  10. 根据连续ARQ协议,接收方在滑动窗口字段记录自己可用缓存的最大值返回给发送方,发送方根据该窗口大小来发送数据。发送方的数据分为3个部分:已接收ACK的数据,在窗口的数据,窗口之后超出接收方处理能力的数据。发送方将窗口内数据全部发送,如果收到某个ACK,则将窗口移动到ACK指定的序列号位置。

image.png

  1. 如果在网络拥堵时,依然大量发送数据包,可能导致数据包丢失和网络的更加拥堵。拥塞窗口(cwnd)是为了进行拥塞控制而限制的发送窗口的最大值,此时发送窗口的大小为新接收到的接收窗口和拥塞窗口的最小值。

  2. 当发生了超时重传,则判断发生了网络拥塞。

  3. 拥塞控制:

    1. 慢启动:每次发送数据,拥塞窗口呈指数式增长,直到慢启动阈值ssthresh (Slow Start Threshold)
    2. 拥塞避免算法:每次发送数据,拥塞窗口大小增长一位,直至发生数据包重传
    3. 拥塞发生算法:
      1. 使用超时重传:慢启动阈值ssthresh降为cwnd/2,cwnd重置为1,重新开始慢启动;
      2. 使用快速重传:当发送端接收到3个连续的ACK时,说明丢失了一个数据包,立即进行重传;随后加入快速恢复,cwnd变为cwnd/2,ssthresh变为cwnd,继续线性增加cwnd;

网络层:IP/DNS/ARP/ICMP

  1. IP地址分为哪几类?
  2. 什么是CIDR?
  3. 什么是子网掩码?有什么作用?
  4. 什么是网关?
  5. 什么是NAPT?
  6. 什么是共有IP和私有IP?
  7. 什么是DHCP?
  8. 什么是环回地址?
  9. 什么是ARP?
  10. 什么是ICMP?
  11. Ping的原理是什么?
  12. DNS的过程?

答案

  1. 如图

image.png
多播:用来发给特定组内的所有主机

  1. 不在按照类型划分IP地址,直接在IP地址后加上特定数字表示网络号长度:比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。

  2. 子网掩码的网络号全为1,主机号全为0。

作用是:

  1. 划分网络号和主机号,使用IP地址与子网掩码进行与运算即获得网络号;
  2. 在分类网络中划分子网,子网掩码可以从主机号中借用适当的位数作为子网号;

image.png

  1. 离开内网前往外网的“大门”(gateway)
  2. Nework Address&Port Translation,将同一个内网中各个使用TCP/UDP的用户转化为使用同一个公共IP+不同端口号的形式来访问外网。
  3. 共有IP是全球唯一的,需要向Internet NIC申请。私有IP是一个局域网内自己分配的IP地址,在两个不同的局域网内可以有两个一样的私有IP。

  4. Dynamic Host Configuration Protocol,动态主机配置协议,为一个内网内所用使用DHCP的用户自动分配一个不重复的私有IP。

  5. 127.0.0.1 -> localhost

  6. Address Resolution Protocol,根据IP地址获取MAC地址,方式为通过广播ARP请求获取MAC和IP的对应数据,存在ARP缓存表中。

  7. Internet Control Message Protocol(网络控制报文协议)

ICMP是一种特殊的IP报文,用来检测IP传输中的错误
image.png

  1. Ping使用ICMP,步骤为
    1. Ping回环地址:检测本地协议栈
    2. Ping网关:检测内网通路是否通畅
    3. Ping远端地址:测试到ISP的通路是否正常

原理:TTL(Time to Live)减为0时,IP数据报停止传输,返回减为0时的IP地址。

  1. DNS过程:

    1. 客户端向本地DNS服务器请求域名的IP地址;
    2. 本地DNS服务器向根域名服务器发送请求;
    3. 根域名服务器返回顶级域名服务器的地址,本地DNS服务器向顶级域名服务器发送请求;
    4. 顶级域名服务器返回权威服务器的地址,本地DNS服务器向权威服务器发送请求;
    5. 权威服务器返回最终的IP地址;

      输入URL到网页显示,发生了什么?

  2. 浏览器对URL进行解析,根据解析出的域名进行DNS查询,得到服务器的IP地址;

  3. 浏览器通过TCP协议的三次握手与服务器的端口建立TCP连接;
  4. 如果是HTTPS则先进行一次SSL安全层握手,通过TCP连接发送HTTP请求;
  5. 服务器对HTTP请求解析,访问特定资源,返回一个HTTP响应,如果HTTP请求的是短连接,则返回响应后进行TCP四次挥手断开连接;
  6. 客户端解析服务器返回的HTTP响应,解析其中的HTML文档,显示在网页上;