网络通信基础
Daisy Author

有关网络通信基础知识的笔记,学习资源来自清华电子系暑培录播

HTTP

TCP / IP 模型

  • 应用层 包含高层协议(HTTP, FTP, SMTP)
  • 传输层 提供端到端通信,包含传输控制协议(TCP)和用户数据报协议(UDP)
  • 互联网层 负责 IP 地址和路由的选择,包含 IP 协议
  • 网络接入层 传输比特流 / 节点间传输帧

IP 地址

网络设备的地址标识,分为 IPv4 和 IPv6。

IPv4

32 位 4 字节地址,点分十进制表示,如 192.168.42.14

缺点: 地址数量不够用。

IPv6

128 位地址,每 16 位一组,中间使用冒号隔开。

域名

字符型地址方案,与 IP 地址一一对应,域名在访问时会被解析为对应的 IP 地址。

端口

计算机为多进程并行执行,主机收到数据包后,应当转发为哪个进程,由端口号决定。

一个 IP 地址允许由 65536 个端口(16 bit 编码)

0-1023 编号端口称为周知端口(前 8 bit 编码),大多固定分配给某些服务(如 www)

http: 超文本传输协议

http 是 www 数据通信的基础。

server-client 模式:

  1. 客户与服务器建立连接
  2. 客户向服务器发送请求 request
  3. 服务器接收请求,返回相应文件作为应答 response
  4. 关闭连接

一次性连接,一次发送一个请求,应当后连接立即关闭

http request 格式

请求行 + 请求头 + 空行 + 请求体

示例(删去 # 注释理解):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 请求行 (HTTP 方法、请求 URI、HTTP 版本)
POST /submit-form HTTP/1.1 # optional: GET/POST/PUT/DELETE
# 请求头
HOST: www.example.com # 服务器域名
User-Agent: Mozilla/5.0 (Windows NT 10.0; win65, x64) Applewebkit/537.36
(KHTML, like Gecko) Chrome/91.0.4472.124 safari/537.36 # 客户端软件信息
Content-Type: application/x-www-form-urlencoded # 请求类型
Content-Length: 27 # 请求长度
# 空行

# 请求体 json/xml 代表所要上传数据
{
"name": "John Doe",
"age": 30
}

http response 格式

状态行 + 响应头 + 空行 + 响应体

示例(删去 # 注释理解):

1
2
# 状态行(HTTP 版本、状态码(403/404/408...)、状态描述)
HTTP/1.1 200 OK

Protobuf

序列化协议

通信传输面临问题: 不同编程语言使用不同数据结构,传输未对准。

序列化协议定义数据编解码方式、确保手法双方正确处理和理解。通过将复杂数据结构转化为线性字节流,消除潜在兼容问题。

常见协议: JSON、XML、protobuf

ex. 创建一个姓名为 John Doe,年林 30 岁的人物信息。

JSON

键值对形式。

1
2
3
4
{
"name": "John Doe",
"age"" 30
}

易读写,广泛支持,但序列化,反序列化速度慢。

XML

标签结构。

1
2
3
4
<person>
<name>John Doe</name>
<age>30</age>
</person>

可扩展,自定义标签,广泛支持,缺点同 json。

protobuf

预定义 proto 文件。

1
2
3
4
5
6
syntax = "proto3";

message Person {
string name = 1; # 编号 1
int32 age = 2; # 编号 2
}

使用 protoc 编译 proto 文件,得到一个 python 文件,随后可以通过 import 进行信息初始化与编码,得到信息的字节串编码。

序列化为二进制格式,高效多语言,向后兼容。

gRPC

现代高性能远程调用(RPC)框架,创建分布式应用程序和服务。

ex. 大型联机游戏,游戏内在逻辑需要大量复杂计算,不可能放在每一个用户的电脑上运行;服务器处理内在逻辑,用户通过接口调用不同的服务即可。

  1. 定义服务:用户可以调用的函数、函数参数、返回类型等
  2. 服务器端实现函数内部逻辑,运行 gRPC 服务器处理用户调用函数请求
  3. 用户保留存根(stub),通过存根调用服务器实现的函数

优点:用户和服务器在各种环境中通信,跨语言,跨平台,使用 protobuf 序列化数据