【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的详细配置。接下来,我们分析一下这些内容:
-
以太网接口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地址,用于在链路层唯一标识网络接口。
- 状态标志(flags):
-
接收(RX)和发送(TX)统计:
- 显示了接口接收和发送的数据包数量、字节数以及相关的错误统计(如错误、丢弃、溢出等),这些信息对于诊断网络性能问题非常有用。
-
环回接口(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结构。在使用时,就必须进行强制类型转换。
写到这里,本篇博客的内容就结束了,我们下期博客再见!
相关文章:
【Linux】网络新兵连
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 在上一篇博客中,我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容,那么我们开始吧! 1.网络中的地址管理 大家一…...
基于STM32的智能加湿器
1.简介 基于STM32的加湿器发展前景非常乐观,这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口,能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…...
ubuntu 如何解压tar
在Ubuntu中解压.tar文件,可以使用tar命令。以下是解压.tar文件的命令: tar -xvf file.tar 解释: x 表示解压 v 表示显示过程中的详细信息(可选) f 表示后面跟文件名 这将在当前目录下解压file.tar文件的内容。如果…...
C++ 算法——二分查找
如果要你在一个升序序列中查找一个值的位置,你是否还会傻乎乎的用下面这个 O ( n ) \mathcal O(n) O(n) 的代码暴力查找,如果是,我告诉你,其实根本不用这么做。 int find(int a[],int n,int k) {for(int i0;i<n;i) if(a[i]k)…...
【自动驾驶仿真在做什么——初学者总结(陆续补充)】
文章目录 基础概念自动驾驶级别再稍提一下ODD是什么? 自动驾驶仿真分类软件在环仿真硬件仿真 仿真究竟难在哪?关于lidar和radar区别一些名词解释 最近也是学习自动驾驶仿真相关知识,习惯去总结一下,方便自己回顾和总结,…...
探索HTML5的设计原则:引领Web开发的未来方向
随着互联网的飞速发展,HTML5作为Web技术的核心标准之一,不仅极大地丰富了网页的表现力和交互性,还推动了Web应用向更加动态、高效、安全的方向迈进。HTML5的设计原则,体现了对用户体验、内容可访问性、跨平台兼容性以及未来可扩展…...
力扣喜刷刷--day1
1.无重复字符的最长子串 知识点:滑动窗口 基本概念 窗口:窗口是一个连续的子序列,可以是固定长度或可变长度。滑动:窗口在数据序列上移动,可以是向左或向右。边界:窗口的起始和结束位置。 应用场景 字符…...
配置linux的yum镜像为阿里镜像源
1.备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base.repo 到/etc/yum.repos.d wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.清空并生成缓存 yum clean …...
react使用markdown进行展示
有一些文档非常长,但是又要挨个设置样式,直接用 组件库 - marked 注意文档要放在public下才能读取。但非常方便 import { marked, Renderer } from "marked".....const [html, setHtml] useState<any>("")const renderer:…...
实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目
实时温湿度监测系统 前言项目目的项目材料项目步骤模拟ESP32接线连接测试搭建PC端ESP32拷录环境对ESP32进行拷录PC端搭建桌面组件本地数据接收桌面小组件部分 实验总结 前言 人生苦短,我用Python。 由于我在日常工作中经常使用Python,因此在进行该项目…...
CloudWatch Logs Insights 详解
CloudWatch Logs Insights 是 AWS 提供的强大日志分析工具,允许您快速、交互式地搜索和分析日志数据。本文将详细介绍使用 CloudWatch Logs Insights 所需的权限、常用查询方法,以及一些实用的查询示例。 1. 所需权限 要使用 CloudWatch Logs Insights,用户需要具备以下 I…...
Jmeter在信息头中设置Bearer与 token 的拼接值
思路:先获取token,将token设置成全局变量,再与Bearer拼接。 第一步:使用提取器将token值提取出来,使用setProperty函数将提取的token值设置成全局变量,在登录请求后面添加BeanShell取样器 或者 BeanShell后…...
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
目录 一、代码解析: 二、解决方案 1、增加日志记录 2、异步操作 注意事项 3、增加超时机制 4、使用线程池 5、使用信号量或事件 6、监控数据库连接状态 在C#程序操作Sql Server数据库的实际应用中,若异常就会抛出异常,我们还能找到异…...
数据统计与数据分组18-25题(30 天 Pandas 挑战)
数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水(数据统计)…...
Apache Seata应用侧启动过程剖析——注册中心与配置中心模块
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧…...
大话光学原理:1.“实体泛光说”、反射与折射
一、实体泛光说 在古希腊,那些喜好沉思的智者们中,曾流传着一个奇妙的设想:他们认为,我们的眼睛仿佛伸出无数触手般的光线,这些光线能向四面八方延伸,紧紧抓住周围的每一个物体。于是,当我们凝视…...
住宅代理、移动代理和数据中心代理之间的区别
如果您是一名认真的互联网用户,可能需要反复访问某个网站或服务器,可能是为了数据抓取、价格比较、SEO 监控等用例,而不会被 IP 列入黑名单或被 CAPTCHA 阻止。 代理的工作原理是将所有传出数据发送到代理服务器,然后代理服务器将…...
光学传感器图像处理流程(一)
光学传感器图像处理流程(一) 1. 处理流程总览2. 详细处理流程2.1. 图像预处理2.1.1. 降噪处理2.1.2. 薄云处理2.1.3. 阴影处理 2.2. 辐射校正2.2.1. 辐射定标2.2.2. 大气校正2.2.3. 地形校正 2.3. 几何校正2.3.1. 图像配准2.3.2. 几何粗校正2.3.3. 几何精…...
el-table 树状表格查询符合条件的数据
需要对el-table的树状表格根据输入机构名称,筛选出符合条件的数据,可用如下方法: 页面内容如下: <el-input v-model"ogeName" placeholder"请输入机构名称"><el-table :data"list" row…...
MQTT教程--服务器使用EMQX和客户端使用MQTTX
什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
