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

Linux->网络入门

目录

本文说明:

一:网络的必要性

二:协议

1:生活中的协议例子

2:分层的意义

a:软件分层

b:网络分层

3:语言角度的协议

三:TCP/IP四层模型

1:各层协议

2:各层的作用

四:以太网通信原理

1:Mac地址

2:数据碰撞

3:几个疑问

五:解包分用和封装

1:解包分用和封装的流程

2:解包分用和封装的示意图

3:几个疑问

六:路由器通信

1:路由器的介绍

2:IP地址和mac地址

3:认路和屏蔽差异

4:路由器通信原理

七:端口号

1:端口号的意义

2:理解socket通信

3:TCP/UDP的区别

总结表格

八:网络字节序


本文说明:

本文旨在介绍网络入门的知识,重在了解,不在深究

一:网络的必要性

有这么一句话:“网络让世界变成了地球村”。所以没有网络,再智能的手机也只是一块‘砖头’,再强大的电脑也只是一个‘孤岛’。是网络这座无形的桥梁,连接了所有孤岛,才真正实现了地球村!

假设现在三台计算机,各自持有客户数据,每台计算机各自有可以处理一种业务,但是没有网络,如下图:

这意味着,一个人想要处理多种业务,必须去到不同的计算机前处理,如果距离很远,则成本巨大,其次多个人同时想要处理业务,只能在那等待排队,效率极低!

而一旦有了网络,则十分方便,如下图:

所以,网络的产生是必然的!时代所趋的成果!

在生活中,常常会根据网络的覆盖范围将其分为局域网和广域网等等.....,但是其实本质没区别,你再大,不也是一个范围大的局域网吗?所以在后文中统称为局域网!

二:协议

在网络中,我们唯一听过的就是"协议",而协议就是一种约定,约定的好处在于有效的减小成本!

1:生活中的协议例子

比如生活中邮寄东西填写快递单时,就是一种协议,快递单的格式已经给你定好了,你直接对号入座即可,但是假设快递公司,没有规定快递单的格式,这意味着会有很多问题,比如:

  • “这字这么小,我看不清啊!”

  • “收件人电话呢?联系不上怎么派送?”

  • “寄件人地址也不写,包裹丢了怎么办?”

  • “里面是什么东西?是易碎品吗?要不要轻拿轻放?是液体吗?能不能空运?”

为了解决这些问题,邮局需要专门派一个人来和你反复沟通确认,这个过程极其耗时、费力、容易出错,所以快递公司约定好了快递单的格式,大大减小了成本!

2:分层的意义

所以"网络协议"就是联网设备之间为进行有效通信而事先建立的约定!但是网络通信,不是简单的通过一个东西达到效果的,而是通过经历多层,从而达到的效果!

而分层是为了让一个巨大的问题被切割成一个个更易解决的问题的同时,不同层之间还做到了松耦合,这意味着只要层与层之间的接口约定不变,任何一层的技术升级和协议革新(比如从4G到5G,从IPv4到IPv6)都不会影响其他层的工作。这才是分层的目的!

你非要一层弄完,当然可以,但是一旦出点问题,光是查找就费事,想要解决问题,更是牵一发而动全身,成本不可估量

a:软件分层

我们平时随便写个代码都会使用分层,比如函数封装,封装后出了问题,不会影响到其他函数和代码,甚至你只用一个main函数,也是分层,因为main本身也是被调用的。

b:网络分层

就算我们计算机不联网,其也是有网络的,因为你打开一个磁盘中的文件,其会被加载到内存中,这两个硬件之间进行了通信的本质就是因为其按照了某种协议,也就是某种约定去进行通信,而所谓的联网,就是把计算机接入到外部网络罢了!

而我们常常都是不同主机之间的通信,并且距离一般较长,而距离较长就会带来问题:

①:数据传输的可靠性?丢失了部分?乱序了?
②:主机定位?怎么从世界上这么多主机中找到目标
③:数据转发的问题,怎么通过路由器,交换机这种设备转发数据
④:如何获取(使用)到已经接受到的数据?

类比:两个人相隔很远达成了交易,现在就会有一些问题:

卖家寄货,其需要知道买家在哪(②)

物流公司需要知道走哪条运输路线、用飞机还是货车、经过哪些中转站(③)

卖家需要需要知道商品损坏了怎么办(①)

而买家也需要知道怎么使用到手的商品,看说明书等(④)

------------------------------------------

但是如果是当面交易物物品,则问题只有④,也就是买家需要知道怎么使用商品即可!

而解决这④个问题的方法就是网络协议!所以网络协议是一种解决方法,既然是方法就有好坏,而好的方法可扩展,方便维护,这就是为什么将网络协议进行分层设计为层状结构的原因!

网络层状结构如下:

解释:网络层状结构被叫做网络协议栈,也可以叫作“TCP/IP四层模型”或“TCP/IP协议栈”,因为TCP/IP是网络协议中的最重要最常见的协议,所以用这二者命名

而因为是初次见到,所以图中还画出了最底层的物理层,并且在其他书上也可能将网络协议栈分为了五层,不管是五层还是四层,都是有物理层的,区别在于把最后两层是否合为一层罢了,但是称其为TCP/IP 四层模型才是最标准的叫法;其次,有的书还会将数据链路层和物理层统称为网络接口层,也有人会将网络层叫做网际层。

这意味着,无论你使用Windows、Linux、macOS,还是任何智能设备,只要希望接入网络,就必须遵循相同的通信协议(如TCP/IP等)!

但这并非要求实现协议的代码一致。关键在于,只要所有参与者按照同一份“剧本”(协议标准)来生成和解析网络数据包,即使内部的“排练过程”(代码实现和数据类型)完全不同,也能实现无缝通信。反之,任何对标准的偏离都会导致无法解读数据,从而被网络拒之门外。

3:语言角度的协议

我们知道Linux在被创造的时候,C语言是当时的主流语言,所以Linux及其大部分操作系统的源代码都是C语言编写的,而网络就是在那个时候被创造的,所以C语言中实现的传输层和网络层中的协议绝大多数是用C语言编写的。因此网络的相关接口的代码也是C语言编写的!

在后面我们会遇到很多网络的接口只能用C语言的例子:

比如:

①:某个网络协议的接口的参数明明用void*更简单,但是却不是,这是因为当时C语言还没有void*的用法;②:某个网络协议的接口的参数只能用char*,不能用C++的string类型

而我们知道语言是向下兼容的,无论语言怎么优化,之前的代码也必须能够在如今的版本中运行,设计者只能补充,而不能直接修改,因为之前的代码可能已经被大量的使用,修改后果不堪设想!

三:TCP/IP四层模型

1:各层协议

解释:网络的常见协议如上图,协议在某层不可能只有一种,因为使用网络的场景很多,这意味着需要不同的网络协议才能达到用户需要的效果

①:其中的传输层和网络层中的协议是在OS中就已经实现好了的,并且不同协议给我们提供了对应的接口,这也避免了用户去接触这种内核级别的协议

②:应用层就是我们的app等应用程序

③:数据链路层的功能主要由网卡驱动程序实现,负责在本地网络中传输数据帧。

④:物理层则对应了网卡硬件与物理传输介质(如网线)之间的实际接口,负责比特流的传输。”

2:各层的作用

分层主要功能相关示例 / 设备
物理层负责光 / 电信号的传递方式,决定最大传输速率、传输距离、抗干扰性等- 传输介质:网线(双绞线)、同轴电缆、光纤、WiFi 使用的电磁波
- 设备:集线器(Hub,功能是放大已衰减但可识别的信号)
数据链路层负责设备之间的数据帧传送和识别,包括帧同步、冲突检测、数据差错校验等- 技术标准:以太网、令牌环网、无线 LAN(WiFi)
- 相关工作:网卡驱动、冲突检测(冲突时自动重发)
- 设备:交换机(Switch)
网络层负责地址管理和路由选择,通过地址标识主机并规划数据传输线路- 协议示例:IP 协议(通过 IP 地址标识主机,通过路由表规划路由)
- 设备:路由器(Router)
传输层负责两台主机之间的数据传输,确保数据可靠传输- 协议示例:传输控制协议(TCP,确保数据从源主机可靠发送到目标主机)
应用层负责应用程序间的沟通,是网络编程的主要针对层- 协议示例:简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)

解释:能看到当今的局域网主要有以太网、令牌环网、无线 LAN这几种,而为什么会有几种,而不是一种,是因为:

网络技术的发展历程是,先出现局域网(LAN),而后才演进为互联网(Internet),这是一个必然过程。早期,网络技术主要在各类研究机构与实验室中孵化,诞生了多种异构的、互不兼容的局域网方案。这是由于初始阶段技术探索的多样性所致,各研究团队所提出的网络架构与协议标准存在显著差异。

经过实践筛选与技术竞争,少数优秀且具备广泛应用潜力的局域网技术标准最终胜出,成为主流。其中主要包括以太网(Ethernet)、令牌环网(Token Ring)以及后来的无线局域网(Wireless LAN)等标准。

四:以太网通信原理

解释:当一根水晶头网线(网线、光纤)连接着设备时所产生的网络,就是以太网。

Q:在同一个局域网中的主机,能不能直接通信呢?

A:当然可以!某些单机游戏,比如2K25,只需要两台手机连接到同一个局域网,就可以进入对方房间游玩!

1:Mac地址

Q:那以太网通信原理是什么?

A:老师在教室里叫一个王五的名字,其它同学听到了,但不是自己,则不做反应,只有王五会做出反应,这就是以太网原理!

而在一个局域网中,每个主机的名字就是Mac地址,Mac地址是由设备制造商固化在"网卡"中的全球唯一标识符,格式一般为:8位(6组)十六进制数,用冒号或减号分隔(00:1A:2B:3C:4D:5E),一般无法修改

所以当一个设备在一个局域网中发送信息的时候,会附带目标设备的Mac地址,然后局域网中虽然所以设备都会接受到信息,但是会对比信息中的Mac地址是否是自己的,是才应答!

认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点。
  • 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)。
  • 在网卡出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)。

2:数据碰撞

在同一个局域网中,有两个或两个以上的设备同时传输数据帧,导致它们的电信号在物理介质上叠加和相互干扰,使得所有数据都变得无法识别和无效的现象。

换句话说,就是两个及以上设备都在使用局域网,就会造成数据碰撞!所以每一个局域网都可以看作是一个碰撞域。

而以太网中若是发生数据碰撞的解决方案是著名的 CSMA/CD

  • CS (Carrier Sense - 载波侦听): “先听再说”。设备在发送数据前,先检测线路上是否有信号在传输。如果有,就等待。

  • MA (Multiple Access - 多路访问): “大家都能访问”。所有设备都连接在同一个共享介质上,享有平等的发送权利。

  • CD (Collision Detection - 碰撞检测): “边说边听”。设备在发送数据的过程中,持续检测线路上的信号。如果发现自己发送的信号与线上检测到的信号不一致,就判断发生了碰撞。

一旦检测到碰撞,设备会立即执行以下操作:

  1. 立即停止发送:立刻中止当前数据帧的传输。

  2. 发送拥塞信号:发送一段32bit或48bit的特殊“拥堵序列”,目的是强化碰撞,确保网络上所有设备都能感知到这次碰撞,并都丢弃不完整的数据帧。

  3. 等待一段随机时间后重试:这是最关键的一步。发生碰撞的设备都会随机等待一段不同长度的时间(这个时间通过一种叫二进制指数退避 的算法计算),然后再重新尝试发送。

所以可以认为以太网中产生数据碰撞,谁检测到谁就会休眠,等待一段时间后再尝试发送数据!

3:几个疑问

Q1:我想黑掉一个局域网,怎么办?

A:连进局域网之后,不断发送垃圾数据,让其一直处于数据碰撞状态,其他主机就无法上网了

Q2:局域网中,主机越多还是越少越好?

A:当然是少,因为其会大大减少了数据碰撞的概率!这就是为什么一个局域网多个人链接,会出现网络不佳的情况,本质就是在休眠,等待其他设备使用网络完成!而只有一个设备使用局域网的时候,则速度飞快!学校中举办运动会的时候,几千人在同一个地方,网络不佳,因为那个地方的数据碰撞太严重!

Q3:Mac地址是什么?

A:是一种硬件地址,网卡中内置的唯一值,是48比特位的数据,全球唯一!在Linux中可以通过ifconfig指令查询,其中的ether就是Mac地址!任何参与通信的设备都有唯一的Mac地址!
ether译为以太,这也证明了当前设备连接的就是以太网!

Q:为什么叫作以太网?

A:“以太网”的命名源于历史上的物理学概念——“以太”。在19世纪,物理学家们假设宇宙中充满一种不可见的、无所不在的介质“以太”,认为光波需要通过这种介质来传播,就像声波需要通过空气传播一样。后来的著名实验证明了以太并不存在。在20世纪70年代,Robert Metcalfe和他的团队在Xerox PARC发明了这种局域网技术。他们将其命名为“Ethernet”,灵感正来自于“以太”这个概念。其寓意是:信息和数据包就像在“以太”中传播一样,可以渗透到连接在这根电缆上的每一台电脑,象征着这种新技术的普遍连接性和传输能力。这个名字是对一个被抛弃的科学概念的致敬和巧妙借用。

五:解包分用和封装

1:解包分用和封装的流程

客户在应用层进行操作,才会产生数据,数据自顶向下,贯穿协议栈,在通过网络来到服务器这边的最底层,从最底层自低向上去贯穿协议栈到达服务器的应用层

就相当于你在A楼的五楼,你要去另一栋B楼的五楼,则你不可能从A的五楼飞到B的五楼,而是你先下楼,再经过一点徒步来到B楼,再上到B的五楼,而每下一层A楼的楼层和每上一层B楼的楼层,都是为了更好的到达目的地

左面的数据自顶向下的过程叫作封装,右面数据自底向上的过程叫作解包分用!

下面我们了解一下,封装到底指的是封装什么东西,解包分用解除哪一部分,又用上了哪一部分:

当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:

  • 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
  • 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
  • 网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
  • 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。

数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:

  • 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
  • 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
  • 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
  • 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用。

2:解包分用和封装的示意图

转化为图片如下:

所以,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来

注意:

①:不同协议层对该层的数据的叫法有所区别:在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。

②:有效载荷:对于任何一层来说,它从上层接收到的整个数据包(包括上层的报头和有效载荷),都会被它当作自己本层的有效载荷。所以自顶向下过程中有效载荷是不断增多的

③:在网络通信时,物理上,当然是各自贯穿协议栈!但是逻辑上,我们可以认为同层协议,都可以认为自己在和对方直接通信,因为从上面的图可以看出来画一条横线,同层协议得到的东西是一样的,就好比我们打电话,就好像我说什么对面就听到什么,感受不到封装和解包分用!

总结:

任何协议(特殊情况不考虑)都应该能做两件事情,这叫共性:
1:将报头和有效载荷进行分离
2:将自己的有效载荷交付给上层的那一个协议

3:几个疑问

Q1:报头是什么?封装报头有什么用?

A1:报头(Header) 是在原始数据前面添加的一小段特定格式的控制信息。一个典型的报头通常包含以下信息:

  • 源地址和目标地址:数据从哪里来,要到哪里去。

  • 协议/类型标识:指示里面封装的数据属于哪个上层协议或哪种类型。

  • 序列号:保证数据包按顺序组装。

  • 标志位:用于连接管理、流量控制等(如TCP中的SYN, ACK标志)。

  • 错误检测码:如校验和,用于检查数据在传输过程中是否出错。

其中的协议标志很重要,每层接受到的上层的封装后的数据中,报头中会说明上层是什么协议去封装的报头,这样当数据在右面解包分用的时候,它就知道该向上层的那个协议发送数据,因为不同协议的封装的报头是不一致的,分用的时候需要发送到正确的协议

Q2:物理层怎么没有体现到任何的作用?

A2:因为介绍封装和解包分用,所以不涉及到物理层,但是物理层不可缺少!物理层是数据的“搬运工”:它负责将数据链路层封装好的帧真正地搬上传输介质,并传输介质上搬下来

Q3:解包的时候,如何将报头与有效载荷进行分离?

A3:协议栈的每一层都要从数据中提取对应的报头信息,而要将数据中的报头提取出来,首先就需要明确报头与有效载荷之间的界限,这样才能将它们进行分离。而每一层添加报头时都是将报头添加到数据的首部的,因此我们只要知道了报头的大小,就能够讲报头和有效载荷进行分离。

Q4:分用的时候,当前层如何知道应该将有效载荷交付给上层的哪个协议?

A4:实际在每种协议的报头当中,几乎都会包含一个字段,表明我们应该把分离出来的有效载荷交付给上层的哪个协议,这就是分用的过程。

六:路由器通信

之前的以太网通信,是在同一个局域网中通信,那跨网络呢?我们生活中99%都是在跨网络通信,你用QQ发信息,PDD下单都是跨网络通信,因为对方不可能和你在同一个局域网的!

1:路由器的介绍

①:而跨网络最关键的就是路由器了,路由器至少都是至少横跨两个子网,并且路由器在所属的子网内,都被看做子网的一部分,其可以和子网主机通信!所以路由器横跨几个子网,就代表路由器可以和几个子网中的主机通信!(就好比一个人会几种语言,就可以和几种国家的人交流)

注:一个局域网可以包含多个子网,我们可以认为一个子网就是一个局域网

②:而我们知道在一个子网中,辨识主机靠的就是Mac地址,所以路由器横跨几个子网,则路由器就会有几个Mac地址!不管多少个,都是自带就配置了

③:如果路由器级跨越的的局域网可能采用的是不同的通信标准,比如局域网1采用的是以太网,而局域网2采用的却是令牌环网,由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。但是不必担心,路由器会出手来处理的,路由器会屏蔽不同局域网的差异!

2:IP地址和mac地址

在不同局域网中,Mac地址不能够区分唯一主机了,靠的是IP地址!只要跨网络,IP地址才是唯一标识符!

Q:MAC地址不是全球唯一的吗,为什么在跨网场景中,就不能标识唯一主机了?

A:这样理解:

  • MAC地址就像一个人的身份证号码。它是全球唯一的,永远不会变(理论上)。但如果你站在北京街头,仅凭一个广州人的身份证号码,你无法知道他在哪里,也无法把东西送给他。身份证号码没有“地址”的功能。

  • IP地址就像一个人的邮寄地址(例如:中国北京市海淀区XX路XX号)。这个地址明确地指出了设备在网络这个“地图”上的具体位置。邮差(路由器)可以根据这个地址决定如何路由,最终把包裹(数据包)送到。

认识IP地址

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

注:IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址。我们学的是IPv4

3:认路和屏蔽差异

Q1:路由器为什么能够“认路”?它怎么知道跨网的主机在路由器所属的子网中的哪一个?

A1:路由器其实是通过IP地址来确定数据的转发方向的,因特网上的每台计算机都有一个唯一的IP地址,而数据在向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址。

而路由器是工作在网络层的设备,这就意味着:

当路由器需要将一个局域网的数据转发到另一个局域网时,在路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层,此时在网络层就可以获取到该数据对应的目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网。

Q2:那不同的局域网不能对彼此的数据帧进行解包,路由器是怎么解决的?

A2:数据要从以太网1发送到令牌网2时,路由器收到局域网1的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到局域网2当中,此时该数据就能够在令牌环网当中传输了。

也就是,路由器会为数据换衣服,以太网的数据想进入到令牌网,它会给你脱外套,换上能进入令牌网的衣服,如下图红框中的一部分

转换为图如下:

正因为路由器能够屏蔽不同子网的差异,所以对于通信主机双方的IP层及其往上的协议来说,它们并不需要关心底层采用的是以太网还是令牌环网,它们认为只要填写了源IP地址和目的IP地址就能够将数据发送出去,因此现在主流的网络也叫做“IP网络”。

4:路由器通信原理

需要知道的是,IP是在网络层协议封装在报头中的,而Mac是链路层封装在报头中的,在路由器通信的过程中,IP和Mac都会用到,缺一不可!

①:Mac中的源Mac地址和目的Mac地址,二者都是会发生改变的
②:P中的源IP地址和目的IP地址,二者永远不会变

例子:

①:一个人去旅行,起始地是北京,目的地是西藏,北京就是源IP地址,西藏就是目的IP地址,不管你旅行到哪,这二者永远不会改变

②:上一站和下一站,在旅行的图中,会随时改变,上一站就是源Mac地址,下一站就是目的Mac地址

③:而正是因为上一站和下一站的变化,我们最终才能抵达西藏(目标IP),你不知道下一站去哪,你谈何抵达目的地?

④:所以目的地址是路径规划的依据,有了源IP,我们才不断的知道下一站目的Mac是什么 

而路由器通信的原理就是如此:

当主机1进行网络层封装的时候,此时的源IP是自己,目的IP是主机2的IP,此时源主机会判断目的IP地址与自己是否在同一网段,很明显不在

既然目标IP不在本局域网中,所以下层的链路层的封装就会把目的Mac地址填写成路由器的Mac地址(当然这个路由器的Mac地址是路由器在主机1的局域网中的Mac地址,暂且叫做Mac1吧),所以最后封装完成的数据会直接发给路由器

路由器收到数据后,其链路层对其进行解包分用,分离掉了链路层的报头,从剩下的部分中读取到了目标IP,此时路由器将目标IP和路由表进行对比,从而判断下一站,而在上图,直接就可以判断出目标IP所在的子网,然后路由器再次封装发送给主机2即可

而路由器封装之后的源Mac地址就变成了路由器在主机2所处的子网中的Mac地址, 也就是Mac2地址,目的地址就是主机2的Mac地址,而源IP目的IP,永远不变

因此数据通过路由器传输的过程中是有两套地址:

  • 一套是源IP地址和目的IP地址,这两个地址在数据传输过程中基本是不会发生变化的(存在一些特殊情况,比如在数据传输过程中使用NET技术,其源IP地址会发生变化,但至少目的IP地址是不会变化的)。
  • 另一套就是源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,因为在数据传输的过程中路由器不断在进行解包和重新封装。

有时候跨子网,可能需要经过多个路由器,横跨多种子网,无非就是源Mac和目的Mac改变的次数变多了罢了,道理和上图只经过一个路由器是一样的

所以,所以不管研究出什么子网,只要你的子网能够进入路由器,就能接入互联网

七:端口号

1:端口号的意义

大部分的网络通信行为,都是用户触发的。但在计算机中,谁表示用户呢?毫无疑问是进程!而当你在dy这个进程中使用类似刷新视频,搜索视频的功能,本质也是向服务器中的某个进程发出请求,而服务器的该进程会帮你完成操作,所以进程也叫做某种服务。当然,这个发出请求到解决问题的过程中,必定有封装和解包分用。

所以网络通信本质就是两个进程间的通信,这两个进程一般在不同的局域网中罢了!所以之前我们学的进程间通信是在同一网络中的,应用场景极少,网络通信才是主流!

所以现在就需要一种标识符来唯一表示进程,这样客户端进程发出的请求,通过网络传输后,才能在服务器端找到能够帮客户解决问题的进程,服务器端的进程解决问题后,才能找到客户端的那个发出请求的进程,这种标识符就叫做端口号(port)!

所以很显然,不是每个进程都有port,没有网络服务的进程就没有port!

Q:PID不是已经能够唯一标识进程了吗?为什么不用PID?

A:PID的确可以,但是设计者给网络专门设计了端口来唯一标识进程,就是为了你用你的,我用我的,达到松耦合的效果,说不定哪天操作系统又换设计逻辑了,抛弃PID了?我用我的端口号,永远不会受到影响!

端口号(port)的作用实际就是标识一台主机上的一个进程。

  • 端口号是传输层协议的内容。
  • 端口号是一个2字节16位的整数。
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。
  • 一个端口号只能被一个进程占用。

①:所以,要想找到互联网中的唯一的一个进程,只需:IP+port !

②:当数据在传输层进行封装时,就会添加上对应源端口号和目的端口号的信息。这时通过源IP地址+源端口号就能够在网络上唯一标识发送数据的进程,通过目的IP地址+目的端口号就能够在网络上唯一标识接收数据的进程,此时就实现了跨网络的进程间通信。

2:理解socket通信

socket通信和网络通信的区别:

socket在英文上有“插座”的意思,插座上有不同规格的插孔,我们将插头插入到对应的插孔当中就能够实现电流的传输。在进行网络通信时,客户端就相当于插头,服务端就相当于一个插座,但服务端上可能会有多个不同的服务进程(多个插孔),因此当我们在访问服务时需要指明服务进程的端口号(对应规格的插孔),才能享受对应服务进程的服务。

所以socket通信是一种通信方式,而网络通信是通过socket这种通信方式达到的目的!

好比,打电话时一种通信的方式,而给远方的人传递信息是通过打电话达到的目的!

当然,打电话也可以打座机,打手机,打QQ电话,打wx电话,打视频通话!

所以socket这种通信方式也不止一种!主流分为TCP和UDP!二者都是传输层上的协议!也就是说,我们想要通过socket这种通信方式去达到网络通信的目的,则需要和TCP和UDP打交道!!

Q:我不懂为什么想要使用socket这种通信方式,直接就需要和TCP和UDP打交道?网络通信不是那么多层吗?为什么非要选择和传输层打交道呢?为什么只用和传输层打交道就行了?

A:

①:传输层是第一个能提供“应用程序到应用程序”通信的层次,只有传输层才能通过端口号解决了应用程序进程到应用程序进程的通信问题,所以选择传输层!

②:至于为什么只用为什么只用和传输层打交道就行了?很简单,因为网络的设计者帮我们设计了简单的接口,接口会帮你调用了所有下层的功能。你无需关心底层细节,只需关注接口的使用!

③:所以设计者为TCP/UDP分别提供了一套接口,我们操作接口达到的是牵一发而动全身,让整个协议栈工作起来!从而实现网络通信!

注:为TCP/UDP提供的接口,统称为Socket API

类比生活:餐厅和后厨

  • 应用程序:是顾客。顾客只想点菜(发送数据)和吃到菜(接收数据)。

  • 传输层及以下协议:是后厨。后厨里有复杂的流程:切菜员(链路层)、厨师(网络层)、厨师长(传输层)。他们负责将原材料做成美味的菜肴,保证菜品的质量和顺序。

  • Socket API:是服务员。顾客不需要、也不能直接进入后厨对厨师指手画脚。顾客只需要跟服务员(Socket)打交道:“我要点这个菜(connect+send)”、“我的菜好了吗?(recv)”。

3:TCP/UDP的区别

总结表格

特性TCP (打电话)UDP (发短信)
连接面向连接(先握手建立连接)无连接(直接发)
可靠性可靠(不丢、不重、不乱序)不可靠(可能丢、重、乱序)
速度(因为要有额外控制)(没有额外开销)
数据顺序保证顺序不保证顺序
应用场景网页、邮件、文件、远程控制视频、直播、游戏、语音、DNS
编程复杂度高(需要管理连接状态)低(简单发送接收)

但是二者无优劣之分,各自有适合的场景,这也是为什么Socket API为TCP和UDP各自设计接口

八:网络字节序

计算机在存储数据时是有大小端的概念的:

  • 大端模式: 数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在内存的高地址处。
  • 小端模式: 数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在内存的低地址处。

网络的设计者规定:凡是想要经过网络传输的数据,必须先转换为大端数据,才能进入网络!这种统一的在网络中传输的数据,叫作网络字节序!

这个规定避免了在网络中出现大端和小端混合的情况,这让网络对数据的读取的效率提高!

而将数据转换为网络字节序的接口,已经实现并且提供给开发者使用:

#include <arpa/inet.h> // 包含这些函数的头文件uint32_t htonl(uint32_t hostlong);//将32位无符号整数从【主机字节序】转换为【网络字节序】uint16_t htons(uint16_t hostshort);//将16位无符号整数从【主机字节序】转换为【网络字节序】uint32_t ntohl(uint32_t netlong);//将32位无符号整数从【网络字节序】转换回【主机字节序】uint16_t ntohs(uint16_t netshort);//将16位无符号整数从【网络字节序】转换回【主机字节序】

重要记忆口诀

  • h 代表 host (主机)

  • n 代表 net (网络)

  • to 就是 “转换到”

  • l 代表 long (32位,如IP地址)

  • s 代表 short (16位,如端口号)

切记:只要在网络上发送或接收多字节的原始数据(尤其是IP地址和端口号),就必须使用这些函数进行转换! 这是网络编程中最常见的错误之一。

注:本文借鉴了博主2021dragon的部分图片和文字,在此表示感谢!

http://www.xdnf.cn/news/19470.html

相关文章:

  • 《论文阅读》从心到词:通过综合比喻语言和语义上下文信号产生同理心反应 2025 ACL findings
  • infinityfree mysql 加入数据库部分 filezilla 设备共享图片和文本不用浏览器缓存
  • 第六章 Vue3 + Three.js 实现高质量全景图查看器:从基础到优化
  • hive表不显示列注释column comment的问题解决
  • Linux signal 图文详解(二)信号发送
  • 为什么服务器接收 URL 参数时会接收到解码后的参数
  • DHT11-温湿度传感器
  • openEuler2403部署Redis8集群
  • 京东入局外卖,还有很多问题。
  • Ubuntu 服务器实战:Docker 部署 Nextcloud+ZeroTier,打造可远程访问的个人云
  • 学习 Android (十八) 学习 OpenCV (三)
  • OpenHarmony 分布式感知中枢深度拆解:MSDP 框架从 0 到 1 的实战指南
  • 餐饮外卖同城配送酒水寄存餐品加价换购促销小程序APP
  • Windows 安装配置解压版MongoDb
  • TFT屏幕:STM32硬件SPI+DMA+队列自动传输
  • 【RelayMQ】基于 Java 实现轻量级消息队列(五)
  • 2025 最新Vue前端面试题目 (9月最新)
  • AI 重构医疗诊断:影像识别准确率突破 98%,基层医院如何借技术缩小诊疗差距?
  • 设备服务管理上报方案
  • 两轮车车机 OS 演进路线深度解析
  • libmodbus源码分析
  • 【前端】《手把手带你入门前端》前端的一整套从开发到打包流程, 这篇文章都会教会你;什么是vue,Ajax,Nginx,前端三大件?
  • 差角函数差角矩阵位置编码
  • 无需服务器也能建网站:Docsify+cpolar让技术文档分享像写笔记一样简单
  • 手机版碰一碰发视频源码搭建,技术实现与实操指南
  • 鸿蒙开发进阶(HarmonyOS)
  • Unity中多线程与高并发下的单例模式
  • MobaXterm介绍
  • Git将多笔patch合并成一笔
  • 苹果 Safari 地址栏可能被超大光标视觉欺骗