当前位置: 首页 > news >正文

【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结构。在使用时,就必须进行强制类型转换。

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

相关文章:

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在上一篇博客中&#xff0c;我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容&#xff0c;那么我们开始吧&#xff01; 1.网络中的地址管理 大家一…...

基于STM32的智能加湿器

1.简介 基于STM32的加湿器发展前景非常乐观&#xff0c;这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口&#xff0c;能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…...

ubuntu 如何解压tar

在Ubuntu中解压.tar文件&#xff0c;可以使用tar命令。以下是解压.tar文件的命令&#xff1a; tar -xvf file.tar 解释&#xff1a; x 表示解压 v 表示显示过程中的详细信息&#xff08;可选&#xff09; f 表示后面跟文件名 这将在当前目录下解压file.tar文件的内容。如果…...

C++ 算法——二分查找

如果要你在一个升序序列中查找一个值的位置&#xff0c;你是否还会傻乎乎的用下面这个 O ( n ) \mathcal O(n) O(n) 的代码暴力查找&#xff0c;如果是&#xff0c;我告诉你&#xff0c;其实根本不用这么做。 int find(int a[],int n,int k) {for(int i0;i<n;i) if(a[i]k)…...

【自动驾驶仿真在做什么——初学者总结(陆续补充)】

文章目录 基础概念自动驾驶级别再稍提一下ODD是什么&#xff1f; 自动驾驶仿真分类软件在环仿真硬件仿真 仿真究竟难在哪&#xff1f;关于lidar和radar区别一些名词解释 最近也是学习自动驾驶仿真相关知识&#xff0c;习惯去总结一下&#xff0c;方便自己回顾和总结&#xff0c…...

探索HTML5的设计原则:引领Web开发的未来方向

随着互联网的飞速发展&#xff0c;HTML5作为Web技术的核心标准之一&#xff0c;不仅极大地丰富了网页的表现力和交互性&#xff0c;还推动了Web应用向更加动态、高效、安全的方向迈进。HTML5的设计原则&#xff0c;体现了对用户体验、内容可访问性、跨平台兼容性以及未来可扩展…...

力扣喜刷刷--day1

1.无重复字符的最长子串 知识点&#xff1a;滑动窗口 基本概念 窗口&#xff1a;窗口是一个连续的子序列&#xff0c;可以是固定长度或可变长度。滑动&#xff1a;窗口在数据序列上移动&#xff0c;可以是向左或向右。边界&#xff1a;窗口的起始和结束位置。 应用场景 字符…...

配置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进行展示

有一些文档非常长&#xff0c;但是又要挨个设置样式&#xff0c;直接用 组件库 - marked 注意文档要放在public下才能读取。但非常方便 import { marked, Renderer } from "marked".....const [html, setHtml] useState<any>("")const renderer:…...

实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目

实时温湿度监测系统 前言项目目的项目材料项目步骤模拟ESP32接线连接测试搭建PC端ESP32拷录环境对ESP32进行拷录PC端搭建桌面组件本地数据接收桌面小组件部分 实验总结 前言 人生苦短&#xff0c;我用Python。 由于我在日常工作中经常使用Python&#xff0c;因此在进行该项目…...

CloudWatch Logs Insights 详解

CloudWatch Logs Insights 是 AWS 提供的强大日志分析工具,允许您快速、交互式地搜索和分析日志数据。本文将详细介绍使用 CloudWatch Logs Insights 所需的权限、常用查询方法,以及一些实用的查询示例。 1. 所需权限 要使用 CloudWatch Logs Insights,用户需要具备以下 I…...

Jmeter在信息头中设置Bearer与 token 的拼接值

思路&#xff1a;先获取token&#xff0c;将token设置成全局变量&#xff0c;再与Bearer拼接。 第一步&#xff1a;使用提取器将token值提取出来&#xff0c;使用setProperty函数将提取的token值设置成全局变量&#xff0c;在登录请求后面添加BeanShell取样器 或者 BeanShell后…...

C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案

目录 一、代码解析&#xff1a; 二、解决方案 1、增加日志记录 2、异步操作 注意事项 3、增加超时机制 4、使用线程池 5、使用信号量或事件 6、监控数据库连接状态 在C#程序操作Sql Server数据库的实际应用中&#xff0c;若异常就会抛出异常&#xff0c;我们还能找到异…...

数据统计与数据分组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 按分类统计薪水&#xff08;数据统计&#xff09…...

Apache Seata应用侧启动过程剖析——注册中心与配置中心模块

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧&#xf…...

大话光学原理:1.“实体泛光说”、反射与折射

一、实体泛光说 在古希腊&#xff0c;那些喜好沉思的智者们中&#xff0c;曾流传着一个奇妙的设想&#xff1a;他们认为&#xff0c;我们的眼睛仿佛伸出无数触手般的光线&#xff0c;这些光线能向四面八方延伸&#xff0c;紧紧抓住周围的每一个物体。于是&#xff0c;当我们凝视…...

住宅代理、移动代理和数据中心代理之间的区别

如果您是一名认真的互联网用户&#xff0c;可能需要反复访问某个网站或服务器&#xff0c;可能是为了数据抓取、价格比较、SEO 监控等用例&#xff0c;而不会被 IP 列入黑名单或被 CAPTCHA 阻止。 代理的工作原理是将所有传出数据发送到代理服务器&#xff0c;然后代理服务器将…...

光学传感器图像处理流程(一)

光学传感器图像处理流程&#xff08;一&#xff09; 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的树状表格根据输入机构名称&#xff0c;筛选出符合条件的数据&#xff0c;可用如下方法&#xff1a; 页面内容如下&#xff1a; <el-input v-model"ogeName" placeholder"请输入机构名称"><el-table :data"list" row…...

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...