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

[Linux#48][网络] 令牌环网 | IPv4 | socket 套接字 | TCP | UDP | 网络字节序列

目录

1.网络

1.0 令牌环网(了解)

1.1 IP 地址

1.3 网络通信的基本脉络

IPv4地址解释

2.Socket 编程预备

2.1 端口号

2.2 传输层协议

2.3 网络字节序列

库函数定义

函数说明


1.网络

1.0 令牌环网(了解)

相同令牌时,才能放,相当于局域网中的锁

令牌环网和以太网都属于数字链路层,但是底层协议是不一样的

因为网络是层状结构的,所以替换底层协议,不影响传输


1.1 IP 地址

我怎么知道是要跨网络交给主机的呢?

IP 地址可以保证主机在全网的唯一性,例如:我们云服务器的连接 IP 就是唯一的

两个小故事:

  1. 从辽宁到云南,沿路旅游的路线如何设计
  • 从哪来,到哪去--一直是不变的--IP 地址--指导我们进行路径规划
  • 上一站从哪里来,下一站到哪里去--会一直变化,变化的依据是“我要去哪里”--Mac 地址

相当于 IP 是大目标,Mac 是小目标

IP 地址是什么?

IPv4,四字节,32 比特位,整数

192.168.1.1 类似风格

IP 地址为什么要交给路由器?

路由器会重新解包,和封装 数据链层协议,实现了不同区域网之间的通信,解决了底层协议的差异化

同一子网,没有路由器的话,就会底层协议需要一样

  • IP 及上层是一样的,IP 协议屏蔽了底层网络的差异,靠的就是工作在 IP 层的路由器
  • IP 实现了全球主机的软件虚拟层,一切皆是 IP 报文!
  • 也体现了网络层状结构的优越性

Mac 地址 vs IP 地址

IP 地址,尤其是目的 IP,一般都是不会改变的,协助我们进行路径选择

max 地址,出局域网之后,源和目的都要被丢弃,每经过一个设备都要变化,让路由器重新封装


1.3 网络通信的基本脉络

示意图

路由器,可以根据 IP 地址判断目的地在哪个局域网内,IP 地址的设计非常的巧妙,它在网络层,会根据目的地,进行路径选择时选择了下一个跳转的路由器。

ifconfig   --查看当前云服务器的MAC地址,IP地址

IP地址

IP协议有两个版本, IPv4和IPv6

IPv4地址解释

IPv4地址是一个4字节(即32位)的整数,它可以被看作是一个无符号整数(unsigned int)。这意味着它可以表示从0到 (2^{32} - 1) 之间的任何整数值,即从0到4,294,967,295(约42亿)。

四字节和32位的关系

  • 4字节:在计算机中,一个字节(Byte)等于8位(bits),所以4字节就是 (4 \times 8 = 32) 位。
  • 32位:指的是IPv4地址的总长度,由32个二进制位组成。

点分十进制表示法

  • 点分十进制是一种常用的表示IPv4地址的方法,它将32位的二进制数分成四个8位的部分,每部分转换成十进制数,并用点(.)分隔开。例如,IPv4地址 192.168.0.1 就是点分十进制格式。

每个数字的取值范围

  • 在点分十进制表示法中,每个数字代表一个字节(8位),因此它们的取值范围是从0到255。这是因为8位二进制数的最大值为 (2^8 - 1 = 255)。
  • 最小值:0,对应于8位全0,即 00000000
  • 最大值:255,对应于8位全1,即 11111111

示例

  • 192.168.0.1 为例:
  • 第一部分 192 对应于二进制 11000000
  • 第二部分 168 对应于二进制 10101000
  • 第三部分 0 对应于二进制 00000000
  • 第四部分 1 对应于二进制 00000001
  • 合并起来就是 11000000 10101000 00000000 00000001,去掉空格后就是32位的二进制数 11000000101010000000000000000001

总结

  • IPv4地址是一个32位的无符号整数,通常以点分十进制的形式表示,每个部分都是一个8位的二进制数,取值范围是0到255。这种表示方法使得IPv4地址更加易于阅读和记忆。
  • IPv6,IP地址是一个16个字符,128位比特位的整数。防止 IPv4 不够用

要想普及一项技术,需要孵化出一个更大的运用场景,例如物联网使用 IPv6 的话...现在国家规定,公司要兼容 IPv6

MAC地址

  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的

MAC地址通常在局域网中使用,IP地址在广域网和局域网都使用,不过我们不谈IP在局域网的使用。


在进行网络通信的时候,是不是我们的两台机器在进行通信呢?

  1. 网络协议中的下三层,主要解决的是,数据安全可靠的送到远端机器
  2. 用户使用应用层软件,完成数据发送和接收的

先把这个软件启动起来-->进程

日常网络通信的本质:就是进程间通信!!(从应用层上看,不用看网络栈的底层传输)

要进程间通信,就要先把进程标识出来

2.Socket 编程预备

2.1 端口号

定义

  • 端口号是传输层协议的一部分。

特点

  • 端口号是一个 2 字节(16 位)的整数。
  • 用于标识一个进程,告诉操作系统当前的数据应交给哪个进程处理。
  • IP 地址加上端口号可以唯一标识网络上某台主机的某个进程。
  • 一个端口号只能被一个进程占用。

端口号 port: 无论对于 client 和 server,都能唯一的标识该主机上的一个网络应用层的进程

在公网上:

  • IP 地址能标识唯一的一台主机,端口号,能表示主机上唯一的一个进程
  • IP:port == 标识全网唯一的一个进程

这种 IP+port 的模式,就叫做 socket (插口,插座),实现了客户端和服务器的唯二进程进行通信

例如:10086 是一个 IP,工号 12345 的员工就是 port 端口号

端口号 vs pid

pid 已经能标识一台主机上的进程唯一性了,为什么还要搞一个端口号??

  1. 不是所有的进程都要网络通信,但是所有进程都要有 pid
  2. 为什么不直接用 Pid 做端口?将系统和网络部分解耦合,给网络部分设计了单独的规则,防止系统修改进程 pid 造成混乱

就像一个人有身份证号还有工号,不能用工号代替身份证号,是不同场景下的,如果这样那你从公司离职了呢~

下三层通信示意图

我们的客户端,如何知道服务器的端口号是多少?

每一个服务的端口号必须是众所周知的,精心设计,被客户端知晓的

  • 一个进程可以绑定多个端口号吗?可以
  • 一个端口号可以绑定多个进程吗?不可以

2.2 传输层协议

这张图是一个计算机网络协议栈的示意图,展示了数据在网络中传输时经过的不同层次以及每个层次的数据格式。根据图中的标注,我们可以对以下三个概念进行解释:

  1. 数据段(Data Segment):
    数据段是在传输层(Transport Layer)处理的数据单元,通常用于描述TCP或UDP等传输协议封装的信息。在图中,“你好”这个字符串是应用层数据,在传输层会被封装成一个数据段,并添加上相应的头部信息,如序列号、确认号、源端口/目的端口等。
  2. 数据报(Datagram):
    数据报是在网络层(Network Layer)处理的数据单元,通常用于描述IP协议封装的信息。在图中,数据段经过网络层后会变成一个数据报,它包含了原始数据段以及其他必要的头部信息,例如源IP地址、目的IP地址、TTL(Time To Live)、协议类型等。
  3. 数据帧(Data Frame):
    数据帧是在链路层(Link Layer)处理的数据单元,通常用于描述以太网驱动程序封装的信息。在图中,数据报经过链路层后会变成一个数据帧,它包含了原始数据报以及其他必要的头部信息,例如MAC地址(源MAC地址、目的MAC地址)、FCS(Frame Check Sequence)等。

总结来说,数据段是传输层的概念,数据报是网络层的概念,而数据帧则是链路层的概念。这些不同层次的数据单元在计算机网络中起着不同的作用,它们通过层层封装和解封装来实现数据的有效传输。

TCP协议:

  • TCP协议叫做传输控制协议(Transmission Control Protocol),TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议
  • TCP协议是面向连接的,如果两台主机之间想要进行数据传输,那么必须要先建立连接,当连接建立成功后才能进行数据传输。其次,TCP协议是保证可靠的协议(也意味着要做更多的事情),数据在传输过程中如果出现了丢包、乱序等情况,TCP协议都有对应的解决方法

UDP协议:

  • UDP协议叫做用户数据报协议(User Datagram Protocol),UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议
  • 使用UDP协议进行通信时无需建立连接,如果两台主机之间想要进行数据传输,那么直接将数据发送给对端主机就行了,但这也就意味着UDP协议是不可靠的,数据在传输过程中如果出现了丢包、乱序等情况,UDP协议本身是不知道的。
  • 就像发邮件一样,邮件发出去了并不管

⭕ 传输层同时存在 tcp 和 udp 是为什么呢?

TCP协议和UDP协议不存在哪个更好的说法?

  • 可靠和不可靠都是中性词,就像化学中的惰性一样
  • TCP可靠 意味着 在设计和维护上更复杂,不可靠就会相对做的事少一些更简单
  • 所以这两个协议在各自特定的场景下,发光发热

TCP:银行,支付...(在网络联通的情况下,丢包可找回)

UDP:信息派发,例如直播...

2.3 网络字节序列

大小端:没有好坏之分,就是一种不同的选择(来源于格列夫游记里面对吃鸡蛋先吃大小端的辩论)

定义:小端:低权值位放在低地址处(小小小)。大端反之

文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

网络数据传输中的大小端问题

由于我们不能保证通信双方存储数据的方式是一样的,因此网络中传输的数据必须考虑大小端问题。

TCP/IP 协议规定如下

  • 网络数据流采用大端字节序,即低地址存放高字节。

无论主机是大端机还是小端机,都必须按照 TCP/IP 协议规定的网络字节序来发送和接收数据:

  • 发送端
    • 如果发送端是小端机,需要先将数据转换成大端字节序,然后再发送到网络中。
    • 如果发送端是大端机,则可以直接发送数据。
  • 接收端
    • 如果接收端是小端机,需要先将接收到的数据转换成小端字节序,然后再进行数据识别。
    • 如果接收端是大端机,则可以直接进行数据识别。
  • sum: 大端直接发,小端缓冲区转化为大端后发送

注意事项

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
  • 接收主机把从网络上接收到的字节依次保存在接收缓冲区中,同样按内存地址从低到高的顺序保存。
  • 因此,网络数据流的地址应规定为:先发出的数据是低地址,后发出的数据是高地址。

网络字节序与主机字节序之间的转换

为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,系统提供了四个函数,可以通过调用以下库函数实现网络字节序和主机字节序之间的转换。

这些函数名很好记:

  • h 表示主机(host)
  • n 表示网络(network)
  • l 表示 32 位长整数
  • s 表示 16 位短整数

例如,htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 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);

函数说明

  • htonl:将 32 位的长整数从主机字节序转换为网络字节序。
  • htons:将 16 位的短整数从主机字节序转换为网络字节序。
  • ntohl:将 32 位的长整数从网络字节序转换为主机字节序。
  • ntohs:将 16 位的短整数从网络字节序转换为主机字节序。

下篇文章将对 socker 接口开始讲解啦~

相关文章:

[Linux#48][网络] 令牌环网 | IPv4 | socket 套接字 | TCP | UDP | 网络字节序列

目录 1.网络 1.0 令牌环网&#xff08;了解&#xff09; 1.1 IP 地址 1.3 网络通信的基本脉络 IPv4地址解释 2.Socket 编程预备 2.1 端口号 2.2 传输层协议 2.3 网络字节序列 库函数定义 函数说明 1.网络 1.0 令牌环网&#xff08;了解&#xff09; 相同令牌时&am…...

Mac OS14外接显示器字体过小和放大字体模糊问题的简单解决

文章目录 问题简述解决方法 问题简述 使用Mac mini外接2K 显示器时&#xff0c;默认分辨率是25601440&#xff0c;字体较小&#xff0c;如果切换成19201080&#xff0c;字体又变大模糊。 解决方法 使用HiDP I&#xff08;一种显示技术&#xff0c;使用多个物理像素显示1个像…...

Python-pptx:如何在幻灯片中轻松插入与填充表格

哈喽,大家好,我是木头左! 安装和设置Python-PPTX 确保你的系统中已经安装了Python。然后,使用pip安装python-pptx库: pip install python-pptx安装完成后,你就可以开始编写脚本来操作PowerPoint文件了。 创建表格的基础步骤 使用python-pptx创建表格涉及几个关键步骤…...

ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

ERROR 2003 (HY000): Cant connect to MySQL server on localhost:3306 (10061) mysql-8.0.30-winx64 有时候还是没启动起来的原因&#xff0c;不知道为什么&#xff0c;手动点点 mysql-8.0.30-winx64_mysql8.0.30-CSDN博客...

MySQL优化策略(大数据量)

一、 前提&#xff1a; 1.数据规模 : 明确数据量级是上亿级&#xff0c;这需要特殊的处理&#xff0c;比如分区、索引等策略。 2.数据增长率 : 了解数据的增加速度&#xff0c;有助于预估未来存储和性能需求&#xff0c;从而提前规划扩展策略。 3.访问模式 : 分析是读多写少…...

在Excel里制作简单游戏界面

生成随机激活码 找工具箱 插入按钮 建宏 方法一&#xff1a;新建按钮的时候创建宏 方法二&#xff1a;右键->指定宏 VBA VBA代码界面 调整字体 VBA代码 Public str As String 存储激活码显示的字符 Public st As String 中间变量&#xff0c;用来替代随机数 Public ot…...

火语言RPA流程组件介绍--鼠标拖拽元素

&#x1f6a9;【组件功能】&#xff1a;在开始位置上按下鼠标&#xff0c;拖动到结束坐标或指定元素上放下鼠标&#xff0c;实现目标元素的拖拽 配置预览 配置说明 丨拖动元素 支持T或# 默认FLOW输入项 开始拖动的元素,并从当前元素开始按下鼠标 丨拖动到 目标元素/目标位…...

计算机三级网络技术总结 第十一章网络管理技术

能正常接受来自路由的通知&#xff0c;说明路由上已设置SNMP代理并具有发出通知的功能。UDP端口号缺省为162攻击者使用无效的IP地址&#xff0c;利用TCP连接的三次握手过程&#xff0c;使得受害主机处于开放会话的请求中&#xff0c;直至连接超时。在此期间&#xff0c;受害主机…...

「豆包 Marscode 体验官」AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章&#xff0c;作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本&#xff0c;以及 JetBrains 系列 IDE&#xff0c;如 IntelliJ IDEA、Pycharm 等&#xff0c;版本要求为 22…...

基于Linux文件编程实现处理Excel表格的数据

目录 前言 整体的代码框架 如何读取数据文件的数据 read_line 如何处理读取到的数据 process_data 运行结果 总结 前言 本文是基于Linux文件编程的一个小实验&#xff0c;用文件IO来读取Excel表格的数据&#xff0c;处理后写入另一个文件&#xff0c;本文只是对文件IO的…...

make 程序规定的 makefile 文件的书写语法(2)

&#xff08;13&#xff09;接着开始一个更复杂的例子&#xff0c;课程的素材 2 &#xff0c;先给出书写 makefile 的框架 &#xff1a; &#xff08;14&#xff09; &#xff08;15&#xff09; 谢谢...

容器化安装jenkins稳定版长期维护版本LTS

前提已有 docker-compose和docker-ce环境&#xff0c;这里安装稳定的Lts版本即可。 选择稳定版本 这里选择LTS 稳定长期维护的版本 在docker镜像找到LTS稳定版本 部署jenkins服务 创建持久化数据目录 jenkinsdata]# pwd /data/jenkinsdata编写docker-compose文件 jenkins_…...

如何让人工智能训练更快

影响人工智能训练时间的因素 在深度学习训练中&#xff0c;训练时间的计算涉及到多个因素&#xff0c;包括 epoch 数、全局 batch size、微 batch size、计算设备数量等。下面是一个基本的公式来说明这些参数之间的关系&#xff08;注意&#xff0c;这只是一个基本的说明公式&…...

linux/ubuntu国内镜像安装gitleaks敏感信息扫描工具教程及避坑点

1、背景 利用gitleaks扫描git仓库或者文件 GitHub上有比较详细的教程&#xff0c;但是由于每个人的安装环境不同&#xff0c;坑很多&#xff0c;网上能查到的有效信息也比较少。这里就以我坑很多的环境为例&#xff0c;捋一下步骤。 GitHub - gitleaks/gitleaks: Protect an…...

JavaScript高级程序设计基础(二)

二、语言基础 2.1语法 &#xff08;简单的语法基础将在文章省略&#xff09; 2.1.1严格模式 严格模式是一种不同的 JavaScript 解析和执行模型&#xff0c;不规范写法在这种模式下会被处理 只需在脚本开头加上"use strict" 也可以单独指定一个函数在严格模式下执…...

使用Spring Boot开发自习室预定系统

开发一个自习室预定系统涉及到用户管理、自习室管理、预定管理等功能。以下是使用Spring Boot开发自习室预定系统的步骤和关键点&#xff1a; 1. 需求分析 确定系统的基本需求&#xff0c;例如&#xff1a; 用户注册和登录管理员管理自习室信息用户浏览可用自习室用户预定自…...

最近读书总结

1《More Joel on Software》读后感【2024年8月29日】 1.1 本书概要 本书讲解了如何发现优秀的IT人才&#xff0c;并把他们招聘进来&#xff1b;如何对智力密集型的IT企业&#xff08;软件企业&#xff09;进行管理&#xff0c;即最好采用情感认同法&#xff1b;对计算机大学生…...

python列表判断是否为空的三种方式

#列表是否为空判断 a[]一&#xff1a; if a:print(not null) else:print(null)二&#xff1a; b len(a) if b 0:print(null) else:print(not null)三&#xff1a; if not a:print(null) else:print(not null)运行结果&#xff1a;...

二十三种模式之原型模式(类比制作陶器更好理解一些)

1. 设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。 结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。 行为型模式(十一种)&#xff1a;状态模式、模板方…...

9.9日记录

1.常见排序算法的复杂度 1.快速排序 1.1快速排序为什么快 从名称上就能看出&#xff0c;快速排序在效率方面应该具有一定的优势。尽管快速排序的平均时间复杂度与“归并排序”和“堆排序”相同&#xff0c;但通常快速排序的效率更高&#xff0c;主要有以下原因。 出现最差情况…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...