Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。

1、网络的早期发展历程

20世纪50年代

在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处理,形成了第一代的以单主机为中心的联机终端系统。这种系统的特点是所有终端共享主机资源,但线路利用率低,主机效率也较低。

20世纪60年代

1960年代,网络技术开始快速发展。1969年,美国国防部高级研究计划署(ARPA)的前身ARPAnet投入使用,标志着现代计算机网络的诞生。ARPAnet最初主要用于军事研究目的,其技术上的重大贡献包括TCP/IP协议簇的开发和利用。ARPAnet的试验奠定了Internet存在和发展的基础12。

20世纪70年代至80年代

1983年,ARPAnet分裂为两部分,ARPAnet和纯军事用的MILNET。同时,局域网和广域网的产生和发展对Internet的进一步发展起了重要作用。其中,美国国家科学基金会(NSF)建立的NSFnet在全美国建立了按地区划分的计算机广域网,并将这些地区网络和超级计算机中心互联起来。

20世纪90年代至21世纪初

进入90年代,随着浏览器和万维网的出现,互联网开始真正普及。人们可以通过浏览器浏览网页、获取信息、购物等。此后,互联网的发展经历了商业化阶段和普及化阶段,越来越多的商业公司开始利用互联网提供服务和产品。随着智能手机和平板电脑的普及,互联网进一步向移动化发展。

2、认识一下协议

<1>基本概念

在网络诞生前,计算机主要用于计算数据,科学家使用计算机进行数据传输时,都采用类似软盘的方式进行传输。随着时代的发展,这种低效的传输方式被淘汰,出现了网络。但是早期的网络都是被各大高校和实验室开发出来,这种网络在传输数据的方式都有所不同,为了节约通信成本,各大高校和知名企业联合在一起决定一些协议,也就约定网络传输的一些规则与标准。所以,其实协议就是一种约定。

<2>网络分层结构 -- 网络 和 OS之间的关系

1、软件分层

在我们日常编写软件的过程中,分层其实是非常常见的一种做法,就比我们的操作系统,在操作系统的上层还有系统调用,在系统调用的上层就是应用层。这种分层的方式能够解决许多的问题,这种分层的方式是松耦合的,可以随时替换代码或维护。

 2、网络分层

<1>为什么存在网络以及带来的问题

网络的存在本质上就是为了解决远距离的通信问题,降低通信的成本。现在的计算机可能不同的部件分布在全国各地,这就会带来新的一些问题。比如:1、如何使用数据的问题 2、可靠性的问题3、主机的定位问题4、数据报的局域网转发问题等。

<2>解决方案

为了解决上面的问题,就有人提出了网络协议的方案,比较著名的就是tcp/ip协议。我们该怎么评判这种解决方案的好坏呢?这就要看这些协议是否是可拓展、是否方便维护。而其中分层设计就能很好地满足这种要求,所以这也是网络协议分层的原因。

<3>OSI七模型层

1. 物理层(Physical Layer)

  • 具体作用
    • 在物理媒体上发送和接收比特流(0和1)。
    • 定义电压、接口的物理形状、引脚分配等。
  • 具体功能
    • 信号编码(如曼彻斯特编码、差分曼彻斯特编码)。
    • 信号传输媒介(双绞线、同轴电缆、光纤)。
    • 物理拓扑结构(星型、总线型、环形)。

2. 数据链路层(Data Link Layer)

  • 具体作用
    • 在相邻节点之间提供可靠的数据传输。
    • 处理由物理层提供的原始比特流。
  • 具体功能
    • 帧的封装(添加首部和尾部)。
    • 差错检测(如循环冗余检测CRC)和纠正。
    • 流量控制(如滑动窗口协议)。
    • 访问控制(如CSMA/CD、令牌传递)。

3. 网络层(Network Layer)

  • 具体作用
    • 负责数据包从源主机到目的主机的传输。
    • 路由选择,确定最佳路径。
  • 具体功能
    • 路由算法(如距离向量算法、链路状态算法)。
    • 数据包转发。
    • IP地址分配和寻址。
    • 拥塞控制。

4. 传输层(Transport Layer)

  • 具体作用
    • 确保数据的端到端可靠传输。
    • 为应用层提供端口号服务。
  • 具体功能
    • 端到端连接的建立与终止(如TCP的三次握手)。
    • 数据分段与重组。
    • 流量控制(如TCP的滑动窗口)。
    • 错误恢复(如TCP的超时重传)。

5. 会话层(Session Layer)

  • 具体作用
    • 管理会话的建立、维护和终止。
    • 同步不同应用程序之间的对话。
  • 具体功能
    • 会话管理(如会话检查点、恢复)。
    • 同步(如数据同步、会话同步)。

6. 表示层(Presentation Layer)

  • 具体作用
    • 确保数据在网络中传输前后的表示格式是一致的。
    • 处理数据的加密和解密。
  • 具体功能
    • 数据加密和解密。
    • 数据压缩和解压缩。
    • 数据格式转换(如不同字符集之间的转换)。

7. 应用层(Application Layer)

  • 具体作用
    • 为用户提供网络服务。
    • 实现网络应用程序。
  • 具体功能
    • 文件传输(如FTP)。
    • 电子邮件(如SMTP)。
    • 网页浏览(如HTTP)。
    • 域名解析(如DNS)。

为了解决上述的一些问题,就有人提出OSI七层模型。虽然这里网络协议被分成了7层,但实际上我们在实际应用时,上三层被合成了一层应用层。(如下图)

与操作系统的关系

在物理层,与网络相关的硬件结构就是网卡,网卡的驱动程序就是数据链路层。需要特别注意的是,传输层和网络层是操作系统内部源代码的一部分,说明操作系统自己也会实现网络的相关功能。同时在应用层系统也会提供相关的网络接口,供上层开发网络程序。为了方便网络接口的使用,有人对系统提供的网络方面的系统调用进行封装,形成网络库。

无论是window,linux还是其他的操作系统,只要想要入网,就必须遵守这些网络协议。这也就是各个操作系统之间能够通信的原因。

<4>语言层面,理解协议

上文对协议进行了简单描述,为了更直接对这些协议进行理解,下面用张图来对协议进行简单理解。

在实际的传输过程中,我们是以报文的方式来对数据进行传输,其中这些数据肯定是要以结构化数据进行传输(操作系统基本就是使用C语言进行编写的,这里结构化数据一般就是结构体),如何让两边都认识对方发送的结构化数据呢?那就是协议的功劳了,协议会规定相同的结构体格式,这时通信双方就都能够认识对方数据了。

3、网络传输

<1>局域网传输过程

假设在一个局域网下,有多台主机,其中主机A和主机D之间需要通信。那么这两个主机之间能否之间通信吗?能。主机A会在局域网中发送数据,其中所有的主机都会接受到该信息,但是由于该信息是发送给主机D的,所以其他主机都不会处理这消息。而Mac地址就是在同一局域网下每台主机的唯一标识,就和我们的名字一样,主机A发送的消息中就包含了目标主机的Mac地址,这也是以太网通信的原理。

在局域网中主机A发送消息时,如果有其他主机一起发消息,主机A就会对消息进行检测碰撞与避免碰撞,其他主机同理。如果同时发送消息的主机多了,局域网中的消息就会发生碰撞。所以当我们想要干扰局域网通信时,只要向局域网中不断发送垃圾数据。为了避免这种数据碰撞的局面,当需要发送数据的主机检测到碰撞时,一般会先等待碰撞域(局域网)中的数据减少以后再发。所以在一个局域网中,主机当然是越少越好(这就和我们上课时,一个班的人越少越好,每个人说的话也更能听清)

同时我们也可以在任一时刻只让一台主机发送消息,此时我们也可以将局域网看成一种临界资源。这也是令牌环网的大致工作原理,而令牌环网中有一张令牌,这相当于我们保护临界资源的锁。

<2>协议层面的传输

当我们在协议层面传输报头,是自顶向下传输的,其中在应用层输入消息,想要发送给另一台主机,我们就必须让消息从应用层开始,向下传输到链路层,再经过底层的网卡发送消息。其中需要发送消息的主机在每经过一层协议时,都会在发送的消息前加上一个对应的协议报头。其中,需要发送的消息中除了协议报头,其余部分,我们就称为有效载荷。从应用层不断向下加报头的过程,我们就称为封装。而在接受方,主机收到消息后,依次向上去掉协议的报头,这个我们称为解包。

这里消息就是报文,报文 = 协议报头 + 有效载荷。 应用层的报文一般叫请求或应答,传输层的包头一般叫数据段,网络层的报文一般叫数据报,链路层的报文我们一般称为数据帧。

怎么理解协议报头呢?举个生活中的例子,现在我买了一双鞋,但是我收到快递时,收到的却是一个鞋盒,鞋盒上记录了卖家和买家的基本信息。这个信息并不是给买家和卖家看的,而是给快递公司看的,所以这里鞋盒就相当于报头。在计算机中,这些报头其实就是标明消息要传输给哪一个主机,以及特定协议层中的哪一个协议(其实每一层协议栈都包含了很多的协议)。当接收方接受到报文时,会将链路层的报头与报文进行分离,链路层会解析报头的数据,决定传给网络层的哪个协议,不断重复,直至应用层取到需要的数据(这个过程我们称为分用)。

小结:任何的协议,都要有让报头与有效载荷的分离的能力,并且要有分用的能力。

 <3>跨局域网数据传输

当我们需要跨局域网进行传送数据时,此时我们就需要使用到路由器这个设备了。路由器一般是要横跨两个网络的。用户A将数据自顶向下传递到数据链路层后,数据链路层会将报文发送路由器,路由器会对报文解包后,再分用封装发送给目标主机所在的局域网当中。

具体过程:

 在介绍具体发送过程前,我们首先需要了解一些前置知识。当我们的IP报文被传递到链路层时,链路层会在报文前加上链路层报头。其中报文中就包含了两套地址,一套是最终的目的地和源头,也就是目的IP地址和源IP地址,另一套地址是当前所处机器的Mac地址和需要经过的下一台主机的Mac地址。需要注意的目的IP和源IP是一定不会变的,这就和我们平常定的目标一样,而Mac地址就像我们为了完成目标,途中指定的阶段性计划。一旦目标变了,日常的计划也就变了。

IP地址一般标识形式是点分十进制, 具体格式就是 XXX.XXX.XXX.XXX 。大小为32字节,公网使用的IPv4,国内大部分使用的也是IPv4,IPv6是另外一种IP协议报文。

当用户A的底层数据将链路层报文发送以后,路由器会收到用户A发来的报文,然后会对报文进行解包,解包后重新对其进行封装,不过需要注意的是,此次封装是在另一种局域网当中。封装以后经由网卡发送以后,用户B接受到报文后对报文进行层层解包后就可以拿到数据。在我们日常生活中,一条数据从用户A发送用户B可能会经过很多的路由器,期间会经历很多的局域网,其中各种局域网的传输方式可能不同,但是IP地址却一直没有变化,这种采用IP地址标明用户的方式屏蔽了底层局域网的差异,是一种很好的网络虚拟化技术。IP层协议往上的协议都一样,IP层协议往下的局域网差异被路由器解决,所以我们在网络上只讨论IP协议。

以上就是所有内容,本文不具体介绍计算机网络的相关知识,只是帮助大家构建相关的概念,方便后续理解,以上就是所有的内容,文中如有不对之处,还望各位大佬指正,谢谢!!!

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

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

相关文章

关于CSS 案例_新闻内容展示

新闻要求 标题:居中加粗发布日期: 右对齐分割线: 提示, 可以使用 hr 标签正文/段落: 左侧缩进插图: 居中显示 展示效果 审核过不了&#xff0c;内容没填大家将就着看吧。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…

C语言:预编译过程的剖析

目录 一.预定义符号和#define定义常量 二.#define定义宏 三.宏和函数的对比 四、#和##运算符 五、条件编译 在之前&#xff0c;我们已经介绍了.c文件在运行的过程图解&#xff0c;大的方面要经过两个方面。 一、翻译环境 1.预处理&#xff08;预编译&#xff09; 2.编译 3…

【网络安全】Cookie与ID未强绑定导致账户接管

未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性&#xff1a; Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;作为缓存&#xff0c;在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据&#xff0c;通过一系列的数据结构。MySQL主要是通…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

Redis:list类型

Redis&#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构&#xff0c;Redis也做出了相应的支持。 如图&#xff…

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

基于SpringBoot+Vue的网约车管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架&#xff0c;适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档&#xff0c;使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

[C语言]第十一节 函数递归一基础知识到高级技巧的全景探索

目录 11.1. 递归是什么&#xff1f; 11.1.1 递归的思想&#xff1a; 11.2 递归的限制条件 举例1&#xff1a;求n的阶乘 画图推演 举例2&#xff1a;顺序打印⼀个整数的每⼀位 画图推演 11.3. 递归与迭代 举例3&#xff1a;求第n个斐波那契数 11.1. 递归是什么&#xff…