网络基础概念

1.网络协议

网络协议是一组标准和规则,用于定义电子设备如何在网络上通信。这些规则涵盖了数据如何格式化,传输,路由以及接收。网络协议确保了不同制造商的设备能够相互理解和交换数据

协议分层

协议也是软件,在设计上为了更好的进行模板化,解耦合,也被设计成层状结构

OSI七层模型

在网络角度,OSI七层模型其实非常完善,但是在实际操作过程中,会话层和表示层是不可能写入操作系统中的,所以在实践中,实际是四层协议

TCP/IP四层模型

  • 应用层:提供网络服务和应用接口
  • 传输层:提供端到端的数据传输服务
  • 网络层:负责在多个网络之间路由数据包
  • 链路层:也被称为网络接口层,负责在物理网络上传输

关于协议的朴素理解

所谓协议,就是通信双方都认识的结构化的数据

因为协议栈是分层的,所以,每层双方都会有协议,同层之间,互相认识对方的协议

2.局域网网络传输基本流程

局域网(以太网为例)通信原理

认识MAC地址

MAC地址用于在局域网标识网络设备的唯一性,

长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示

例如: 08:00:27:03:fb:19

MAC地址在网卡出场的时候就确定了,不能修改,具有唯一性,(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址 )

  • 以太网中,任何时刻,只允许一台机器向网络中发送数据
  • 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
  • 所有发送数据的主机要进行碰撞检测和碰撞避免
  • 没有交换机的情况下,一个以太网就是一个碰撞域
  • 局域网通信过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定

数据包封装和解包,分用

当我们进行数据传送时,每一层都有协议,所以每一层都要进行封装和解包

传输的数据分为报头和有效载荷,报头就是对应协议层的结构体字段,我们一般叫做报头

所以,报文=报头+有效载荷

在不同层,报文的叫法不一样

  • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部 (header),称为封装(Encapsulation).
  • 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理

两台计算机通过TCP/IP协议通讯过程

3.跨网络传输流程图

网络中的地址管理--认识IP地址

IP协议有两个版本,IPv4和IPv6,一般提到 IP 协议,没有特殊说明的,默认都是指 IPv4

  • IP地址是在IP协议中,用来标识网络中不同主机的地址
  • 对于IPv4来说,IP地址是一个4字节,32位的整数
  • 我们通常用“点分十进制”的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255

跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输的过程中要经过一个或多个路由器

IP 地址和 MAC 地址的区别

特性

IP 地址

MAC 地址

作用

网络层逻辑地址,用于跨网络通信

数据链路层物理地址,用于局域网内通信

唯一性

不唯一,设备可以更改或重新分配

唯一且通常固定

更改可能性

可更改(静态或动态)

一般不可更改(除非使用欺骗技术)

使用层级

网络层(第三层)

数据链路层(第二层)

适用范围

广域网和局域网之间的通信

局域网内设备之间的通信

主要协议

IP 协议(IPv4、IPv6)

ARP 协议

简而言之,IP 地址是在不同网络之间定位设备的"逻辑地址",MAC 地址是设备的唯一 "物理地址",主要用于局域网内识别设备

IP 网络通信宏观流程

4.socket 编程预备

1.认识端口号

端口号(port)时传输层协议的内容

  • 端口号是一个 2 字节 16 位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的数据应该交给哪个进程
  • IP 地址+端口号能够标识网络上的某一台主机的某一个进程
  • 一个端口号只能被一个进程占用

端口号范围划分

  • 0-1023:知名端口号。HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的
  • 1024-65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的

理解"端口号"和"进程 ID"

进程 ID 属于系统概念,技术上也具有唯一性,可以用来表示一个唯一的进程,但是这样做,会让系统进程管理和网络强耦合,不太好,所以不建议这样做

理解 socket

  • IP 地址用来表示互联网中唯一的一台主机,port 用来表示该主机上唯一的一个网络进程
  • IP+port 就能表示互联网中唯一的一个进程
  • 网络通信的本质,就是进程间通信
  • 我们把 IP+port 叫做套接字 socket

2.传输层的典型代表

传输层是属于内核的,我们要通过网络协议栈进行通信,必须要调用传输层提供的系统调用,来进行网络通信

TCP 协议和 UDP 协议的特点

  • TCP:传输层协议,有连接,可靠传输,面向字节流
  • UDP:传输层协议,无连接,不可靠传输,面向数据报

网络字节序

我们知道,内存中的多字节数据有大端储存和小端储存,网络数据流中同样有大端小端之分,那么如何定义网络数据流的地址呢?

TCP/IP 协议规定:网络数据流应采用大端字节序,即低地址高字节

将 0x1234abcd 写入内存中

大端存储 小端存储

0x0000 0x12 0xcd

0x0000 0x34 0xab

0x0000 0xab 0x34

0x0000 0xcd 0x12

为使网络程序具有可移植性,可以调用库函数做大端字节序和小端字节序的转换

#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);//将32位的整数从主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort);//将16位的整数从主机字节序转换成网络字节序
uint32_t ntonl(uint32_t netlong);//将32位的整数从网络字节序转换成主机字节序
uint16_t ntons(uint16_t netshort);//将16位的整数从网络字节序转换成主机字节序

网络字节序就是大端储存

5.socket 接口编程

socket 常见 API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockaddr 结构

sockaddr 是一个通用的地址结构体,可以用来表示多种类型的地址,例如 IPv4 地址,IPv6 地址,Unix 域套接字地址

struct sockaddr {
    unsigned short sa_family;   // 地址族,例如 AF_INET、AF_INET6
    char sa_data[14];           // 地址数据的存储空间,具体内容依赖于地址族
};
  1. sa_family:
    • 类型:unsigned short
    • 这是一个地址族字段,用来表示该地址的类型。常见的地址族包括:
      • AF_INET:IPv4 地址族
      • AF_INET6:IPv6 地址族
      • AF_UNIXAF_LOCAL:Unix 域套接字地址族
      • AF_PACKET:用于低层网络通信(通常与链路层相关)
  1. sa_data:
    • 类型:char sa_data[14]
    • 这是一个字符数组,长度为 14 字节,表示存储地址的空间。它的具体内容依赖于 sa_family 的值。例如,对于 AF_INET(IPv4 地址),sa_data 会包含 IP 地址和端口号;对于 AF_INET6(IPv6 地址),它将存储 IPv6 地址和端口号。

sockaddr_in:sockaddr 表示 IPv4 地址

struct sockaddr_in {
    short sin_family;         // 地址族:AF_INET
    unsigned short sin_port;  // 端口号
    struct in_addr sin_addr;  // IPv4 地址
    char sin_zero[8];         // 保留字段,通常不使用
};

sockaddr_un:sockaddr 表示 Unix 域套接字

struct sockaddr_un {
    sa_family_t sun_family;    // 地址族:AF_UNIX
    char sun_path[108];        // Unix 域套接字路径
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值