网络分层模型

网络分层模型

网络分层OSI七层模型(自底向上):

  • 物理层 - 通信介质:双绞线、光纤等,将模拟信号转换为数字信号的设备
    • 网络传输开始发送的为高低电平,八个为一比特位
  • 数据链路层 - 数据校验,定义了网络传输的基本单位:帧
  • 网络层 - 定义网络,两台机器之间传输的路径选择点到点的传输协议:ip协议,设备:路由器(链接不同网段的桥梁)
  • 传输层 - 传输数据,TCP、UDP,端到端的传输
  • 会话层 - 建立会话和保持会话:通过传输层建立数据传输的通道。
  • 表示层 - 编码、解码,翻译工作
  • 应用层 - 为客户停工各种应用服务

思考:

两个字节的数据发送后还是两个字节吗?

数据发送方将数据层层打包,将数据发送到对方处接受,然后按照发送方的解包方式进行解包,最终再得到原始数据。

所以,数据通信过程就是发送方层层打包的过程
接收方层层解包的过程

网络应用程序常见的两种模式

用户所使用的模式有两种

  • C/S模式
    • 客户端、服务器模式
      • 例:游戏客户端
    • 优点:
      • 可以缓存数据、对网络要求不大,不需要频繁访问服务器
      • 协议选择灵活
    • 缺点:
      • 开发周期长
      • 无法确定程序是否携带木马、病毒等
  • B/S模式
    • 浏览器、服务器模式
    • 优点:
      • 开发周期短
    • 缺点:
      • 由于浏览器限制,只能选择少数协议

大端和小端

指网络字节序的存储方式。

查看机器大小端的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>

union {
short s;
char c[sizeof(short)];
} un2;

union {
int s;
char c[sizeof(int)];
} un4;

int main() {
printf("[%zu][%zu][%zu]\n", sizeof(short), sizeof(int), sizeof(long int));

//测试short类型
un2.s = 0x0102;// 0x0102 =? 16*16+2
printf("%d,%d,%d\n", un2.c[0], un2.c[1], un2.s);

//测试int类型
//un4.s = 0x12345678;
un4.s = 0x01020304;
printf("%d,%d,%d,%d,%d\n", un4.c[0], un4.c[1], un4.c[2], un4.c[3], un4.s);
return 0;
}

C/S开发流程

  • 服务端

    • 创建socket,返回文件描述符用于监听客户端连接:socket
    • 将文件描述符和ip port进行绑定:bind
    • 将文件描述符由主动变为被动监听:listen()
    • 接受一个新的连接,得到一个文件描述符:accept(用于与客户端进行通信)
    • 接收数据:read、recv
      • 若读不到数据则阻塞
    • 发送数据:write、send
    • 关闭文件描述符:close
  • 客户端

    • 创建socket,返回文件描述符用于与服务端通信:socket
    • 连接服务端:connect()
    • 发送数据:write、send
    • 接收数据:read、recv
      • 若读不到数据则阻塞
    • 关闭文件描述符:close