Net13 - 杂
约 1190 字大约 4 分钟
杂
Cookie 和 Session
Session 是基于Cookie 实现的另一种记录服务端和客户端会话状态的机制。
Session 是存储在服务端,而 SessionId 会被存储在客户端的 Cookie 中。
Session 的认证过程:
- 客户端第一次发送请求到服务端,服务端根据信息创建对应的 Session,并在响应头返回 SessionID
- 客户端接收到服务端返回的 SessionID 后,会将此信息存储在 Cookie 上,同时会记录这个 SessionID 属于哪个域名
- 当客户端再次访问服务端时,请求会自动判断该域名下是否存在 Cookie 信息,如果有则发送给服务端,服务端会从 Cookie 中拿到 SessionID,再根据 SessionID 找到对应的 Session,如果有对应的 Session 则通过,继续执行请求,否则就中断
Cookie和Session的区别
- 安全性,因为 Cookie 可以通过客户端修改,而 Session 只能在服务端设置,所以安全性比 Cookie 高,一般会用于验证用户登录状态
- 适用性,Cookie 只能存储字符串数据,而 Session 可以存储任意类型数据
- 有效期,Cookie 可以设置任意时间有效,而 Session 一般失效时间短
协议、实现、操作系统的关系
核心理解
协议本质上是规范,定义了数据应该长什么样、怎么交互。实现则是具体的代码,应用程序按照协议的规范来编写。最终所有应用都要调用操作系统提供的接口来进行网络通信。
HTTP/1.1 vs HTTP/2 vs HTTP/3 的本质改动
| 版本 | 改动维度 | 具体变化 |
|---|---|---|
| HTTP/1.1 | 基础版本 | 文本格式、长连接、管道传输 |
| HTTP/2 | 5个维度 | 二进制格式、多路复用、头部压缩、服务器推送、优先级控制 |
| HTTP/3 | 传输层 | TCP → UDP(解决丢包阻塞问题) |
本质: 每次升级都是消除上一个版本的性能瓶颈
协议在代码中的体现
HTTP/1.1 - 文本格式:
GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
\r\n
HTTP/2 - 二进制帧格式:
[帧头9字节] + [帧类型] + [流ID] + [帧数据]
0x00 0x00 0x10 0x01 0x05 0x00 0x00 0x00 0x01 [数据...]
核心区别: 改变了 socket.send() 发送什么数据、怎么格式化数据
Socket 是怎么实现的
Socket 不是应用程序实现的,而是操作系统通过系统调用提供的接口。
调用链路:
应用代码(Java/Python)
↓ 调用
编程语言库(java.net.Socket / socket 模块)
↓ 调用本地方法(JNI/ctypes)
操作系统 socket API(系统调用)
↓ 直接操作
网卡驱动 + 网卡硬件
Java 中的例子:
// 应用层
Socket socket = new Socket("example.com", 80);
socket.send(data);
// 底层实现(Java 库中的 native 方法)
// private native void socketConnect(String host, int port);
// ↑↑↑↑↑↑
// 这里调用操作系统的 socket API
操作系统的核心功能
操作系统是硬件和应用程序之间的中介:
应用程序不能直接操作硬件
↓
操作系统管理和控制硬件
↓
应用程序通过系统调用使用硬件资源
主要职责:
- 进程管理:多个程序同时运行,OS 分配 CPU 时间片
- 内存管理:物理内存 → 虚拟内存分配
- 文件系统:硬盘 → 文件和目录结构
- 网络协议栈:TCP/IP 实现(TCP 在传输层)
- 设备驱动:网卡、键盘等硬件管理
网络通信的完整分层
┌──────────────────────────────────────────┐
│ 应用层(应用程序) │
│ HTTP/FTP/SSH (规范 + 数据格式) │
└────────────────┬─────────────────────────┘
↓ socket.send()
┌──────────────────────────────────────────┐
│ 传输层(操作系统内核实现) │
│ TCP / UDP │
│ 可靠传输、端口管理、流量控制 │
└────────────────┬─────────────────────────┘
↓
┌──────────────────────────────────────────┐
│ 网络层(操作系统内核实现) │
│ IP 协议 │
│ 寻址、路由选择 │
└────────────────┬─────────────────────────┘
↓
┌──────────────────────────────────────────┐
│ 链路层/物理层(硬件驱动+硬件) │
│ 网卡驱动 + 网卡硬件 │
│ 转换为电信号,通过网线传输 │
└──────────────────────────────────────────┘
数据的完整传输过程
应用层:构造 HTTP 请求数据
↓
传输层(TCP):添加 TCP 头 → 可靠传输
↓
网络层(IP):添加 IP 头 → 寻址和路由
↓
链路层:添加以太网头 → 转换为电信号
↓
网卡硬件:通过网线传输
总结
- HTTP/FTP/SSH 等应用层协议 = 定义数据格式和规范
- TCP/UDP 等传输层协议 = 操作系统实现,负责可靠传输
- IP 等网络层协议 = 操作系统实现,负责寻址和路由
- 网卡硬件 = 实际的物理传输
关键认识: 所有应用程序的网络通信本质上都是:调用操作系统提供的 socket API → 经过 TCP/IP 协议栈处理 → 通过硬件发送数据。不同应用只是改变了"应用层数据的格式",底层传输机制都一样。
