【Linux】网络新兵连

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

引言

在上一篇博客中,我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容,那么我们开始吧!

1.网络中的地址管理

大家一定知道每一台主机都会存在一个ip地址,其实并不是这么简单,今天我们就来系统介绍一下。

1.1ip地址

IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4。IPv6其实是针对IPv4地址不足提出的解决方案,目前世界上IPV6做的比较好的国家就是我们。

  • IP地址是在IP协议中, 用来标识网络中不同主机的地址;具有唯一性。
  • 对于IPv4来说, IP地址是一个4字节, 32位的整数;
  • 对于IPv6来说,IP地址是一个16个字节,128位的整数。
  • 我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
1.1.1源IP和目的IP

在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址,用来表示这个数据是从哪台主机发出来的,要发给哪一台主机。

1.2MAC地址

每一台连入网路的设备都必须需要网卡,每一张网卡在出厂时都有一个唯一性的编号,这个标号就是MAC地址。MAC同样具有全网内唯一性,通常用于处于局域网中主机之间相互通信。

MAC地址长度为6个字节,48个比特位。一般用16进制加上冒号的形式来表示,例如:
08:00:27:33:fd:45。

1.3两套地址体系的区别

在Linux下查看ip地址和MAC地址的命令为:

[user@VM-8-5-centos ~]$ ifconfig

在这里插入图片描述

在这张图片中,展示的是Linux系统下通过ifconfig命令查看的网络配置信息,特别是关于以太网接口eth0的详细配置。接下来,我们分析一下这些内容:

  1. 以太网接口eth0:

    • 状态标志(flags): 4163<UP,BROADCAST,RUNNING,MULTICAST> 表示该接口已启用(UP)、支持广播(BROADCAST)、正在运行(RUNNING)以及支持多播(MULTICAST)。
    • MTU(最小传输单元): mtu 1500 表示该接口的最大传输单元为1500字节,这是以太网的标准MTU值。
    • IPv4地址和子网掩码: inet 10.0.8.5 netmask 255.255.252.0 表示该接口的IPv4地址是10.0.8.5,子网掩码是255.255.252.0,用于确定IP地址的网络部分和主机部分。
    • 广播地址: broadcast 10.0.11.25 是该网络中的广播地址,用于向同一子网内的所有设备发送数据包。
    • IPv6地址和前缀长度: inet6 fe80::5054:ff:fe35:3d28 prefixlen 64 scopeid 0x20< 表示该接口还配置了一个IPv6的链路本地地址,前缀长度为64位。注意这里文本被截断,但基本意思是明确的。
    • MAC地址: ether 52:54:00:35:3d:28 是该接口的物理地址,也称为MAC地址,用于在链路层唯一标识网络接口。
  2. 接收(RX)和发送(TX)统计:

    • 显示了接口接收和发送的数据包数量、字节数以及相关的错误统计(如错误、丢弃、溢出等),这些信息对于诊断网络性能问题非常有用。
  3. 环回接口(lo):

    • lo 是环回接口,用于本机内部通信。它也有自己的IPv4和IPv6地址(127.0.0.1和::1),以及相应的接收和发送统计。

错误消息:

  • 图片中并未直接显示明显的错误消息,但提到了“RX errors 0 dropped 0 overruns 0 frame 0”和“TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0”,这些值都为0,表示在接收和发送过程中没有遇到错误、丢弃、溢出、帧错误、传输错误、丢弃、溢出、载波丢失或冲突。
    接下来,张三又上场了。张三买了一辆自行车,他想挑战一下自己,所以他觉定骑车从北京到上海。如图:
    在这里插入图片描述
    北京是起点,上海是终点。从北京到上海沿途要经过很过地方,例如天津。
    假如张三途中经过了天津,然后然后不知道该往哪个方向走了,边找个一个当地人说:“你好,我从北京来,要骑自行车去上海,来到了咱们这里,不知道该怎么走了,你可以帮帮我吗?”。这个当当地人便热情的对张三说:“你应该继续往西走,然后二十公里处,你再找人问问”。就这样张三又继续向西走了二十公里。然后又找了一个人问路,路人得知他要去上海,从西边来,就告诉他应该转弯向南走。
    张三口中有几套地址呢?
  • 从哪来,到哪去。到哪去是终极目标,就是目的IP。从哪来是源IP。:为我们未来的每个阶段提供方向目标,方便路径选择。IP地址提供的是方向选择。
  • 上一站从哪来,下一站到哪去。张三每到一处,这个地址就会发生变化。像这种从一个节点,跳转到下一个相邻的节点的地址,我们称之为MAC地址。

在这里插入图片描述
如图所示,跨网络数据进行传输时,需要路由器。所以路由器必须要同时连接两个甚至多个局域网。数据该往哪个方向传输由IP地址决定。但是数据在长距离传输的过程中会经过多个路由节点,相邻路由节点的选择由MAC地址决定。

2.端口号

IP(公网IP)地址决定网络中主机的唯一性。但是仅仅需要IP地址就可以实现数据的传输吗?
打开快手刷视频时,为什么视频资源可以准确的显示在快手APP页面,而不是出现在微信APP页面呢?
在这里插入图片描述
我们把数据从主机A传输到主机B是目的吗?真正通信的不是这两个机器,而是这两个机器上的应用(人)。但是有可能主机A上不止一个应用(进程),可能同时还会有其他的进程,例如快手打开的同时,微信也开着。那么用什么来标识客户端或者服务器主机进程的唯一性呢?端口号
为了更好的表示一台主机上,服务器进程或者客户端进程的唯一性,我们采用端口号来标识主机上的不同进程。端口号保证主机唯一性即可,即一台主机上一个端口号只能绑定一个进程,不同主机上的相同端口号绑定的进程可以不同。

公网IP地址(标识主机全网唯一性)+主机上的端口号=表示该进程在全网中的唯一性

在这里插入图片描述
所以,网络通信的本质就是进程间通信嘛!其中的临界资源就是网络。
通信是在做什么?通信不就是IO的过程嘛。所以,我们所有的网络行为只有两种:①从网络中接收数据②发送数据到网络中。
IP保证全网唯一,port保证本机唯一。一个进程可以绑定多个端口号。

进程已经有pid了,为什么还要有端口号呢?
①系统是系统,网络是网络。做到互相解耦。维护成本低
②一般都是客户端主动向服务器发送请求。需要客户端快速的找到服务器进程。决定了服务器的IP和端口不能随便改变。所以决定了不能使用轻易会改变的值。pid不太满足这个条件。

所以,客户端向服务器发送消息时,要不要把客户端的ip和端口号发给服务器呢?要,因为服务器还有将消息发回给客户端。这就决定了在发送数据时,一定会多发一部分数据——以协议的形式呈现。

3.网络字节序

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

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

那么,如果需要转化的话,转化的过程需要谁来完成呢?需要程序员自己来完成转换工作。当然,操作系统也给我们提供了相应的接口,我们调用即可。
接下来,我们简单介绍一下这些接口

 #include <arpa/inet.h>

       uint32_t htonl(uint32_t hostlong);

       uint16_t htons(uint16_t hostshort);

       uint32_t ntohl(uint32_t netlong);

       uint16_t ntohs(uint16_t netshort);

这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

网络套接字

4.套接字

IP+port就可以表示一台主机的进程在网络中的唯一性,其中IP+Port合起来被称为网络套接字。
接下里,我们先见一下关于网络套接字创建,绑定端口,使用的相关函数。

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

套接字的种类其实是比较多的。有

  • 网络套接字:主要用于网络跨主机之间通信,同时支持本地通信。
  • 原始套接字:我们一般的套接字访问的都是传输层的接口,原始套接字可以绕过传输层访问底层的数据和接口。
  • Unix域间套接字:只能够支持本地通信。

由于有三套不同的套接字,所以按理来说,操作系统要设计三套不同的接口分别对应三套不同的套接字。但是这对使用者来说简直是灾难,使用者要同时掌握三套接口。所以,为了方便使用,操作系统进行了如下的设计:
在这里插入图片描述
我们发现:struct sockaddr_in和struct sockaddr_un的接口不同,这使用起来就很麻烦。所以操作系统就设计了struct sockaddr结构。在使用时,就必须进行强制类型转换。

写到这里,本篇博客的内容就结束了,我们下期博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp安卓端实现语音合成播报

最初尝试使用讯飞语音合成方式,能获取到语音数据,但是数据是base64格式的,在安卓端无法播放,网上有说通过转成blob格式的url可以播放,但是uniapp不支持转换的api;于是后面又想其他办法,使用安卓插件播报原生安卓语音播报插件 - DCloud 插件市场 方案一(讯飞语音合成) 1.在讯飞…

分享一个Typecho博客系统专用的CloudFlare缓存规则,优化加速一下下!

好久都没有更新Typecho博客了,最近几天明月测试了一套适用于Typecho博客系统的CloudFlare缓存规则,经过近一周时间的测试确定有效,并且加速效果特别突出,今天就无偿分享给大家,也算是为国内Typecho生态添砖加瓦了吧! 总结下来,这套CloudFlare缓存规则带来的好处就是可以…

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

tableau饼图与环形图绘制 - 5

饼图与环形图绘制 1. 饼图绘制1.1 饼图绘制1.2 显示标签1.3 显示合计百分比1.4 设置百分比格式1.5 添加说明1.6 图像导出 2. 环形图绘制2.1 选择标记为饼图2.1 饼图绘制2.2 双饼图绘制2.3 设置大饼图大小2.4 设置双轴2.5 设置小饼图属性 1. 饼图绘制 酒店价格等级饼图 1.1 饼…

作业/数据结构/2024/7/8

链表的相关操作作业&#xff1a; 1】 按值修改 2】按值查找&#xff0c;返回当前节点的地址 &#xff08;先不考虑重复&#xff0c;如果有重复&#xff0c;返回第一个&#xff09; 3】 逆置(反转) 4】释放链表 main.c #include "head.h"int main(int argc, con…

品牌文化五大维度,构建品牌竞争力的秘诀!

品牌文化对于企业的发展和成功至关重要。 品牌文化不仅是企业和消费者之间的纽带&#xff0c;也是企业内部员工的凝聚力。 在当今竞争激烈的市场环境中&#xff0c;建立一个有活力和影响力的品牌文化是每个企业都需要认真思考和实践的事情。 品牌文化的五大维度包括价值观、…

VMware vSAN替换存储解决方案如何选择?

What is vSAN &#xff1f; 是一款软件定义的企业存储解决方案&#xff0c;支持超融合基础架构系统。vSAN与VMware vSphere 完全集成在一起&#xff0c;作为ESXi Hypervisor内的分布式软件层&#xff0c;通过整合、池化ESXi各个主机上的存储资源&#xff0c;为vSphere虚拟化平…

医疗器械网络安全| 常见安全漏洞与防护措施

医疗器械网络安全顾问​https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 一、常见安全漏洞 医疗器械软件在现代医疗体系中扮演着至关重要的角色&#xff0c;然而&#xff0c;随着技术的不断发展&…

(2)滑动窗口算法练习:无重复字符的最长子串

无重复字符的最长子串 题目链接&#xff1a;3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"a…

计算机网络知识汇总

目录 前言 概述 1、互联网的组成 2、端系统之间的两种通信方式 1、客户-服务器方式 2、对等连接方式&#xff08;P2P&#xff09; 3、交换技术 4、时延 5、利用率 6、协议 7、计算机网络体系结构 8、ISP 物理层 链路层 网络层 传输层 应用层 前言 最近准备找工作…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程&#xff08;NAPI机制&#xff09; 平台环境简介&#xff1a;宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 &#xff08;ubuntu 虚拟机默认网卡驱动&#xff09;协议&#xff1a;TCP协议&#xff0c;本文分析收包过程 本…

Python编程学习笔记(3)--- 操作列表

1、遍历列表 遍历列表可以采用for循环的方法&#xff0c;需要对列表中的每一个元素都执行相同的操作。 具体事实如下&#xff1a; name ["ada","cdb","dbc","bad","jinb"] for Name in name:print(Name)运行结果&#x…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上&#xff0c;为了方便省事&#xff0c;将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后&#xff0c;可以直接使用使用tomcat9w启动&#xff0c;或者作为服务service启动的时候&#xff0c;显示无法访问到资源…

STM32实战篇:按键控制LED

按键控制LED 功能要求 有两个按键&#xff0c;分别控制两个LED灯。当按键按下后&#xff0c;灯的亮暗状态改变。实物如下图所示&#xff1a; 由图可知&#xff0c;按键一端直接接地&#xff0c;故另一端所对应IO引脚的输入模式应该为上拉输入模式。 实现代码 #include "…

昇思25天学习打卡营第1天|小试牛刀

这里写自昇思25天学习打卡营第1天|小试牛刀定义目录标题 昇思25天学习打卡营第1天学习了初学入门之基本介绍。了解了昇思MindSpore和华为昇腾AI全栈。训练营中的教程丰富&#xff0c;有初学入门、应用实践和量子计算等。学习打卡营是很好的提升自己的机会。 昇腾计算&#xff…

电脑清理c盘内存空间怎么清理免费 怎么清理c盘的垃圾文件又不删除有用文件

在计算机使用过程中&#xff0c;随着时间的推移&#xff0c;C盘空间可能会被各种临时文件、缓存和无用的注册表项占用。这不仅会导致C盘空间不足&#xff0c;还可能影响计算机的性能。那么怎么样清理C盘内存空间&#xff0c;怎么样清理C盘的垃圾避开系统文件呢&#xff1f; 一…

JVM原理(二三):JVM虚拟机线程安全的实现方法

1. 互斥同步 互斥同步(MutualExclusion&Synchronization)是一种最常见也是最主要的并发正确性保障手段。同步是指在多个线程并发访问共享数据时&#xff0c;保证共享数据在同一个时刻只被一条(或者是一些&#xff0c;当使用信号量的时候)线程使用。而互斥是实现同步的一种…

Msfvenom制作自己的专属Shell

Msfvenom制作自己的专属Shell 如何通过Msfvenom来生成用户自己的专属Shell?有时候我们上传Shell到目标主机后&#xff0c;不仅我们自己可以连接&#xff0c;其他用户也可以连接&#xff0c;有时候会导致我们丢失该Shell&#xff0c;甚至该shell被用户发现并查杀。 实验环境 …

数据仓库哈哈

数据仓库 基本概念数据库&#xff08;database&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的异同 整体架构分层架构方法论ER模型&#xff08;建模理论&#xff09;维度模型 何为分层第一层&#xff1a;数据源&#xff08;ODS ER模型&#xff09;设计要点日志…