跳至主要內容

Net13 - 杂

codeNet八股约 1190 字大约 4 分钟

Session 是基于Cookie 实现的另一种记录服务端和客户端会话状态的机制。

Session 是存储在服务端,而 SessionId 会被存储在客户端的 Cookie 中。

Session 的认证过程

  1. 客户端第一次发送请求到服务端,服务端根据信息创建对应的 Session,并在响应头返回 SessionID
  2. 客户端接收到服务端返回的 SessionID 后,会将此信息存储在 Cookie 上,同时会记录这个 SessionID 属于哪个域名
  3. 当客户端再次访问服务端时,请求会自动判断该域名下是否存在 Cookie 信息,如果有则发送给服务端,服务端会从 Cookie 中拿到 SessionID,再根据 SessionID 找到对应的 Session,如果有对应的 Session 则通过,继续执行请求,否则就中断

Cookie和Session的区别

  1. 安全性,因为 Cookie 可以通过客户端修改,而 Session 只能在服务端设置,所以安全性比 Cookie 高,一般会用于验证用户登录状态
  2. 适用性,Cookie 只能存储字符串数据,而 Session 可以存储任意类型数据
  3. 有效期,Cookie 可以设置任意时间有效,而 Session 一般失效时间短

协议、实现、操作系统的关系

核心理解

协议本质上是规范,定义了数据应该长什么样、怎么交互。实现则是具体的代码,应用程序按照协议的规范来编写。最终所有应用都要调用操作系统提供的接口来进行网络通信。

HTTP/1.1 vs HTTP/2 vs HTTP/3 的本质改动

版本改动维度具体变化
HTTP/1.1基础版本文本格式、长连接、管道传输
HTTP/25个维度二进制格式、多路复用、头部压缩、服务器推送、优先级控制
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 协议栈处理 → 通过硬件发送数据。不同应用只是改变了"应用层数据的格式",底层传输机制都一样。

上次编辑于: