网络OSI模型和TCP/IP模型分别介绍一下
OSI
- 应用层:http htps DNS 为应用程序提供统一的接口
- 表示层:将数据转换为兼容另一个系统能识别的格式
- 会话层: 建立管理终止表示层实体之间的通信会话
- 传输层: tcp udp 负责端到端的数据传输
- 网络层: ip 负责路由转发分片
- 数据链路层: APR 负责数据封帧、差错检测 MAC寻址
- 物理层: 传输数据帧
TCP/IP
- 应用层:HTTP SMTP DNS
- 传输层 TCP UDP
- 网络层 IP
- 网络接口层
HTTP报文
http请求类型
- GET:安全、幂等、缓存浏览器
- POST:不安全、不幂等、不缓存、无法保存为书签
HTTP1.1怎么对请求做拆包
通过"Content-Length"头字段来进行。
http断点重传
http为什么不安全
- 窃听:信息加密
- 篡改:校验机制
- 冒充:身份证书
TLS四次握手
- clientHello 客户端发送支持的TLS协议版本、产生的随机数、支持的密码套件
- ServerHello 服务端确认TLS协议版本、产生的随机数、确认的密码套件、服务器的数字证书
- 客户端通过浏览器或操作系统中的公钥确认数字证书,如果没有问题从数字证书中取出服务器的公钥,加密报文:随机数、加密通信算法改为会话密钥、通知握手结束
- 服务端通过三个随机数计算会话密钥、通知加密、结束
HTTPS如何防范中间人的攻击
HTTP1.1 2.0区别
- 头部压缩
- 二进制传输
- 并发传输 stream
- 主动推送资源
HTTP进行TCP连接之后,在什么情况下会中断
- 执行close系统调用 FIN 四次挥手
- 发送方一直没收到ACK 重传到了最大次数
- HTTP长时间没有进行请求和响应
HTTP、SOCKET和TCP的区别
Socket 是一种网络通信的抽象,提供了一种用于在网络上进行数据交换的接口。它是应用程序与网络协议之间的中介。
Socket 使用 TCP: 当使用流式 Socket 时,实际上是通过 TCP 协议进行数据传输。Socket 提供了一个简单的接口,使得开发者可以方便地使用 TCP 协议进行网络通信。
DNS
DNS的全称是Domain Name System(域名系统)
默认端口号:53
基于UDP实现
golang interface(引用类型)
抽象与多态,如
- 定义可扩展的插件系统
- 依赖解耦与接口隔离:实现数据库操作的抽象层
type Database interface {Query(query string) ([]Row, error)Exec(query string) error
}type MySQL struct{}
func (m *MySQL) Query(query string) ([]Row, error) { /* ... */ }
func (m *MySQL) Exec(query string) error { /* ... */ }type Service struct {db Database // 依赖接口而非具体实现
}
在 Go 语言中,利用接口和直接为结构体编写函数之间有几个重要区别。以下是对这两种方法的比较:
1. 依赖注入与灵活性
-
利用接口:
- 依赖注入:
Service
结构体依赖于Database
接口,而不是具体的MySQL
实现。这使得Service
可以与任何实现了Database
接口的类型一起工作。 - 灵活性: 可以轻松地替换
Database
的具体实现,比如使用MySQL
、PostgreSQL
或其他数据库,只需提供相应的实现而无需修改Service
的代码。
- 依赖注入:
-
直接为结构体编写函数:
- 紧耦合: 如果
Service
直接依赖于MySQL
,那么Service
的实现与MySQL
紧密耦合。这意味着如果想要更换数据库,可能需要修改Service
的代码。 - 难以测试: 测试
Service
时,难以使用模拟(mock)或其他数据库实现,因为它依赖于具体的MySQL
类型。
PS:接口nil判断需要类型和值均为nil
- 紧耦合: 如果