Linux学习之网络

news2024/9/23 3:27:37

目录

认识协议

网络协议初始

协议分层

OSI七层模型

TCP/IP的四层模型

数据包封装和分用

以太网通信

ip地址与MAC地址

网络编程套接字

端口号(port)

认识协议

网络字节序

socket接口


网络的产生是计算机历史的必然性,是计算机发展的必经之路

在有了计算机后,通信就是非常重要的一部分,不同网络之间通信数据,数据长距离传输,数据的检验,数据同步等注定计算机网络及其硬件的产生。

通过交换机与路由器连接不同区域网的主机从而通信,后来子网越来越多,后来有了局域网,城域网,广域网。

认识协议

协议本质就是一个约定,通过协议极大降低我们通信之间的成本,因此网络通信自然就有对应的协议。在整个数据传输过程当中,为了更好的通信,我们将其分为几层,然后解决每一层问题:

第一层:如何处理发来的数据?---https,http,ftp ,smtp....

第二层:长距离传输数据丢失问题  ---tcp

第三层:如何定位主机?---ip

第四层:如何保证数据准确到下一个设备。-----数据链路层

于是,处理每一层都有自己与之对应的协议。这里主要说明下三层,因为应用层即第一层本质是与计算机通信是无关的。

以快递单为例就是我们约定的协议,快递单的信息字段就是协议的报头,他最终的表现形式为结构体对象,相同的结构体就可以相互之间交互。

计算机生产厂商有很多; 计算机操作系统, 也有很多; 计算机网络硬件设备, 还是有很多; 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是网络协议。

网络协议初始

协议分层

首席按,为什么要分层,在日常开发当中,我们基本上都在分层,分层开发,上一层不会去干扰下一层,就像c++继承,通过分层开发的方式从而实现高内聚,低耦合。让我们的代码更好的维护起来,网络协议依然如此。

OSI七层模型

OSI Open System Interconnection ,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范; 把网络从逻辑上分为了7 . 每一层都有相关、相对应的物理设备,比如路由器,交换机 ; OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输 ; 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七 个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯; 但是, 它既复杂又不实用。

 

 因此该机构就明确的给出了网络协议的分层,一共七层,但是我们一般却用的是:

TCP/IP的四层模型

TCP/IP 五层 ( 或四层 ) 模型
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇 .
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求 .
物理层 : 负责光 / 电信号的传递方式 . 比如现在以太网通用的网线 ( 双绞 线 ) 、早期以太网采用的的同轴电缆 (现在主要用于有线电视 ) 、光纤 , 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决 定了最大传输速率、传输距离、抗干扰性等. 集线器 (Hub) 工作在物理层 .
数据链路层 : 负责设备之间的数据帧的传送和识别 . 例如网卡设备的驱动、帧同步 ( 就是说从网线上检测 到什么信号算作新帧的开始) 、冲突检测 ( 如果检测到冲突就自动重发 ) 、数据差错校验等工作 . 有以太 网、令牌环网, 无线 LAN 等标准 . 交换机 (Switch) 工作在数据链路层 .
网络层 : 负责地址管理和路由选择 . 例如在 IP 协议中 , 通过 IP 地址来标识一台主机 , 并通过路由表的方式规 划出两台主机之间的数据传输的线路( 路由 ). 路由器 (Router) 工作在网路层 .
传输层 : 负责两台主机之间的数据传输 . 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标 主机.
应用层 : 负责应用程序间沟通,如简单电子邮件传输( SMTP )、文件传输协议( FTP )、网络远程访问 协议(Telnet )等 . 我们的网络编程主要就是针对应用层 .
物理层我们考虑的比较少 . 因此很多时候也可以称为 TCP/IP 四层模型 . 一般而言:
对于一台主机 , 它的操作系统内核实现了从传输层到物理层的内容 ;
对于一台路由器 , 它实现了从网络层到物理层 ;
对于一台交换机 , 它实现了从数据链路层到物理层 ;
对于集线器 , 它只实现了物理层 ;

有人就要问了,标准不是七层吗,你现在甚至只用了4层,可能是五层,那么在实际的应用开发的过程中,人们发现数据链路层,网络层,传输层在操作系统内部实现是合理的,但是会话层,表示层,与应用层结合到一起,在上层实现是更好的,就不再os内部实现了。

其次叫TCP/IP协议族,主要是因为使用它们实在是太重要,于是命名就包含了协议名。

那么相对比操作系统的层,网络七层都对应操作系统的哪些呢?

 用户必须贯穿到硬件层,在主机通信时,就是从我的应用层到你的应用层(数据自顶向下交付):

局域网之间的主机就可以直接通信,这是依靠着局域网协议的,局域网协议有很多,后来的我们把它叫做以太网。

数据包封装和分用

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

网络协议栈的层状结构中每一层都有协议。同一层的可以直接通信。

由于信息在接受的过程中要保证是顺序的,因此我们都会对信息前加一个报文头,这个报头字段就写入,我是谁,我要发往哪里。因此从应用层开始开始,数据就自顶向下的开始封装自己,每一层都有对应的协议用来封装数据,通过这种方式,数据不仅被加密,之后也会确定数据发往哪里,回应是什么等。

通信的过程其实也就是不断地封装和解包的过程。,其实封装我们可以很好理解,就是加字段,但是解包是如何进行的呢,如果被封装了好几层?

于是每一层的协议还需要有一个能力将报头和有效载荷分离,还必须在报头中提供将自己的有效载荷交付给上一层的哪一个协议。

以太网通信

每一台主机都在自己的局域网中拥有独一的”编号“,

以太网通信原理:我们可以这样理解以太网通信原理,以教室为例,老师向同学张三发了一个数据包,要求他提交作业,指明了是张三,此时班里的所有同学都听到了老师的信息报,但他们发现是给张三发的,并不做任何响应,张三知道后,就站起来,向老师回答,作业昨天交了,你忘了吗。老师想了起来,于是作罢。   这一段过程我们就可以认为是局域网通信。

每一台主机都有对应的网卡,拥有自己独一的MAC地址,例如当pc0想发送报文到pc3时,就会在信息前加上MAC0+MAC3 +信息,之后如果其他主机接收到了发现不陪陪,就直接丢弃这个过程是在数据链路层中完成的,同时目的主机接收到信息,也会发对应的报文给源主机。

但是我们很明显能看到这样的一个局域网是很不安全的,首先如果我发消息,其他主机也发消息,就会存在数据碰撞的问题,此时消息都作废了,因此此时我们向局域网大量发送与之相关的数据和垃圾数据,发生碰撞,此时整个局域网就可能会崩溃。

因此每个主机还需要碰撞避免算法,整个局域网就是一个碰撞域,当发生碰撞,此时该碰撞域的主机暂时都不能发消息。

一般的垃圾消息,网卡会直接丢弃,网卡也有两种工作模式,一种正常模式,一种是混杂模式。

综上:以太网原理就是基于碰撞检测与碰撞域。

ip地址与MAC地址

为甚么要有IP地址,还有MAC地址,IP与MAC有什么区别。

以旅游为例,假如我们要从山西到云南,其次每过一个地点我们就去玩一下,沿途旅行,从山西出发,先去了陕西,之后去了四川最后到了云南,在这个过程中,对于我们其实是由两份地图的:

1.第一个就是我最开始在哪里,最后要到哪里去,这是不变的。

这里与之对应的就是源IP与目的IP地址。

2.第二个地图就是每经过一个地方,我们还要知道从这里到终点的下一个地方。

这里要一直变化的找目的地的地址就是MAC地址。

一个是长期不变的目标,一个是沿途的“驿站”。

由于不同网段的主机需要路由器联通,因此就需要同通过目的地址知到路由器,最后再到主机。

这里的路由器就相当于此时你准备去问路的“驿站”,当报文经过路由器,此时路由器就会查路由表来告知你应该往哪里走才会到终点,同时路由器会将当前的数据报,解包,丢弃老的报头换上新的报头,再封装成符合接收方格式的报文。

ip协议屏蔽了底层网络(链路层)的差异化,靠的就是工作在ip层路由器。ip地址实现了全球主机的软件虚拟层,一切皆是ip报文。无论你是那里的,只要你有路由器能解包和封装,最终到网络层我们都用ip数据报,此时就能通信。同一网段下底层的程序必须是一样的。

综上:我们也能知道ip地址与MAC地址的区别,ip地址,尤其是目的ip一般是不会改变的,用来协助选择路径。

MAC地址只要出了当前的局域网,就要丢弃源与目的的地址,之后更具ip的目的地址封装新的源目的地址。MAC每经过一个地点(局域网)就会改变。

网络编程套接字

端口号(port)

端口号是传输层协议的内容。

端口号是一个2字节16位的整数

端口号是一个进程,用来标识数据要交给哪一个进程处理

ip地址+端口号可以表示某一台主机某的一个进程

一个端口号只能被一个进程占用

网络通信就是进程间通信,通过网络协议栈,使用网络资源,让不同的两个进程通信。

通过端口号,我们就能知道是哪一个进程,即哪一个软件从而实现准确的信息传递。端口无论是对于客户端还是服务端,都能唯一标识一个网络应用层进程,加上ip地址,就能确定是拿一台主机的哪一个进程。

对于基于这种ip+端口的通信方式我们就就做socket。

那么端口号与进程id有什么区别呢?

首先不是所有的进程都需要网络通信(但是要有),但是进程必须要有进程id。

一个进程可以被多个端口号绑定,但是一个端口号不能被多个进程绑定。

认识协议

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

网络字节序

对于存储空间是由高低地址之分,高地址放在起始字节就是大端,低地址放在起始字节就是小端。我们已经知道, 内存中的多字节数据相对于内存地址有大端和小端之分 , 磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端之分,。
网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢。
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出 ;
接收主机把从网络上接到的字节依次保存在接收缓冲区中, 也是按内存地址从低到高的顺序保存 ; 因此, 网络数据流的地址应这样规定 : 先发出的数据是低地址 , 后发出的数据是高地址 .
TCP/IP 协议规定 , 网络数据流应采用大端字节序 , 即低地址高字节 .
不管这台主机是大端机还是小端机 , 都会按照这个 TCP/IP 规定的网络字节序来发送 / 接收数据 ;
如果当前发送主机是小端 , 就需要先将数据转成大端 ; 否则就忽略 , 直接发送即可

口诀:小权值(数据的低位)放低地址就是小端 ,剩下的都是大端。

为使网络程序具有可移植性 , 使同样的 C 代码在大端和小端计算机上编译后都能正常运行 , 可以调用以下库函数做网络 字节序和主机字节序的转换。

socket接口

socket的接口也有许多,不过在此之前,我们先了解一下 struct addsocket* (套接字结构体)这个结构体。

套接字的种类有许多:域间套接字,网络套接字,原始套接字。这里我们主要学网络套接字就行。

虽然套接字有三种,但是接口是只有一套的,通过判断参数的种类,判断执行套接字对应的代码。

// 创建 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);

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

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

相关文章

【AI+CAD】(二)LLM和VLM生成结构化数据结构(PPT/CAD/DXF)

当前LLM和VLM在PPT生成任务上已经小有成效,如ChatPPT。 @TOC 1. PPT-LLM LLM根据用户的instruction生成规范的绘制ppt的API语句:即使是最强的GPT-4 + CoT也只能达到20-30%的内容准确度。 LLM输入:User_instruction(当前+过去)、PPT_content、PPT_reader_API。其中 PPT_rea…

文心一言 VS 讯飞星火 VS chatgpt (215)-- 算法导论16.2 2题

二、设计动态规划算法求解 0-1 背包问题,要求运行时间为 O(nW),n为商品数量,W是小偷能放进背包的最大商品总重量。如果要写代码,请用go语言。 文心一言: 0-1 背包问题是一个典型的动态规划问题,其目标是在…

Supervisor,一个超酷的 Python 库!

大家好,今天为大家分享一个超酷的 Python 库 - supervisor。 Github地址:https://github.com/Supervisor/supervisor 在大型项目中,经常需要管理多个进程,确保它们能够稳定运行并协同工作。Python提供了许多工具和库来帮助实现进…

使用Minio搭建文件服务器

Minio是一个开源的对象存储服务器,可以用来存储和管理大规模的数据。我们可以用它来存储图片或者视频资源。 minio和阿里云(腾讯云、百度云等)oss对比 托管方式:MinIO 是一个开源的对象存储系统,可以在自己的服务器或…

记录Mysql主从复制-读写分离原理

在实际生产环境中,一台MySQL服务器同时对数据库读写,往往满足不了高并发的需求,因此我们可以使用主从复制的方式来实现数据同步,再通过读写分离的手段提高MySQL并发负载能力。 MySQL主从复制原理 如图: (1…

C语言例3-18:使用关系表达式的例子

关系表达式的一般形式&#xff1a; 表达式 关系运算符 表达式 最初代码如下&#xff1a; #include<stdio.h> int main(void) {int i3,j4,k5;float f11.0, f22.1;char c1a, c2d; //a(97) d(100)printf("i>j 的结果为&#xff1a…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统&#xff1a;病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今&#xff0c;大数据、云计算、移动…

中霖教育:考注册会计师报班能提高通过率吗?

CPA考试涵盖了会计、审计、税法及相关的知识,这些知识点不仅繁多而且专业性强&#xff0c;对于自学能力较弱或时间不足的考生来说&#xff0c;有一定的挑战性。在这种情况下&#xff0c;报班提供了系统化和结构化的学习方案&#xff0c;有助于考生更快地掌握考点和难点。 经验…

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测 目录 分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM分类&#xff0…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…

1997-2022年各省市场化指数及分项指数(初始数据+计算代码+结果)

1997-2022年各省市场化指数及分项指数&#xff08;初始数据计算代码结果&#xff09; 1、时间&#xff1a;1997-2022年 2、来源&#xff1a;2019年之前的数据来源于市场化指数报告&#xff0c;其中2020年之后的数据根据历年数据拓展所得 3、指标&#xff1a;province、year、…

【办公类-40-01】20240311 用Python将MP4转MP3提取音频 (家长会系列一)

作品展示&#xff1a; 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;除了大量照片视频&#xff0c;还需要一个时间很长的背景音乐MP3 一、下载“歌曲串烧” 装一个IDM 下载三个“串烧音乐MP4”。 代码展示 家长会背景音乐: 歌曲串…

Windows 安装 Ubuntu 子系统

大约是22年的时候&#xff0c;开始玩这个windows的子系统&#xff0c;当时安装比较顺利。最近也是想看看linux&#xff0c;就在新电脑上装了个ubuntu&#xff0c;记录安装过程。 1.Microsoft Store 搜索 ubuntu&#xff0c;先看评价&#xff1a;很多报错&#xff0c;先不要慌 2…

C语言——动态内存分配

前言&#xff1a;通过前面的学习&#xff0c;我们知道C语言中在内存中开辟空间的方法有&#xff1a;变量和数组。既然拥有了开辟空间的方法&#xff0c;我们为什么还要学习动态内存分配呢&#xff1f; int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…

AI探索实践16 - Typescript开发AI应用8:为大模型增加记忆(Memory)

大家好&#xff0c;我是feng&#xff0c;欢迎关注公众号和我一起探索。如果文章对你有所启发&#xff0c;请为我点赞、转发以及在下方留言自己的理解&#xff01; 每次发文章都看到不少人收藏。我自己也有这个习惯&#xff0c;但是基本上收藏起来的东西都没再打开过。哪怕再遇到…

Vite为什么比Webpack快

一、引言 主流的前端构建工具包括以下几种&#xff1a; Webpack&#xff1a;当下最热门的前端资源模块化管理和打包工具。它能够将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。同时&#xff0c;Webpack还支持代码分割&#xff0c;可以按需加载模块&#…

普林斯顿算法讲义(四)

原文&#xff1a;普林斯顿大学算法课程 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 6.1 事件驱动模拟 原文&#xff1a;algs4.cs.princeton.edu/61event 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 本章节正在建设中。 根据弹性碰撞的法则使用事件驱动…

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ 二、Keil使用问题 1、打开一个…

中宣部防沉迷系统PHP版本(管局防沉迷验证-PHP-全版本-接口测试样例)

现在对接游戏&#xff0c;无论是登录还是支付都是要去对接防沉迷实名认证接口&#xff0c;但前期的话你要登录网络游戏防沉迷实名认证系统进行接口测试&#xff0c;$appid &#xff0c;$bizId&#xff0c;$key去接口测试页面找&#xff08;正式上线在密钥管理&#xff09;&…

2024.3.14

1、成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream>using namespace std;class Team {friend const Team operator-(const Team &t1, const Team &t2); private:int a;int b; public:Team(){}Team(int a, int b):a(a…