介绍一下TCP/IP模型和OSI模型的区别

背景

是在物联网起初, 不同厂商有自己不同的标准, 他们无法互通.

随着互联网的发展, 我们需要一个统一的, 标准化的模型, 让两个计算机能通信

是什么

TCP/IP模型是当今世界上最主流的网络模型(OSI模型是只存在于教科书上的模型, 并没有被实际采用)

TCP/IP模型从用户到硬件可以分为以下五层

应用层

传输层

网络层

数据链路层

物理层

物理层是规定硬件(比如网线)要怎么设计, 要遵守什么规范

传输层, 网络层, 数据链路层共同完成数据的转发过程

传输层只关注路径的起始和终点, 数据是从源主机的哪个进程(程序)发出的,要送到目标主机的哪个进程, 常见的协议是TCP/UDP

网络层负责路径规划的地址管理, 从源IP主机到目标源IP主机, 主要的协议是IP

数据链路层将上面规划好的路径进行具体的实施, MAC地址完成相邻设备之间的实际传输

这三层是硬件设备/操作系统设定好的, 是程序员无法干预的

应用层是程序员可以干预的

就是拿到数据怎么用, 定义数据格式/交互规则, 主要的协议有HTTP协议

每一层都只与相邻层交互,发送方从上往下封装,接收方从下往上解封装

OSI模型和TCP/IP模型基本一样, 就是把表示层, 会话层, 应用层合并为一个应用层

为什么

最后是为什么。 之所以采用分层设计,核心原因有两点:
第一,分治思想降低复杂度。网络通信涉及的问题太多,分层后每层只关注自己的职责,应用层管数据格式,传输层, 网络层, 数据链路层复杂完成数据的转发,物理层负责物理传输。各层解耦,方便维护
第二,标准化带来互操作性。分层定义了清晰的接口规范,只要遵循协议,不同厂商的设备就能互联互通,这为互联网的规模化发展奠定了基础。

从输入 URL 到页面展示到底发生了什么?

  1. URL解析和处理: 确定了 Web 服务器和文件名, 如果浏览器内有缓存, 则直接返回
  2. DNS查询: 将域名转化为IP地址
  3. 建立网络连接 TCP 三次握手, 如果是HTTPS, 还要TLS握手
  4. 发送HTTP请求与接收响应 构建HTTP报文, 向服务器发起请求并接受响应
  5. 浏览器渲染 解析响应并渲染页面

其中应该还涉及到
IP 路由、MAC 寻址、交换机的步骤
这些由操作系统和网络设备自动完成,程序员基本没办法干预, 所以我没有深入理解
所以在这个问题上,我回答的步骤是我更关注和理解并的那部分

DNS查询过程

DNS用来把域名转化为IP地址

整个过程可以概括为三级缓存查询+三级迭代查询

三级缓存: 浏览器缓存-系统缓存-本地DNS服务器缓存

三级迭代: 根服务器-顶级域名服务器-权威域名服务器

如果缓存中没有查到, 就会从本地DNS服务器逐级向上找

假设用户第一次访问www.baidu.com

  1. 浏览器检查自身缓存, 没有记录
  2. 操作系统查询hosts文件和系统DNS缓存, 也没有
  3. 查询本地DNS服务器缓存, 也没有记录

本地DNS服务器开始迭代查询

  1. .根域名服务器-返回.com顶级域名服务器
  2. .com顶级域名服务器-返回baidu.com的权威域名服务器地址
  3. baidu.com的权威服务器-返回www.baidu.com的IP地址, 比如…

最后, 这个IP沿原路返回, 本地三层都会缓存这个结果, 浏览器拿到IP后就可以建立TCP连接了

CDN是什么,有什么作用?

CDN是一种分布式网络服务, 它的核心是"将内容缓存到离用户更近的地方", 通过"就近访问"来加速内容传输

  • 就近访问: CDN在全球范围内部署了多个服务器节点, 用户的请求会被路由到最近的 CDN 节点, 提供快速的内容访问
  • 内容缓存:
    • CDN会缓存静态资源, 如图片, 样式表, 脚本等. 当用户请求访问这些资源时, CDN会首先检查是否已经缓存了这些资源.
    • 如果有缓存, CDN节点会直接返回缓存的资源,
    • 如果没有缓存所需资源, 它会从源服务器回源请求, 并将资源缓存到节点中, 以便后续请求
    • 通过缓存内容, 减少对原始服务器的请求, 减轻了源站的负载
    • 即使某些节点出现问题, 会自动调度到健康节点

Cookie和Session是什么?有什么区别?

┌─────────────────────────────────────────────────────────────────┐
│                        Cookie和Session关联流程                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────────┐      1.登录请求        ┌─────────────┐        │
│   │             ├───────────────────────>│             │        │
│   │   浏览器     │                        │   服务器     │        │
│   │             │<───────────────────────┤             │        │
│   └──────┬──────┘      2.创建Session     └──────┬──────┘        │
│          │                                      │                │
│          │ 3.服务器返回:                       │                │
│          │    - Session ID: "abc123"           │                │
│          │    + 自动设置Cookie:                 │                │
│          │      Set-Cookie: JSESSIONID=abc123  │                │
│          │                                      │                │
│          │ 4.浏览器保存Cookie                  │                │
│          │    ┌───────────────────────┐        │                │
│          │    │ 浏览器Cookie存储:     │        │                │
│          │    │ JSESSIONID = abc123   │        │                │
│          │    │ user = admin          │        │                │
│          │    └───────────────────────┘        │                │
│          │                                      │                │
│          │ 5.后续请求自动携带Cookie             │                │
│          │   GET /api/session/data             │                │
│          │   Cookie: JSESSIONID=abc123         │                │
│          │                                      │                │
│          │ 6.服务器查找Session                  │                │
│          │    ┌───────────────────────┐        │                │
│          │    │ 服务器Session存储:    │        │                │
│          │    │ "abc123" → {          │        │                │
│          │    │   username: "admin",  │        │                │
│          │    │   loginTime: 123456,  │        │                │
│          │    │   ...                 │        │                │
│          │    │ }                     │        │                │
│          │    └───────────────────────┘        │                │
│          │                                      │                │
│          │ 7.返回Session数据                   │                │
│          │                                      │                │
└──────────┴──────────────────────────────────────┴────────────────┘

cookie和session本质上都是键值对, Cookie 在客户端存 Session ID,Session 在服务端存用户数据,通过 ID 关联

举个例子

浏览器发起登陆请求

服务器创建session

{
    username: "admin",
    loginTime: 123456,
    ...
}

服务器返回

session id: “abc123”

自动设置cookie

浏览器cookie存储

session id=abc123

后续请求自动携带cookie

服务器查找session

abc123->…

返回session数据

Cookie和Session的区别?

  • 存储位置:Cookie 数据存储在用户的浏览器中,而 Session 数据存储在服务器上。
  • 数据容量:Cookie 存储容量较小,一般为几 KB。Session 存储容量较大,通常没有固定限制,取决于服务器的配置和资源。
  • 安全性:由于 Cookie 存储在用户浏览器中,因此可以被用户读取和篡改。相比之下,Session 数据存储在服务器上,更难被用户访问和修改。
  • 生命周期:Cookie可以设置过期时间,Session 依赖于会话的持续时间或用户活动。
  • 传输方式:Cookie 在每次 HTTP 请求中都会被自动发送到服务器,而 Session 只传 Session ID

单机上,TCP和UDP服务为什么可以占用同一个端口?

端口只在同一传输层协议内唯一,TCP 和 UDP 是两套完全独立的协议栈,端口空间相互隔离。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐