# 计算机网络

# OSI 和 TCP 的区别?

  • OSI 是一个标准,但是并不符合实际,实现起来复杂。
  • TCP 是一种实现方式,TCP 是 OSI 的简化版。分为应用层,传输层,网络层,网络接口层。

# OSDI 七层模型是什么?

  • 物(物理层)
  • 联(链路层)
  • 网(网络层)
  • 淑(传输层)
  • 慧(会话层)
  • 适(表示层)
  • 用(应用层)。

# UDP 协议

  • 无连接的传输层协议,因为无连接所以不可靠。功能简单,没有流量控制,没有拥塞控制。
  • 头部只有八字节所以开销小,源端口,目的端口,长度和校验和。
    • 长度为报文段的字节数加上头部的字节数。
    • 校验和是针对报文整体,包含数据报部分和头部计算出来一个数值,保证数据在运输过程中不出错。
  • 适用于实时场景,例如视频多媒体之类。

# TCP 协议是什么?

  • TCP 是面向连接的可靠传输协议。TCP 是点对点,UDP 是一对多的协议。
  • GBN 协议是针对第一个发送的数据报进行计时,然后将之后的所有数据报重传。
  • SR 协议是针对发送窗口中的所有数据报,哪个数据报超时就重传哪个。

# TCP 多少字节?最大传输单元?

  • 最大传输单元(MTU) 1500 字节,IP 头部 20 字节,TCP 头部 20 字节,所以 TCP 的数据报最多 1460 字节。

# 流量控制和拥塞控制区别?

  • 流量控制是指控制两点之间的流量传输速度,通过调整窗口尺寸来实现,属于局部。
  • 而拥塞控制是根据整个网络的拥塞情况来调整数据传输,拥塞情况则用丢包,超时等信息来判断,属于全局。

# 拥塞控制流程?

  • 慢开始,拥塞避免,快重传,快恢复。
  • 慢开始:拥塞窗口指数增长到设置的值。
  • 快重传是指当收到连续三个连续的重复确认就重传,而不是等待超时再重传。

# 什么是累计确认?

  • 例如接收端收到了 1,2,3,4,5 而发送端收到了 3 的确认,发送端就不用再逐个确认 1,2 了。收到 3 表示 3 之前的都已经收到了。
  • Cookie 和 Session 是在 Web 开发中用于维护用户状态的机制。
  • Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
    • Cookie 一般用来保存用户信息。Session 的主要作用就是通过服务端记录用户的状态。
    • Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。
  • HTTP 是一种不保存状态,即无状态(stateless)协议。
  • HTTP 是无状态协议,Session 解决了这个问题。具体流程是在服务端针对用户创建相应的 Session 。但是客户端如何定位服务端相应用户的 Session ?主要是通过存储在客户端的 Cookie 中添加 Session id ,然后发送到服务端定位到相应的 Session 。
    • Cookie 是一种存储在用户计算机上的小文本文件,它包含有关用户的信息。Web 服务器通过将一个带有 Cookie 的 HTTP 响应发送到客户端来创建 Cookie,随后客户端在后续请求中将此 Cookie 作为 HTTP 标头发送回服务器。这样,服务器可以使用 Cookie 来标识用户并维护会话状态。Cookie 的一些常见用途包括跟踪用户偏好、存储购物车信息和实现“记住我”的自动登录功能。
    • Session 是在服务器上存储有关用户状态的信息。当用户第一次访问服务器时,服务器会为其创建一个唯一的会话 ID,并将此 ID 存储在 Cookie 中发送给客户端。客户端随后使用该会话 ID 在每个请求中标识自己。服务器使用会话 ID 从其存储的 Session 数据中检索与该用户相关的信息。Session 可以在服务器端存储任意类型的数据,包括登录凭据、购物车、用户首选项等。
  • 二者的主要区别在于数据存储的位置和方式。Cookie 数据存储在客户端,可以轻松地在不同的请求之间传递,但可能会被篡改或盗取。Session 数据存储在服务器端,安全性更高,但需要额外的存储空间和处理时间来管理会话状态。在 Web 开发中,通常将 Cookie 用于短期存储和跟踪用户数据,而将 Session 用于长期存储和维护用户状态。

# Session可以在多个服务器之间共享吗?

  • Session 数据可以在多个服务器之间共享,这通常称为分布式 Session。
  • 在分布式环境中,多个服务器共享相同的会话数据,以便用户可以在不同的服务器上访问其会话状态。为了实现这一点,可以使用多种技术,如使用数据库存储 Session 数据、使用共享存储(如共享文件系统或内存缓存)等。使用分布式 Session 可以提高应用程序的可伸缩性和容错性,但需要考虑数据一致性、性能和安全性等方面的问题。

# 粘包

  • 什么是粘包?
  • 粘包:在 socket 通讯中,通讯端一次连续发送多条数据包,tcp 协议将这多个数据包一个 tcp 报文发送出去。拆包:报文太长,一个 tcp 报文放不下,需要拆分。
  • 为什么会有粘包和半包问题?
    • TCP 传输的数据是以流的形式,流数据没有明确的边界。
  • 如何解决粘包?
    • 消息定长。
    • 消息尾部添加分隔符。
    • 消息分为 header 和 body 。