计算机网络(基础概念)

发布于:2025-07-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

1 初识协议

协议的本质就是一种约定
总的来说,协议在生活中无处不在。

1.1 协议分层

协议本质上也是软件,在设计上为了更好地模块化、解耦合,也是被设计为层状结构的
分层就是解耦合的有效方式,增强了代码的可维护性

2 OSI七层模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来我们只学习1-4层,其它层基本使用不到

2.1 物理层

负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.

2.2 数据链路层

负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层.

2.3 网络层

负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.

2.4 传输层

负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.

2.5 应用层

负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.

在这里插入图片描述

OSI参考模型中,传输层的主要任务是向用户提供可靠的端到端服务,透明地传送报文,它向高层屏蔽了下层数据通信的细节,是计算机通信体系结构中最关键的一层。网络层的主要任务是通过路由算法,为分组通过通信子网选择最适当的路径。数据链路层的主要任务是在链路上无差错地传送以帧(frame)为单位的数据。物理层的主要任务是把用户的数据转换为电信号,透明地传送信号,是通信系统中最基本的扫描算法实现层。

3 TCP/IP协议族

在这里插入图片描述
所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了

3.1 什么是TCP/IP协议?

TCP/IP 协议的本质是一种解决方案
TCP/IP 协议能分层,前提是因为问题们本身能分层

3.1.1 OS与网络关系

在这里插入图片描述
总结:网络就是OS的一部分,TCP/IP网络也是C语言写的,不管什么OS网络代码和数据一定是一样的,所谓的协议就是一个结构体
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。

4 网络传输的基本流程

4.1 局域网

两台主机连接同一个局域网是能够直接通信的

4.2 MAC地址

1、MAC 地址用来识别数据链路层中相连的节点;
2、长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
3、在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
命令:ifconfig,查看自己的MAC地址(linux)(ehth0)
在这里插入图片描述
局域网通信
在这里插入图片描述
将每一台设备都看为一个网络协议栈,主机A向主机E发送信息,实际上是向所有的设备都发送这条信息,然后经由数据链路层来判断是否向本机发送的,如果不是直接忽略即可,所以对于上层的我们来说,我们根本不知道接没接收到消息

在以太网中同一时刻只允许存在一份报文,因为如果有多台设备互相发消息,可能会造成数据的污染,在这里以太网被视为临界资源,我们需要互斥的访问

1、以太网中,任何时刻,只允许一台机器向网络中发送数据
2、如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
3、所有发送数据的主机要进行碰撞检测和碰撞避免
4、没有交换机的情况下,一个以太网就是一个碰撞域
5、局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac 地址判定
这里可以试着从系统角度来理解局域网通信原理

在这里插入图片描述
其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包
在这里插入图片描述
每一层添加报头的过程就是封装的过程
在这里插入图片描述
问题:网卡(硬件)怎么知道有数据传来?(中断)
同层之间的通信我们可以视为直接通信。

整体复盘一下
在这里插入图片描述

从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
1.要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
2.要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?

5 跨网络传输

5.1 IP地址

IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4
•IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
•对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
•我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;

ifconfig :查看linux机器的ip地址

Mac VS IP:
在这里插入图片描述
通信图:
在这里插入图片描述
路由器是工作在网络层的设备,在A和B看来路由器就是一台主机,A和B也可以视为具有路由功能
在这里插入图片描述
在这里插入图片描述
在同一个路由器子网中,路由器会自动分配IP地址,同一个子网IP地址前缀一致

真实的网络通信:

在这里插入图片描述
IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异

6 Socket编程预备

6.1 源IP地址和目的IP地址

IP 在网络中,用来标识主机的唯一性
数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,才是目的。
在这里插入图片描述

6.2 端口号

端口号(port)是传输层协议的内容.
• 端口号是一个 2 字节 16 位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
• IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用.
在这里插入图片描述

IP地址标识特定主机,端口号标识特定进程
在这里插入图片描述

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

7 传统层的典型代表

如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。
在这里插入图片描述

8 了解协议

8.1 协议

认识 TCP 协议
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论 TCP 的一些细节问题.
•传输层协议
•有连接
•可靠传输
•面向字节流

认识 UDP 协议
此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后
面再详细讨论.
•传输层协议
•无连接
•不可靠传输
•面向数据报

因为我们暂时还没有深入了解 tcp、udp 协议,此处只做了解即可

8.2 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
•因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
•不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;
•如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

9 socket 编程接口

9.1 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);

在这里插入图片描述
上面我们可以用多态和继承来看待


网站公告

今日签到

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