计网 七层网络模型

news2025/1/19 11:02:38

计网 七层网络模型

一.协议(protocol)

1.什么是协议

数据在网络中传输时按照的规则就是协议(protocol)

协议(protocol)规定了数据在网络中传输的顺序,格式,以及携带哪些内容

二.IOS/OSI开放式系统互联理论模型(也叫七层网络模型)

拓展:IOS/OSI开放式系统互联理论模型是一个完整的系统(系统:有自己完整的功能,并且能进行二次开发的)

1.IOS/OSI开放式系统互联理论模型的组成

(1)应用层
1.功能

应用层是运行一些应用程序(qq,微信等)

2.应用层用到的协议
1>HTTP(端口号为80):访问网站需要的协议
2>HTTPS(端口号为443):访问网站需要的协议(HTTPS比HTTP多了一个SSL加密方式,所以HTTPS更安全)

如下图访问百度网站用到了HTTPS协议

在这里插入图片描述

注意:www.baidu.com叫做域名(domain name)

3>FTP(端口号为21):文件传输协议
4>DNS(端口号为53):域名解析协议(把好记的域名转为IP地址)
5>DHCP(端口号为68):自动获取网络配置的协议
6>Telnet(端口号为23)
7>Smtp(端口号为25)
8>SSH(端口号为22)
(2)表示层
1.功能

1.数据加解密:发送之前加密,接收到之后解密

2.数据解压缩:将一个数据在发送前进行压缩,其总的数据量变小,传输的就快,占用网络通道时间就更短(网络通道是大家共用的),接收到之后解压缩。

3.图片/视频编解码:在发送之前将图片和视频进行编码,在接收到之后解码

(3)会话层
1.功能

1.session会话管理:登录一个网站后,例如爱奇艺,当登陆完账户之后,再在爱奇艺中打开其他页面就不需要再次重新登录了,因为是同一个账户(也叫做同一个会话),保证用户信息不会过期不需要登录

2.服务器验证用户登录:当访问某一个网站/服务器,要做用户登录,输入用户名和密码,验证密码是否正确,用户是否存在

3.断点续传:在下载一个应用的时候,断网了,恢复网络的时候,还是从没下的部分进行下载,下过的部分进不需要再下载了

(4)传输层
1.传输层用到的协议
1> TCP

TCP是传输控制协议,提供一种面向连接的、可靠的、基于字节流的传输层通信协议,有流量控制和差错控制,使用TCP协议的应用有邮件的接收和发送、文件传输、远程登录等。

需要数据稳定和完整性比较高的场景多使用TCP协议

2> UDP

UDP是用户数据报协议,提供一种无连接的、高效率的、低可靠性的数据传输服务,使用UDP协议的应用比如音视频聊天、在线游戏王者荣耀、工业物联网数据传输等。

需要数据时效性比较高的场景多使用UDP协议

3> 线程
4> 端口

端口决定了在数据到达设备后,操作系统要把这个数据分配到具体哪一个应用程序(应用程序会绑定端口号)

注意:应用程序和端口号之间的关系是一对多的关系,一个应用程序可以绑定多个端口号,一个端口只能被一个应用程序所绑定(一旦端口被绑定了,那其他应用程序就不能绑定该端口)

5> socket(套接字)

socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口

(5)网络层
1.网络层用到的设备
1>防火墙

保护电脑安全,有两种方式

1.黑名单:通过拉黑IP地址,所有端口都不会接受拉黑IP地址发出的数据,以保护电脑安全

2.白名单:设备/某些应用程序只允许某些端口被外部访问,以保护电脑安全

2>路由器
2.网络层用到的协议
1>IP

IP是每一个接入网络设备都要具有的

查看IP的步骤

1.windows键+R键,打开一个窗口,如下

在这里插入图片描述

2.输入cmd,确定,就会出现命令输入窗口

在这里插入图片描述

在这里插入图片描述

3.在命令输入窗口中输入ipconfig(ip的相关配置)

在这里插入图片描述

4.就可以看到当前当前电脑ip地址的相关配置了

在这里插入图片描述

IP地址分为两类,一种是IPv4地址,另一种是IPv6地址

2>ARP
3>RARP
(6)数据链路层
1.数据链路层用到的设备
1>网卡

当我们使用网卡的时候就会给网卡分配一个IP地址(手动分配或者是自动获取的)

网卡除了IP地址还有MAC地址,MAC地址出厂的时候是全球唯一的(生产网卡的厂商会给它分配全球唯一的MAC地址)

2>交换机

交换机与路由器的区别:

1.交换机只能通过单纯的物理连接

2.交换机的数据不能跨交换机,路由器可以跨路由器

(7)物理层
1.功能

将设备中传输的数字信号转换成电信号或者是光信号,通过光缆或者是电缆传输到对端去

2.看下面图片进行加深理解

在这里插入图片描述

3.基于七层网络模型的数据传输的过程

发射端应用层->发射端表示层->发射端会话层->发射端传输层->发射端网络层->发射端数据链路层->发射端物理层,然后转换成电信号或者是光信号通过电缆或者光缆传输到对端设备,再从对端设备的物理层->对端设备的数据链路层->对端设备的网络层->对端设备的传输层->对端设备的会话层->对端设备的表示层->对端设备的应用层

三.TCP/IP事实标准网络模型

1.TCP/IP事实标准网络模型的组成

(1)应用层

(2)传输层

(3)网络层

(4)物理层

四.C/S(Client/Server)模型与B/S(Browser/Server)模型

1.C/S模型的特点

1.访问应用程序的客户端固定(每一个应用程序都有自己固定的客户端,只能由自己固定的客户端访问)

2.客户端和服务端的协议可以是任意协议(常用的是TCP和UDP协议)

2.B/S模型的特点

1.访问网站的浏览器不固定(一个网站可以由多个浏览器访问)

2.必须使用HTTP或者是HTTPS协议

3.写一个C/S模型的数据通信(客户端和服务端的协议用的是UDP协议)

1.看下图,理解C/S模型的数据通信的过程

在这里插入图片描述

2.C/S模型的数据通信的过程

1.加载库(库为ws2_32.lib)

2.创建套接字(所用到的函数为socket())

3.绑定IP地址和端口号

4.接消息(所用到的函数为recvfrom()),回消息(所用到的函数为sendto())

5.关闭套接字(所用到的函数为closesocket()),卸载库(所用到的函数为WSACleanup())

3.使用代码实现C/S模型的数据通信
1.创建一个新项目(选的是空项目)

在这里插入图片描述

2在该项目下创建一个文件,在该文件中进行代码的实现如下
#include<iostream>
#include<winsock2.h>
//这里说一下包含头文件时的一个知识点
//<>就是在操作系统指定的地方开始找要包含的头文件
//“”就是从当前文件夹开始找要包含的头文件
using namespace std;

//导入依赖库(使用WSAStartup函数和WSACleanup函数时需要此依赖库)
#pragma comment(lib,"Ws2_32.lib")//这里只需要输入名字就行,编译器知道它的具体路径在哪

int main() {


	//1.加载库

	//创建一个WORD类型的变量
	WORD version = MAKEWORD(2,2);//MAKEWORD这个宏是创键一个WORD类型的变量(这里创建的是2.2版本的WORD类型的变量,然后用version接一下这个变量的值)

	//定义一个结构体变量
	WSADATA data;

	//加载库的函数
	int err = WSAStartup(version, &data);/*此函数的头文件为winsock2.h,此函数第一个参数是一个输入参数,该输入参数一个是版本号(WORD类型的)
										 第二个参数是输出参数,该输出参数是一个结构体指针
										 接一下返回值,并根据返回值判断是否成功*/
										 
	//判断是否成功,打印日志
	if (err != 0) {
		cout << "WSAStartup error" << endl;
		return 1;
	}

	//判断加载的版本号是否正确
	if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2) {
		cout << "WSAStartup Version error" << endl;
		//卸载库(程序退出之前需要将加载的库卸载)
		WSACleanup();//此函数没有参数
		//程序退出
		return 1;
	}
	else {
		cout << "WSAStartup suuccess" << endl;
	}


	//2.创建套接字
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);/*此函数的第一个参数是使用的地址族格式(我们这里填的是AF_INET(这是个宏定义),表示用的使用IP地址的格式是IPv4类型的),
															 第二个参数是表示创建一个什么类型的套接字,这里填的是SOCK_DGRAM(这个是宏定义)表示创建的是使用UDP的套接字
														     第三个参数表示用哪个协议,这里填的是IPPROTO_UDP(这个是宏定义)表示使用的是UDP的协议
															 如果此函数成功了,那么此函数返回的是新创建出来的套接字
															 如果失败了,返回的是INVALID_SOCKET*/
	//判断套接字是否创建成功
	if (sock == INVALID_SOCKET) {
		cout << "socket error" << endl;
		//获取失败的错误码并进行打印输出
		cout << WSAGetLastError() << endl;
		//卸载库(程序退出之前需要将加载的库卸载)
		WSACleanup();//此函数没有参数
		//程序退出
		return 1;
	}
	else {
		cout << "socket success" << endl;
	}

	//3.绑定ip地址和端口号(在操作系统那注册一下当前进程对应的ip和端口)
	
	//定义一个sockaddr_in类型的结构体
	sockaddr_in addServer;
	//进行结构体的初始化
	addServer.sin_family = AF_INET;//初始化地址族格式,和上面套接字的地址族格式一样,表示用的使用IP地址的格式是IPv4类型的
	addServer.sin_port = htons(666666);//绑定端口号(端口号可以随便写,但是为了避免和已有的应用程序绑定的端口号重复,端口号最好写5位或6位的长度的),htons函数是将端口号的存储方式转换成网络字节序(大端存储)
	addServer.sin_addr.S_un.S_addr = INADDR_ANY;//绑定所有网卡(因为大部分设备不只有一个网卡(也就不只有一个IP地址))
	//绑定IP地址和端口号的函数
	err = bind(sock, (sockaddr*)&addServer,sizeof(addServer));/*此函数的第一个参数是套接字
					第二个参数是sockaddr类型的结构体指针
					第三个参数是第二个参数中结构体所占的空间的大小
					如果此函数成功了,
					如果失败了,*/
	if (err== SOCKET_ERROR) {
		cout << "bind error" << endl;
		//获取失败的错误码并进行打印输出
		cout << WSAGetLastError() << endl;
		//关闭套接字,卸载库
		closesocket(sock);//在将加载的库卸载之前关闭套接字
		WSACleanup(); //程序退出之前需要将加载的库卸载

		//程序退出
		return 1;
	}
	else {
		cout << "bind success" << endl;
	}
    
	int recv = 0;//定义一个变量用来接recvfrom函数的返回值
	int send = 0;//定义一个变量用来接sendto函数的返回值
	char recvData[1024] = ""; //定义一个空间用来接要来的数据
	char sendData[1024] = "";//定义一个空间用来接要来的数据
	sockaddr_in recvaddr;//定义一个sockaddr_in的结构体,这里要存的是数据是从哪个端口号和ip来的(这里注意要强转成sockaddr*)
	int recvaddrlength = sizeof(recvaddr);//这个变量存的是sockaddr_in结构体的空间大小
	while (true) {
	//4.接受数据
	recv=recvfrom(sock, recvData,sizeof(recvData),0, (sockaddr*)&recvaddr, &recvaddrlength);
     /*
    第一个参数是用哪个套接字接收数据(输入参数)
    第二个参数是用来接收数据的空间(输出参数)
    第三个参数是用来接收数据的空间的长度(输入参数)
    第四个参数是标志位,如果有特殊套接字的话要设置标志位,这里无特殊的,不需要使用标志位,填0(输入参数)
    第五个参数是一个sockaddr的结构体,这里存的是端口号和ip,表示数据是从哪个ip地址和端口号来的(输出参数)
    第六个参数是第五个参数结构体的大小(输入,输出参数)
    如果成功了,返回的是接收到的数据的字节数
    如果失败了返回SOCKET_ERROR 
    */
	if (recv > 0) {
         //打印ip地址和接收的数据
         cout << "IP:" << inet_ntoa(recvaddr.sin_addr)/*这里因为recvaddr.sin_addr这个变量村的ip地址是u_long类型的,看不懂,所以我们要转成字符串类型*/ << "     " << "SAY: " << recvData << endl;
         //我们打印出来能看懂的ip地址,"192.168.3.123"这个是十进制四等分ip字符串类型的地址
         //我们打印出来看不懂的ip地址,u_long类型的ip地址
         //这里介绍两个函数
         //inet_addr(),这个函数是将字符串类型转换成u_long类型
         //inet_ntoa(),这个函数是直接把sin_addr的结构体转换成字符串类型
     
	}
        
        
	//5.发送数据
    cin >> sendData;//把要输出的数据存到用来发送数据的空间
	send = sendto(sock, sendData, sizeof(sendData), 0, (sockaddr*)&recvaddr, recvaddrlength);
	/*第一个参数是用哪个套接字发送数据(输入参数)
    第二个参数是用来发送数据的空间(输出参数)
    第三个参数是用来发送数据的空间的长度(输入参数)
    第四个参数是标志位,如果有特殊套接字的话要设置标志位,这里无特殊的,不需要使用标志位,填0(输入参数)
    第五个参数是一个sockaddr的结构体,这里存的是端口号和ip,表示数据是发到哪个ip地址和端口号(输出参数)
    第六个参数是第五个参数结构体的大小(输入,输出参数)
    如果成功了,返回的是发送的数据的字节数
    如果失败了返回SOCKET_ERROR 
    */
	if (send == SOCKET_ERROR) {//如果失败了
			//输出错误日志,获取失败的错误码并进行打印输出
			cout << "send failed  " << WSAGetLastError() << endl;
			break;
		}
        
	//6.关闭套接字
	closesocket(sock);
	//7.卸载库
	WSACleanup();//此函数没有参数
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解决】运行vue项目,启动报错 in ./node_modules/@intlify/core-base/dist/core-base.cjs

我的处理方式: 一开始查了好多方法&#xff0c;删除node_modules&#xff0c;重新安装&#xff0c;切换node版本等&#xff0c;但是发现并没有用 之后来发现是安装依赖包的时候有些包安装失败导致的&#xff0c;只要有针对性的重新安装依赖就可以了 例如&#xff1a; in ./n…

【vue2.x】如何快速实现每个月倒计时

代码一 //获取这个月最后一天getLastDay(){var year new Date().getFullYear(); //获取年份var month new Date().getMonth() 1; //获取月份var lastDate new Date(year, month , 0).getDate(); //获取当月最后一日month month < 10 ? 0 month : month ; //月份补 0…

6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)

在过去的几个月里&#xff0c;我广泛探索了 ChatGPT 的所有可用插件。在此期间&#xff0c;我发现了一些令人惊叹的插件&#xff0c;它们改进了我使用 ChatGPT 的方式&#xff0c;但现在&#xff0c;我将透露一些您需要了解的内容。 借助 Chrome 扩展程序&#xff0c;所有 Chat…

深度学习(生成式模型)——DDPM:denoising diffusion probabilistic models

文章目录 前言DDPM的基本流程前向过程反向过程DDPM训练与测试伪代码 前向过程详解反向过程详解DDPM损失函数推导结语 前言 本文将总结扩散模型DDPM的原理&#xff0c;首先介绍DDPM的基本流程&#xff0c;接着展开介绍流程里的细节&#xff0c;最后针对DDPM的优化函数进行推导&…

网络通信——与WEB服务器交换数据(三十)

1. 与WEB服务器交换数据 1.1 知识点 &#xff08;1&#xff09;可以通过地址重写的方式进行Web Server的访问&#xff1b; &#xff08;2&#xff09;可以采用POST方式进行请求的提交&#xff1b; &#xff08;3&#xff09;可以读取网络上的图片信息&#xff1b; 1.2 具体…

javaEE - 1(9000字详解多线程第一篇)

一&#xff1a;认识线程 1.1 线程的概念 线程是操作系统中执行的最小单位&#xff0c;它是进程中的一个实体。一个进程可以包含多个线程&#xff0c;并且这些线程共享进程的资源&#xff0c;如内存、文件句柄等&#xff0c;但每个线程有自己的独立执行流程和栈空间。 线程在…

SOAR安全事件编排自动化响应-安全运营实战

SOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品&#xff0c;但大部分都用得不是很理想。SOAR不同与传统的安全设备&#xff0c;买来后实施部署就完事&#xff0c;SOAR是一个安全运营系统&#xff0c;是实现安全运营过程中人、工具、流程的有效…

【GlobalMapper精品教程】063:线转面,面转线、线折点转点、面折点转点、点生成线、点生成面案例教程

本文讲解globalmapper中进行矢量线转面,面转线、线折点转点、面折点转点、点生成线、点创建面的方法。 文章目录 一、 面转线二、线转面三、线折点转点四、面折点转点五、点生成线六、点生成面一、 面转线 加载《GlobalMapper中文实战精品教程》(订阅专栏,获取所有文章阅读…

C语言的offsetof宏模拟和用宏实现交换奇偶位

目录 1. offsetof宏模拟 2. 宏实现交换奇偶位 1. offsetof宏模拟 作用&#xff1a;该宏的作用是计算一个结构体中成员的偏移量 模拟实现&#xff1a; #define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName) StructType是结构体类型名…

python:talib.BBANDS 画股价-布林线图

python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…

jni:as 进行 JNI / NDK 开发:初步配置及使用

AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客版权声明&#xff1a; 本文为博主原创文章&#xff0c;转载请标明出处。AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客 一、相关名词解释 JNI&#xff1a;java native interf…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组队列

《数据结构、算法与应用C语言描述》使用C语言实现数组队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

JAVA基础(JAVA SE)学习笔记(三)流程控制语句

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础&#xff08;JAVA SE&#xff09;学习笔记&#xff08;一&#xff09;JAVA学习路线、行业了解、…

Sql Server Report Service 使用简单说明

ReportServices做为报表服务器&#xff0c;结合sql直接访问数据库提供基本的报表格式设置显示&#xff0c;可以快速开发报表&#xff0c;主要包含两部分内容&#xff1a; 1.ReportServices服务器配置搭建&#xff0c;承载报表的运行平台 2.设计报表 ReportServices配置 1&am…

【C++初阶(二)】缺省参数函数重载

目录 前言 1. 缺省参数 1.1 什么是缺省参数 1.2 缺省参数的分类 1.2.1 全缺省参数 1.2.2 半缺省参数 2. 函数重载 2.1 什么是函数重载 2.2 缺省参数与函数重载 2.3 函数重载的使用 3. C支持函数重载的原因 总结 前言 在学习C语言时我们就会发现&#xff0c;C语言中存在的许多…

使用 Python 交互式方法预测股票价格变动概率

一、简介 当深入金融世界时,了解股价走势是一个显着的优势。在这里,我们提出了一种交互式方法,可以根据历史数据深入了解股价达到某些目标的可能性。 该工具利用 Python 强大的库,信息丰富且视觉上引人入胜。所提供的工具不会预测未来价格,而是评估价格波动的历史频率,让…

牛客网 -- WY28 跳石板

题目链接&#xff1a; 跳石板_牛客题霸_牛客网 (nowcoder.com) 解题步骤&#xff1a; 参考代码&#xff1a; void get_approximate(vector<int>& v,int n) {//求约数&#xff0c;从2到sqrt(n)即可&#xff0c;原因看图解//这里一定要等于sqrt(n)&#xff0c;例如16…

数据挖掘(6)聚类分析

一、什么是聚类分析 1.1概述 无指导的&#xff0c;数据集中类别未知类的特征&#xff1a; 类不是事先给定的&#xff0c;而是根据数据的相似性、距离划分的聚类的数目和结构都没有事先假定。挖掘有价值的客户: 找到客户的黄金客户ATM的安装位置 1.2区别 二、距离和相似系数 …

轻量级超分网络:Edge-oriented Convolution Block for Real-timeMM21_ECBSR 和 eSR

文章目录 ECBSR&#xff08;Edge-oriented Convolution Block for Real-timeMM21_ECBSR&#xff09;1. 作者目的是开发一个高效的适合移动端的超分网络。2. 作者决定使用plain net &#xff0c;但是效果不好&#xff0c;因此利用重参数化方法&#xff0c;丰富特征表示。3. re-p…