【Linux网络编程二】网络基础2(网络框架)

【Linux网络编程二】网络基础2(网络框架)

  • 一.数据如何跨网络传输
    • 1.源ip和目的ip
    • 2.路由器的使命
    • 3.Mac地址的使命
  • 二.网络通信的本质
  • 三.端口号
    • 1.存在意义
    • 2.实现原理
  • 四.认识协议
    • 1.TCP协议
    • 2.UDP协议
  • 五.网络字节序
  • 六.通用网络接口

一.数据如何跨网络传输

在上一篇网络基础中,理解了在局域网下两台主机是如何通信,进行数据的传输的。
在同一个局域网下,两台主机是可以直接通信的,那么如果在不同的局域网下,两台主机该如何通信呢?也就是在跨网络情况下,数据是如何传输的呢?

1.前提知识①:跨网络的主机之间的文件传输,数据从一台计算机到另一台计算机传输的过程中,必须要经过一个或多个路由器!
2.也就是要将数据发送给其他局域网下的一台主机,需要先将数据传输给路由器。再由路由器转发给另一台主机。原因:因为另一台主机的ip地址不是属于当前局域网,是其他子网的,所以必须通过路由器。
3.前提知识②:路由器也是当前局域网下的一台主机,普通机子。
4.所以把数据交给路由器,本质也是在局域网下通信!
因为路由器就是局域网下的一台主机。
在这里插入图片描述

在这里插入图片描述
网络通信核心就是贯穿协议栈,数据从应用层封装报头到达传输层,再封装到达网络层,在该层,封装的报头里会存储目的本机ip地址和目的ip地址,最后封装报头到达数据链路层,然后通过以太网发送到网络中。在该局域网下的所有主机都会接收到消息,但只有路由器能接收到。

因为在该层会分析报文里的目的ip是否是子网内的,如果不是子网内部的,就需要跨网络。就将数据传给路由器。

因为路由器就是一台主机,它是位于网络层的,所以它底层也具有数据链路层,可以接收其他主机发送的消息。

所以在数据链路层会分离报头,解析报文,根据报文里的目的ip是否需要跨网络,来决定传递的是对端主机还是路由器。如果目的ip是本子网内的那么是发送给对端主机,如果不是本子网的ip那么就是发送给路由器。

路由器在网络层就接收到了报文,并且检测到报头里的目的ip,发现是发送给C局域网里的一台主机,所有它就将报文往下交付,重新封装C域网里的协议报头。

然后属于C局域网的目的主机在数据链路层就会接收到报文。分离报头,解析报文,发现是发送给自己的,就会将有效载荷往上层发送,最后发送给上层应用。

注意,不同局域网中,底层的协议可能是不一样的,比如A局域网在数据链路层使用的是以太网协议,而C局域网在数据链路层使用的是令牌环网。但在跨网络通信中,是不影响的。因为路由器帮它们做了转换。

1.源ip和目的ip

在这里插入图片描述
ip地址可以标识一台主机的唯一性,所以通过ip地址就可以定位到主机位置,所以两个ip地址就可以形成一个路径,一个为源ip地址,一个为目的ip地址。

2.路由器的使命

在这里插入图片描述
所以路由器可以屏蔽底层网络的差异化,不管底层网络采用的是什么类型的协议都可以实现通信,因为它会帮我们重新封装报头。

3.Mac地址的使命

在这里插入图片描述

认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可
能会冲突; 也有些网卡支持用户配置mac地址).

二.网络通信的本质

在这里插入图片描述
网络通信时,到底是谁在通信?是双方的主机在进行通信吗?
并不是!而是双方主机上的应用层的各自应用在通信。
而各自的应用都是由进程控制的,也就是要使用应用层软件,需要先启动这些软件,也就是启动进程。
在这里插入图片描述

所以网络通信的本质就是进程间通信!
而进程间通信需要看到同一份资源,这份资源是什么呢?
它就是网络!让不同的主机看到相同的资源。每台主机都可以使用网络。
在这里插入图片描述

三.端口号

在这里插入图片描述
端口号是标识一台主机应用层上的各种应用的,而每一个应用本质就是进程,所以端口号是用来标识应用层上的各种进程的。
一旦知道端口号后,就知道要将数据发给哪个应用(进程)。
所以在传输层封装报头时,会将发送方进程的端口号和接收方进程的端口号存储,这样在对端主机的传输层就知道要将有效载荷发送给哪个进程。并且对端主机也知道是本主机哪个进程发送给它的。

1.存在意义

在这里插入图片描述
网络通信本质就是进程通信,而进程通信,你首先需要知道是哪两个进程在通信,如何找到这两个进程呢?
因为ip地址可以标识唯一的主机,而端口号可以标识一台主机上的唯一应用进程。所以通信进程=ip+port;

所以ip+port这种方式就可以标识全网唯一的一个进程。
这种方式被称为socket(套接字)

所以只有知道进程的ip和端口号。才可以进行通信。
所以在封装报头时,会将对方进程的ip和port和自己的ip和por存储在报头里。这样就可以找到对方的进程。也可以让对方的进程找到我自己。

【存在疑惑】为什么用端口号来唯一标识进程?每一个进程不是有pid吗?它不也是唯一标识进程的吗,为什么不适应pid来标识?
在这里插入图片描述

2.实现原理

每一个进程在网络通信之前,都需要绑定一个端口号。
这个端口号是能够唯一标识该进程的。
绑定端口号的本质:就是随机生成一个端口号,或者你设置一个数字,经过哈希运算,放入哈希表里,如果哈希表里存在元素,则绑定失败,需要重新绑定别的端口号。如果哈希表里没有元素,就将该进程的pid存放进去,通过pid就可以找到进程。
所以在我们的应用层,进程想要通信需要先绑定端口号,而进程绑定端口号,就是将进程的pid绑定到哈希表里。
在这里插入图片描述

当对端主机的传输层接收到一个报文,就会根据该报文里的目的端口号,进行哈希运算,找到哈希表里的进程,就找到了应用。

补充:这里是引用在这里插入图片描述

四.认识协议

TCP和UDP都是属于传输层的协议,是将在传输层的数据发送给上层应用。或者接收上层应用发送来的数据。
在这里插入图片描述

1.TCP协议

在这里插入图片描述

2.UDP协议

在这里插入图片描述

TCP相比较UDP是可靠的,但这不是说UDP传输不可靠,最好不要使用UDP等。可靠是相对的而言的,传输过程中肯定会存在丢失情况。而TCP是花了大代价建立管道,才保证了可靠传输的,所以维护成本要比UDP高的多,而UDP维护成本低,使用简单。
在这里插入图片描述

五.网络字节序

因为不同的主机上存在着大端存储和小段存储两种存储序列。网络通信我们要求统一序列,这样才能正常通信,不然一台主机是大端机器,一台主机是小段机器,那么注定一台机器发送的消息,另一台机器是看不懂的或者不准确的。

所以数据在网络中传输时,要求是按照统一的字节序,在传输层TCP/IP协议中就规定,网络数据流全部采用的是大端字节序。

不管主机是大端机还是小端机,都要使用大端字节序来网络传输,如果是大端机那么可以直接传输,如果是小端机,需要先转换成大端字节序才可以进行传输。

在网络中传输的数据都需要按照网络字节序来进行传输。
在这里插入图片描述
而系统也为我们提供了一系列便捷的系统调用接口来转换字节序列。
可以让主机序列转换成网络序列,也可以让网络序列转换成主机序列。

在这里插入图片描述

六.通用网络接口

网络编程的种类具有多种,分为域间套接字编程,原始套接字编程,网络套接字编程,三种套接字编程。

域间套接字编程是用于同一台机器上的网络通信。
原始套接字编程主要用户网络工具。
网络套接字编程才是用于用户简单网络通信。
在这里插入图片描述

系统想让网络接口统一抽象化。这就要求这个网络接口的参数类型必须是统一的。

这几种套接字结构体对开头都是16位地址,这个地址就是代表着你是什么类型的编程,AF_INET就代表是网络通信,AF_UNIX就代表是域间通信,所以我们就可以封装一个统一的结构体对象,这个结构体对象开头也是16位地址,用来判断是什么类型的套接字编程。

所以系统就封装了一个统一的函数接口,该接口需要的是一个统一的结构体对象,通过判断该结构体对象的前16位地址来判断是什么类型的编程。然后直接就使用该类型的套接字编程。
在这里插入图片描述
在这里插入图片描述
虽然使用的是统一接口,参数都要求是sockaddr结构类型,但是你要使用什么类型套接字,还是定义该类型的结构体对象,在调用接口时,只需要强转成统一接口的指针类型即可。

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

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

相关文章

【算法与数据结构】718、1143、1035、392、115、LeetCode最长重复子数组+最长公共子序列+不相交的线+判断子序列+不同的子序列

文章目录 一、718、最长重复子数组二、1143、最长公共子序列三、1035、不相交的线四、392、判断子序列五、115、不同的子序列六、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、718、最长重复子数组 思路分析&#xff1…

问题:下列哪些属于历史文化资源的特征( ). #学习方法#学习方法

问题:下列哪些属于历史文化资源的特征( ). A、稀缺性 B、脆弱性 C、可再生性 D、多样性 参考答案如图所示

C语言函数递归详解

递归是什么&#xff1f; 递归&#xff0c;顾名思义&#xff0c;就是递推和回归。 递归是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main…

如何部署Linux AMH服务器管理面板并结合内网穿透远程访问

文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管…

复旦大学NLP团队发布86页大模型Agent综述

复旦大学自然语言处理团队&#xff08;FudanNLP&#xff09;发布了一篇长达86页的综述论文&#xff0c;探讨了基于大型语言模型的智能代理的现状和未来。该论文从AI Agent的历史出发&#xff0c;全面梳理了基于大型语言模型的智能代理现状&#xff0c;包括LLM-based Agent的背景…

优秀学习网站推荐-第一辑

原文地址&#xff1a;https://jaune162.blog/2024/02/15/study-website-recommend Developer Roadmaps&#xff08;开发者路线图&#xff09; 官网地址&#xff1a;https://roadmap.sh/ 该网站包含了各个方向、各个语言的开发人员从零开始学习的路线图。 下图为Java方向的学…

Jenkins配置http请求github,发布release

学无止境&#xff0c;气有浩然&#xff01; Jenkins配置http请求github&#xff0c;发布release 前言Jenkins配置github配置在这里插入图片描述 打完收工! 前言 工作中进行了github迁移&#xff0c;原先的gitlab中配置的Jenkins的CI/CD步骤需要发布到Github发布release版本&am…

2024年人工智能可以报考的证书有哪些

人工智能&#xff08;AI&#xff09;是致力于解决通常与人类智能相关联的认知性问题的计算机科学领域&#xff0c;这些问题包括学习、创造和图像识别等。现代组织从各种来源收集大量数据&#xff0c;例如智能传感器、人工生成的内容、监控工具和系统日志。人工智能的目标是创建…

LeetCode:292.Nim 游戏

大一开学到现在&#xff0c;我不禁思考一个问题&#xff1a;代码重要吗&#xff1f; 我的答案是&#xff0c;根本不重要&#xff0c;或者说&#xff0c;是次要的。我认为分析问题&#xff0c;和画图是写题的开始&#xff0c;方法的学习&#xff0c;和灵活运用是目的。代码从来…

贪心算法篇2

“星辰野草&#xff0c;造出无边的天地~” 最⻓递增⼦序列 (1) 题目解析 (2) 算法原理 class Solution { public:int lengthOfLIS(vector<int>& nums) {// 使用dp int n nums.size(), ret 1;// 初始化为1vector<int> dp(n1,1);// 从第二个位置…

Spring速成(二)

Spring速成&#xff08;二&#xff09; 掌握IOC/DI配置管理第三方bean掌握IOC/DI的注解开发掌握IOC/DI注解管理第三方bean完成Spring与Mybatis及Junit的整合开发 1&#xff0c;IOC/DI配置管理第三方bean 1.1 案例:数据源对象管理 1.1.1 环境准备 学习之前&#xff0c;先来准…

LFU缓存(Leetcode460)

例题&#xff1a; 分析&#xff1a; 这道题可以用两个哈希表来实现&#xff0c;一个hash表&#xff08;kvMap&#xff09;用来存储节点&#xff0c;另一个hash表&#xff08;freqMap&#xff09;用来存储双向链表&#xff0c;链表的头节点代表最近使用的元素&#xff0c;离头节…

Deepin系统安装x11vnc远程桌面工具实现无公网ip访问本地桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

Spring Boot整合MyBatis Plus实现基本CRUD与高级功能

文章目录 1. 引言2. 项目搭建与依赖配置2.1 添加MyBatis Plus依赖2.2 配置数据源与MyBatis Plus 3. 实现基本CRUD功能3.1 创建实体类3.2 创建Mapper接口3.3 实现Service层3.4 控制器实现 4. 高级功能实现4.1 自动填充功能4.2 乐观锁功能4.3 逻辑删除功能 5. 拓展&#xff1a;My…

构造回文数组

目录 原题描述&#xff1a; 题目描述 时间&#xff1a;1s 空间&#xff1a;256M 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例1输入&#xff1a; 样例1输出&#xff1a; 样例2输入&#xff1a; 样例2输出&#xff1a; 约定&#xff1a; 作…

ubantu扩容解决 sudo -i 报无法识别

GParted给ubuntu系统磁盘resize大小时候出现cannot resize read-only file system解决办法_gparted无法调整分区大小-CSDN博客https://blog.csdn.net/ningmengzhihe/article/details/127295333?spm1001.2014.3001.5506 解决磁盘挂载系统目录出现问题&#xff1a; 1、sudo -i…

【HarmonyOS应用开发】后台提醒(十六)

简述 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c;希望在指定时间点提醒用户有优惠活动。为满足此类业务诉求&#xf…

C语言-分支和循环语句

目录 分支语句 if语句 关系操作符&#xff1a; 逻辑操作符&#xff1a; switch语句 循环语句 while循环 for循环 ​编辑 循环控制语句&#xff08;break&#xff0c;continue&#xff09; goto语句充当循环 分支语句 if语句 if语句的括号内需要写条件表达式&#xff0c;通…

超多制作模板的姓氏头像生成器微信小程序源码

超多制作模板的姓氏头像生成器微信小程序源码&#xff0c;这是一款姓氏头像制作小工具&#xff0c;内含丰富多样的模板提供制作。 以前的基本是固定位置生成&#xff0c;这款制作支持拖拽调整位置&#xff0c;自定义颜色&#xff0c;阴影等等。

探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言&#xff1a;探索简化之路 一、起源和演变 二、场景案例分析 2.1 不用模式实现&#xff1a;用一坨坨代码实现 2.2 问题 2.3 外观模式重构代码 定义 界面 接口 利用外观模式解决问题步骤 外观模式结构和说明 重构…