# 计算机网络
# 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 的区别?
- 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 。
← C++