计算机网络

发布于:2025-03-25 ⋅ 阅读:(31) ⋅ 点赞:(0)

网络模型

计算机网络就是把多台计算机设备互连起来,以实现信息传递和资源共享。但多台设备互联就会出现兼容性问题,比如设备A把信息通过方法1进行包装传递,设备B通过方法2进行包装,好点的情况就是设备A解读不出来设备B发送的信息,坏的话信息在网络中间就传不下去了。

计算机网络分层就是为了解决各种不同设备在网络互联中的兼容性问题。在每一层中,我不管你上下怎么封装,你只要是能让我进行封装和拆封就行,同时每一层承担着自己独特的功能。比较规范的就是 OSI 模型,但是只说了每一层要承担的功能,没说怎么实现,所以更通用的是 TCP/IP 网络模型。
在这里插入图片描述

ip、port 和 Socket

ip 可以区别不同的计算机设备,端口是一个数字标识符(0-65535),用于区分同一台计算机上运行的不同应用程序或服务。比如,HTTP通常使用80端口,HTTPS使用443端口。

Socket是操作系统提供的一种抽象接口,一个socket通常由以下几部分组成:

  • IP地址(标识主机)
  • 端口号(标识主机上的特定应用程序或服务)
  • 协议(如TCP或UDP)

Socket是操作网络连接的工具,通过 Socket,程序可以使用 TCP、UDP 等传输层协议来建立连接、发送和接收数据。即:“IP地址 + 端口号”一起确定了网络中的一个具体应用程序或服务。Socket是实现这一通信的机制

注:抽象接口并不是说每具体实现,而是隐藏了底层细节,提供统一接口。

Cookie、Session 和 Token

Cookie 本身是一个键值对,由服务器通过 HTTP 响应头的 Set-Cookie 字段发送给浏览器,浏览器将其存储在客户端。

比如:Set-Cookie: JSESSIONID=abc123; Path=/; HttpOnly

Session 是服务器端存储的数据,可能包含复杂的结构,比如:

  • 用户 ID:12345
  • 用户名:Alice
  • 登录时间:2025-03-21 10:00:00

这些数据不会直接存储在 Cookie 中,因为 Cookie 容量有限(通常 4KB),而且出于安全考虑,敏感数据不适合放在客户端。在典型的实现中,Cookie 的作用是传递一个 Session ID,浏览器在每次请求时通过 HTTP 请求头(如 Cookie: JSESSIONID=abc123)把 Session ID 发回服务器。服务器收到 Session ID 后,在自己的存储(如内存或数据库)中查找对应的 Session 数据。

默认情况下,浏览器存储 Session ID 的 Cookie 是一个 会话 Cookie。会话 Cookie 的特点是:它只在浏览器会话期间有效,一旦浏览器关闭,这个 Cookie 会被删除

Token 是一个用于身份验证或授权的凭证,由服务器生成并发放给客户端,用于证明客户端的身份或权限。比如 JWT (JSON Web Token),只要服务器验证这个 token 是有效的,就可以证明了它的身份,不需要像 Session 一样根据 Session ID去比对

  • Cookie 不包含 Session,但 Cookie 通常包含 Session ID。
  • Token 通常通过 Cookie、HTTP 请求头(如 Authorization)或请求参数传递给服务器。
  • 传统的 Session 依赖 Session ID,而 Token(尤其是 JWT)可以是无状态的,服务器不需要存储会话数据,Token 本身就包含了必要信息

JWT token

  1. 你输入用户名(alice)和密码(123456),点击登录。浏览器发送请求到服务器:
POST /login { "username": "alice", "password": "123456" }
  1. 服务器验证用户名和密码,生成 JWT token:头部(Header)、载荷(Payload)和签名(Signature),发送给客户端
头部:描述 Token 的元信息,指定签名或加密时使用的算法,以及声明这是 JWT,例如
{
  "alg": "HS256",
  "typ": "JWT"
}
经过 Base64URL 编码 后成为 JWT 的第一部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

载荷:携带实际数据(如用户身份),经过 Base64URL 编码 后成为 JWT 的第二部分
{
  "sub": "1234567890",
  "name": "alice",
  "exp": 1711123200
}

签名:确保 Token 的完整性和真实性,将1,2部分用.拼接后使用头部指示算法和密钥生成签名,
	 签名结果再经过 Base64URL 编码,成为 JWT 的第三部分。
  1. 每次请求受保护资源时,客户端在 HTTP 请求头中携带 JWT,服务器验证 JWT 的签名和有效性,确认用户身份

和拦截器的关系:拦截器本身不负责生成凭证,而是验证凭证。可以结合 Session(检查 Session ID)或 JWT(验证 Token)使用

前端是如何存储JWT的

客户端收到服务器返回的 JWT,可以储存在 Local Storage 里面,也可以储存在Cookie里面,还可以存储在Session Storage里面。
在这里插入图片描述

http、webscoket 和 RPC

Http、WebScoket都是应用层协议,但 WebScoket 允许服务器主动向客户端推送数据,而无需客户端反复发起请求。对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用 WebSocket 协议。
在这里插入图片描述

RPC 是一种概念,希望通过网络调用远程函数,像本地调用一样工作,具体实现(如 gRPC、Thrift)才定义协议

客户端: add(2, 3)
   ↓
客户端 Stub: 序列化 -> { "method": "add", "args": [2, 3] }(网络传输)
服务端 Stub: 反序列化 -> 调用服务端 add(2, 3)
   ↓
服务端: 返回 5(网络传输)
客户端 Stub: 反序列化 -> 返回 5
   ↓
客户端: result = 5

疑问我感觉RPC的功能http也能去完成啊,不就是在消息里加上函数名和参数吗
解答具体实现不同,可以不设计复杂的头部,可以支持双向流,可以直接调用不去解析传输的内容,比如http还得一点点去看响应体里每一部分。

Nginx

Nginx 可以看作一个软件,它的主要功能之一就是接收你的请求、转发到合适的地方(如果需要),然后将响应返回给你。只不过这个过程会进行优化,比如负载均衡、缓存等


网站公告

今日签到

点亮在社区的每一天
去签到