【Linux】网络新兵连

news2024/9/20 0:59:11

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

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

引言

在上一篇博客中,我们简单的介绍了一些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.coloradmin.cn/o/1911951.html

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

相关文章

【Linux】多线程_2

文章目录 九、多线程2. 线程的控制 未完待续 九、多线程 2. 线程的控制 主线程退出 等同于 进程退出 等同于 所有线程都退出。为了避免主线程退出&#xff0c;但是新线程并没有执行完自己的任务的问题&#xff0c;主线程同样要跟进程一样等待新线程返回。 pthread_join 函数…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形

二维数组的动态规划——0/1矩阵、最大正方形 最大正方形1277. 统计全为 1 的正方形子矩阵221. 最大正方形 01矩阵542. 01 矩阵 最大正方形 下面两个题目是非常相似的&#xff0c;只是一个统计正方形数目&#xff0c;一个统计最大正方形的面积。 1277. 统计全为 1 的正方形子矩…

【优先级队列PriorityQueue】

目录 1&#xff0c;优先级队列 1.1 概念 2&#xff0c;优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆的向下调整&#xff08;大根堆&#xff09; 2.3.2 建堆的时间复杂度​编辑 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 3&a…

源码编译构建LAMP(企业网站架构部署与优化)

部署LAMP平台 LAMV架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包 括 Linux操作系统&#xff0c;Apache网站服务器、MySQL数据库服务器、P…

ElementPlusError: [ElPagination] 你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档 - 报警告之一

一、问题描述&#xff1a; 今天在使用elementui plus的时候遇到了一个奇葩的问题&#xff0c; 就是提示 使用了一些已被废弃的用法&#xff0c; 奇葩就在于我是 复制另一个页面的分页&#xff0c; 一摸一样的东西&#xff0c;就只这个页面报错&#xff0c; 分页也不出 为了这个…

App Cleaner Uninstaller 8.3.0激活版 最佳卸载程序和清理助手

App Cleaner & Uninstaller 完全安全地删除 Mac 上的程序&#xff0c;删除应用程序的残留物&#xff0c;管理扩展程序和启动程序。 App Cleaner & Uninstaller 8.3.0激活版下载 卸载应用程序和所有不需要的垃圾文件 当您将应用程序拖放到废纸篓时&#xff0c;请检查您…

鸿蒙开发学习笔记1

一、下载 deveco-studio 编译器 https://developer.huawei.com/consumer/cn/deveco-studio/#download 二、ArkTs 0、基本数据类型&#xff1a; 3种&#xff1a;string、number、boolean 1、存储数据&#xff08;变量、常量&#xff09; 注&#xff1a;类似于 ts 使用 con…

【work】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结&#xff1a; 小菜鸡写一写基础深度学习的问题&#xff08;复制大佬的&#xff0c;自己复习用&#xff09; - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

springboot中@bean注解的创建和使用

bean的创建顺序 在Spring Boot中&#xff0c;当一个配置类&#xff08;使用Configuration注解的类&#xff09;中定义了多个bean时&#xff0c;这些bean的创建顺序并不完全由它们在类中的声明顺序决定。Spring框架在创建和管理bean时&#xff0c;遵循了复杂的依赖注入和生命周…

什么,有狗快跑!慢着,这次手把手教你怎么过安全狗!(sql注入篇)

前言 在记忆里上次绕安全狗还是在上次&#xff0c;开开心心把自己之前绕过狗的payload拿出来&#xff0c;发现全部被拦截了&#xff0c;事情一下子就严肃起来了&#xff0c;这就开整。 环境 本次环境如下sqli-lab的sql注入靶场 网站安全狗APACHE版V4.0版本的最高防护等级绕过…

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本&#xff0c;提出了利用低成本的多视角相机进行3D目标检测&#xff0c;以取代昂贵的LiDAR传感器。然而&#xff0c;仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…

思维+数学,CF 1138B - Circus

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1138B - Circus 二、解题报告 1、思路分析 设第一组会小丑和杂技的人数分别为x1, y1 第二组会小丑和杂技的人数分别为x2, y2 显然根据要求有&#xff1a; x1 y2 > x1 x2 x2 y2 上式说明第二组每…

【QT中实现摄像头播放、以及视频录制】

学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集&#xff08;11个2D1个3D&#xff09; 对计算机而言&#xff0c;上述输入、输出维度大小是按次数定义的。 以“Vel&#xff0c;F…

Celery,一个实时处理的 Python 分布式系统

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

Spring-AOP(二)

作者&#xff1a;月下山川 公众号&#xff1a;月下山川 1、什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的一种补充和完善&#xff0c;它以通过预编译方式和运行期…

MySQL:TABLE_SCHEMA及其应用

MySQL TABLE_SCHEMA及其应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

持久化存储与设备环境查询的最佳实践

ArkUI框架中的PersistentStorage和Environment 在ArkUI框架中&#xff0c;持久化存储和设备环境查询是应用开发中不可或缺的两个重要功能。在本文中&#xff0c;我们将深入了解框架提供的PersistentStorage和Environment&#xff0c;它们的用途、限制条件以及在应用开发中的使…

SDIO CMD 数据部分 CRC 计算规则

使用的在线 crc 计算工具网址&#xff1a;http://www.ip33.com/crc.html CMD CRC7 计算 如下图为使用逻辑分析仪获取的SDIO读写SD卡时&#xff0c;CMD16指令发送的格式&#xff0c;通过逻辑分析仪总线分析&#xff0c;可以看到&#xff0c;该部分的CRC7校验值得0x05,大多数情况…