26届JAVA 学习日记——Day14
2024.11.21周四
今天仍然在补充基础知识,项目进度较慢,明天再回顾一下Java8的新特性。
八股
操作系统
什么是缓冲区溢出?
缓冲区溢出是一种常见的计算机安全漏洞,它发生在程序试图将过多的数据写入缓冲区(即一块用于临时存储数据的内存区域)时。缓冲区有固定的大小,如果写操作超出其边界,就会覆盖邻近内存区域的数据,这可能导致不可预测的行为,包括程序崩溃或更严重的安全漏洞。
计算机网络
计算机网络各层有哪些协议?
OSI七层模型:
国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Model),也就是
OSI 网络模型
,该模型主要有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。
- 应用层,负责给应用程序提供统一的接口;(浏览器、电子邮箱客户端)
- 表示层,负责将数据转换称兼容另一个系统能识别的格式;
- 会话层,负责建立、管理和终止表示层实体之间的通信会话;
- 传输层,负责端到端的数据传输;(TCP、UDP)
- 网络层,负责数据的路由、转发、分片;(IP、路由器、三层交换机)
- 数据链路层,负责数据的封帧和差错检测,以及MAC寻址;(网络交换机)
- 物理层,负责在物理网络中传输数据帧;(电缆、光纤、无线电频率)
TCP/IP模型:
事实上,我们比较常见,也比较实用的是四层模型,即
TCP/IP 网络模型
,Linux 系统正是按照这套网络模型来实现网络协议栈的。
TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。TCP/IP协议簇并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。
TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
- 应用层,支持HTTP、SMTP等最终用户进程
- 传输层,处理主机到主机的通信(TCP、UDP)
- 网络层,寻址和路由数据包(IP)
- 网络接口层,通过网络的物理电线、电缆或无线信道移动比特
TCP和UDP协议的区别?
- 连接:TCP是面向连接的传输层协议,传输数据前要先建立连接;UDP是不需要连接,即刻传输数据。
- 服务对象:TCP是一对一的两点服务,即一条连接只有两个端点;UDP支持一对一、一对多、多对多的交互通信。
- 可靠性:TCP是可靠交付数据的,数据可以无差错、不丢失、不重复,按序到达;UDP是尽最大努力交付,不保证可靠交付数据。但是我们可以基于UDP传输协议实现一个可靠的传输协议,比如QUIC协议。
- 拥塞控制、流量控制:TCP有拥塞控制和流量控制机制,保证数据传输的安全性;UDP则没有,即使网络非常拥堵,也不会影响UDP的发送速率。
- 首部开销:TCP首部长度较长,会有一定的开销,首部在没有使用「选项」字段是 20 个字节,如果使用「选项」字段则会变长。UDP首部只有8个字节,并且是固定不变的,开销较小。
- 传输方式:TCP是流式传输,没有边界,但保证顺序和可靠;UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
TCP为什么需要三次握手和四次挥手?
TCP为什么需要三次握手建立连接:
- 三次握手才能 阻止重复历史连接的初始化(主要原因)
- 三次握手才能 同步双方的初始序列号
- 三次握手才能 避免资源浪费
为什么 TCP 需要四次挥手关闭连接:
服务器收到客户端的 FIN 报文时,内核会马上回一个 ACK 应答报文,但是服务端应用程序可能还有数据要发送,所以并不能马上发送 FIN报文,而是将发送 FIN 报文的控制权交给服务端应用程序。
HTTP和HTTPS协议的区别?
- HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入SSL/TLS安全协议,使得报文能够加密传输。
- HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP默认端口是80,HTTPS默认端口号是443。
- HTTPS协议需要向CA(证书权威机构)申请数字整数,来保证服务器的身份是可信的。
算法
今日暂无该内容学习。
项目
苍穹外卖
项目过程中解决的一些问题:
BeanUtils.copyProperties()
BeanUtil
是Spring框架中的实体相关工具类,其包位置是package org.springframework.beans
,在开发过程中发现OrdersVO
需要承载的许多成员变量都来自Orders
,当时我以为这个方法只能将同名的方法传递到该类中,因此花了很多时间去和接口文档中的参数对比找新的实体类。
但是实际上该方法具有以下特性:
- 如果
OrderVO
继承自Orders
,则BeanUtils.copyProperties
也会复制父类Orders
的属性。 - 有一个ignore的参数,能选择性将某些变量的复制取消(如主键id)。
接口文档参数:
OrderVO:
package com.sky.vo;
import com.sky.entity.OrderDetail;
import com.sky.entity.Orders;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderVO extends Orders implements Serializable {
//订单菜品信息
private String orderDishes;
//订单详情
private List<OrderDetail> orderDetailList;
}