⽹络基础概念

计算机⽹络背景

⽹络发展

独⽴模式:计算机之间相互独⽴

如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。

网络互联:多台计算机连接在一起,完成数据共享

局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起

后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念。

在局域网中有交换机设备,交换机主要负责局域网内部的数据转发,能够把数据在同一个局域网内从一台主机转发到另一台目标主机。

不同的局域网之间相互隔离,需要通过路由器进行连接,路由器主要负责跨网段、跨局域网的路由转发,实现不同局域网之间的数据通信。

⼴域⽹WAN:将远隔千⾥的计算机都连在⼀起;

各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网。实际局域网和广域网是一种相对的概念,我们也可以将广域网看作一个比较大的局域网。

初识协议

• "协议"是⼀种约定.

• 打电话约定电话铃响的次数的约定

"协议"本质就是一种约定,通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。

计算机之间的传输媒介是光信号和电信号.通过"频率"和"强弱"来表⽰0和1这样的信息.要想传递各

种不同的信息,就需要约定好双⽅的数据格式.

思考:只要通信的两台主机,约定好协议就可以了么?

• 定好协议,但是你⽤频率表⽰01,我⽤强弱表⽰01,就好⽐我⽤中国话,你⽤葡萄⽛语⼀样,虽

然⼤家可能遵守的⼀套通信规则,但是语⾔不同,即是订好了基本的协议,也是⽆法正常通信的

所以,完善的协议,需要更多更细致的规定,并让参与的⼈都要遵守。

• 计算机⽣产⼚商有很多;

• 计算机操作系统也有很多;

• 计算机⽹络硬件设备还是有很多;

如何让这些不同⼚商之间⽣产的计算机能够相互顺畅的通信?就需要有⼈站出来,约定⼀个共同的 标准,⼤家都来遵守这就是⽹络协议;

⼀般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公

协议分层

• 协议本质也是软件,在设计上为了更好的进⾏模块化,解耦合,也是被设计成为层状结构的

软件分层的好处

人与人之间通信使用的是汉语,我们可以将其称为语言层;而电话和电话之间通信使用的是电话系统相关的一些接口,我们可以将其称之为通信设备层。

后来随着科技的发展,我们都用上了智能手机,此时我们下层使用的通信设备变了,或是这部电话卖到了其他国家,此时上层使用的通信语言变了,但我们仍然可以正常沟通。

但是实际的⽹络通信协议,设计的会更加复杂,需要分更多的层

但是通过上⾯的简单例⼦,我们是能理解,分层可以实现解耦合,让软件维护的成本更低

OSI七层模型

• OSI(Open System Interconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考模型,是⼀个逻辑上的定义和规范;

• 把⽹络从逻辑上分为了7层.每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;

• OSI七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传输;

• 它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整.通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;

• 但是,它既复杂⼜不实⽤;所以我们按照TCP/IP四层模型来讲解.

• 其实在⽹络⻆度,OSI定的协议7层模型其实⾮常完善,但是在实际操作的过程中,会话层、表⽰层是不可能接⼊到操作系统中的,所以在⼯程实践中,最终落地的是5层协议。

这里了解一下就可以

TCP/IP五层(或四层)模型

TCP/IP 并不是单个协议,而是一系列网络协议的总称,统称为 TCP/IP 协议簇。

TCP/IP 协议采用五层网络模型,每一层都依赖下一层提供的服务,完成自身的通信功能。
1.物理层

负责光、电信号的传输方式。比如以太网网线双绞线、光纤、有线电视同轴电缆、WiFi 无线网络的电磁波等,都属于物理层范畴。物理层决定了网络最大传输速率、传输距离、抗干扰能力等硬件特性。集线器(Hub)工作在物理层。

2.数据链路层

负责局域网内设备之间数据帧的传输与识别。包含网卡驱动、帧同步、冲突检测、数据差错校验等功能。常见标准有以太网、无线局域网等。交换机(Switch)工作在数据链路层,依据 MAC 地址转发数据。

3.网络层

负责 IP 地址管理与路由选择。通过 IP 地址唯一标识网络中的一台主机,并依靠路由表规划两台主机之间最优传输路径。路由器(Router)工作在网络层,依据 IP 地址跨网段转发数据。

4.传输层

负责端到端两台主机之间的数据传输控制。典型协议为传输控制协议 TCP,保证数据可靠、有序、不丢失地从源主机发送到目标主机。

5.应用层

负责应用程序之间的业务通信,常见协议有邮件传输 SMTP、文件传输 FTP、远程登录 Telnet、HTTP/HTTPS 等。

我们平时做的网络编程,开发服务器客户端,本质就是开发应用层程序。

物理层属于硬件相关范畴,软件开发中一般很少关注,因此在网络编程学习中,通常会忽略物理层,直接称为 TCP/IP 四层模型。

不同网络设备对应实现的协议层次也不同:

1.主机(电脑 / 服务器):操作系统内核实现了传输层~物理层全部功能,是完整的协议栈。

2.路由器:实现了网络层~物理层,负责跨网段路由转发。

3.交换机:实现了数据链路层~物理层,负责局域网内部转发。

4.集线器 Hub:仅实现物理层,无脑广播信号,现已淘汰。

补充说明:以上是经典标准划分,现代设备并不绝对。

现在很多三层交换机也实现了网络层转发;很多路由器也实现了部分传输层功能(例如端口映射、端口转发、NAT)。

上⾯的内容,我们只是懂了⼀些基本概念,下⾯我们再次重新理解协议和协议分层。

为什么要有TCP/IP协议?

• ⾸先,即便是单机,你的计算机内部,其实都是存在协议的,⽐如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,⽐如:SATA,IDE,SCSI等。只不过我们感知不到罢了。⽽且这些协议都在本地主机各⾃的硬件中,通信的成本、问题⽐较少。

• 其次,⽹络通信最⼤的特点就是主机之间变远了。任何通信特征的变化,⼀定会带来新的问题,有问题就得解决问题,所以需要新的协议。

什么是TCP/IP协议?

• TCP/IP协议的本质是⼀种解决⽅案

• TCP/IP协议能分层,前提是因为问题们本⾝能分层

TCP/IP协议与操作系统的关系(宏观上,怎么实现的)

所以究竟什么是协议?

• 截⽌到⽬前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。

• OS源代码⼀般都是⽤C/C++语⾔写的。

问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?

回答:答案是肯定的!因为双⽅都有同样的结构体类型struct protocol。也就是说,⽤同样的代码实现协议,⽤同样的⾃定义数据类型,天然就具有"共识",能够识别对⽅发来的数据,这不就是约定吗?

关于协议的朴素理解:所谓协议,就是通信双⽅都认识的结构化的数据类型

因为协议栈是分层的,所以,每层都有双⽅都有协议,同层之间,互相可以认识对⽅的协

议。

以太网名字的由来

以太网(Ethernet)的名字来源于物理学历史上的以太假说。

早期物理学家认为光在宇宙真空中传播必须依靠介质,于是假设宇宙中遍布一种看不见的介质 ------以太(Ether),用来传递光波。

后来迈克尔逊 - 莫雷实验证明以太并不存在,以太假说被彻底推翻。

后来局域网网络技术诞生,这种技术可以在局域网内传输数据、充当信息传播的媒介。人们为了纪念历史上的以太假说,同时寓意该技术是传递信息的通用介质,因此将这种局域网标准命名为以太网(Ethernet)。

网络传输基本流程

局域⽹(以太⽹为例)通信原理

• ⾸先回答,两台主机在同⼀个局域⽹,是否能够直接通信?可以

• 原理类似上课

• 每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址

简单认识MAC地址

• MAC地址⽤来识别数据链路层中相连的节点;

• ⻓度为 48 ⽐特位,即 6 个字节.⼀般⽤ 16 进制数字加上冒号的形式来表⽰(例如:

08:00:27:03:fb:19)

• 在⽹卡出⼚时就确定了,不能修改.mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些⽹卡⽀持⽤⼾配置mac地址).

MAC 地址是网卡物理地址,二层地址,用于局域网内部寻址;

• 以太⽹中,任何时刻,只允许⼀台机器向⽹络中发送数据

• 如果有多台同时发送,会发⽣数据⼲扰,我们称之为数据碰撞

• 所有发送数据的主机要进⾏碰撞检测和碰撞避免没有交换机的情况下,⼀个以太⽹就是⼀个碰撞域

• 局域⽹通信的过程中,主机对收到的报⽂确认是否是发给⾃⼰的,是通过⽬标mac地址判定

初步明⽩了局域⽹通信原理,再来看同⼀个⽹段内的两台主机进⾏发送消息的过程


⽽其中每层都有协议,所以当我进⾏进⾏上述传输流程的时候,要进⾏封装和解包

下⾯我们明确⼀下概念

• 报头部分,就是对应协议层的结构体字段,我们⼀般叫做报头

• 除了报头,剩下的叫做有效载荷

• 故,报⽂=报头+有效载荷

然后,我们在明确⼀下不同层的完整报⽂的叫法

• 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在⽹络层叫做数据报

(datagram),在链路层叫做帧(frame).

• 应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装

(Encapsulation).

• ⾸部信息中包含了⼀些类似于⾸部有多⻓,载荷(payload)有多⻓,上层协议是什么等信息.

• 数据封装成帧后发到传输介质上,到达⽬的主机后每层协议再剥掉相应的⾸部,根据⾸部中的"上层协议字段"将数据交给对应的上层协议处理.

在⽹络传输的过程中,数据不是直接发送给对⽅主机的,⽽是先要⾃定向下将数据交付给下层协议,最后由底层发送,然后由对⽅主机的底层来进⾏接受,在⾃底向上进⾏向上交付。

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

1.文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。

2.传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。

3.网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。

4.链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:

1.链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。

2.网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。

3.传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。

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

什么是报头?

报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。

数据的封装与解包:

数据封装,实际就是不断给数据加上各种对应的报头,这些报头里面填充的就是对应的各种协议细节。

数据解包,实际就是不断从数据中提取对应的报头,并对提取出来的报头进行数据分析。

报头与有效载荷

当对端主机收到数据后,需要自底向上贯穿协议栈,依次进行数据的解包与分用。在这个解包的过程中,每一层的协议只需要提取出数据中对应的报头,然后对该报头进行分析处理,而剩下的数据则直接交付给上层就行了。

因为每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容根本不必关心,我们将数据中除当前层的报头以外的数据叫做"有效载荷"。

需要注意的是,上层协议在数据封装时添加的报头信息,在下层协议进行数据解包时看来就是有效载荷。比如数据封装时应用层添加的报头信息,在对端主机进行数据解包时,在对端主机的传输层、网络层以及链路层看来,该应用层曾经添加的报头信息就是有效载荷。

如何将报头与有效载荷进行分离?

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

获取报头大小的方法通常有两种:

定长报头。顾名思义就是报头的大小是固定的。

自描述字段。报头当中提供了一个字段,用来表示报头的长度。

实际上每个协议都要提供一种方法,让我们获取到报头的大小,这样我们才能在解包时将报头与有效载荷进行分离。

局域网内传输数据时,该局域网内的所有主机都能收到

实际当主机A想要发数据给主机B的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。

也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了任何数据,只不过经过筛选后只提交上来了发给自己的数据。

什么是碰撞?

当主机A在向主机B发送数据时,其他主机彼此之间可能也正在进行通信,甚至主机A在和主机B通信的同时也在和其他主机进行通信。

但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰。

每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞。

如何判断发送出去的数据是否发生了碰撞?

因为发送到局域网当中的数据是所有主机都能够收到的,因此当一个主机将数据发送出去后,该主机本身也是能够收到这个数据的。当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞。

也就是说,主机实际是能够通过某种方式,知道曾经发送出去的数据是否发生了碰撞的。

发生碰撞后是如何处理的?

当一个主机发现自己发送出去的数据产生了碰撞,此时该主机就要执行"碰撞避免"算法。"碰撞避免"算法实际很简单:当一个主机发送出去的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据。这就像现实生活中的两个人同时想要说话,此时对方就都会说"你先说吧",这实际上就是一种碰撞避免。

需要注意的是,实际在网络通信压力不大的时候发生碰撞的概率是不大的,我们不要太小瞧计算机的处理速度,也不要太小瞧网线传播数据的速度。

每台主机的操作系统内核,都实现了一套完整的 TCP/IP 协议栈(从物理层到应用层)。
当主机 A 给主机 B 发数据时:
A 的协议栈:把数据层层封装,最终变成以太网帧(带上目标 MAC)。
交换机:根据目标 MAC,把帧转发给 B。
B 的协议栈:收到帧后,层层解封装,还原出原始数据交给应用层。
所以说,通信的主体其实是两台主机的协议栈,应用层只是最终数据的使用者。

局域网通信为什么用 MAC 地址,不用 IP 地址?

交换机工作在数据链路层,只识别 MAC 地址,不识别 IP 地址。

同一局域网内,主机之间是二层直连,不需要路由,IP 地址的作用在这里不体现。

IP 地址是跨网段寻址用的,MAC 地址才是局域网内的物理寻址方式。

跨⽹络传输流程图

IP 协议目前有两个主流版本:IPv4 和 IPv6。

IP 地址是 IP 协议中,用于唯一标识互联网中不同主机的网络地址。

IPv4 地址长度为 4 字节(32 位)整数。

日常使用点分十进制格式表示 IP 地址,例如 192.168.0.1;

每一段数字对应 1 个字节,取值范围 0~255。

IPv6 是什么?

IPv6 是下一代 IP 协议,用来解决 IPv4 地址枯竭问题。

IPv6 是 128 位 超长地址。

IPv6:冒分十六进制

2001:0db8:85a3:0000:0000:8a2e:0370:7334

特点:

8 组 4 位十六进制数,用冒号分隔

连续 0 可以压缩省略(双冒号::简写)

跨⽹段的主机的数据传输.数据从⼀台计算机到另⼀台计算机传输过程中要经过⼀个或多个路由器.

下⾯是⼀张⽰意图

客户端 FTP 生成数据 → 交给 TCP(加 TCP 头)

TCP 报文 → 交给 IP(加 IP 头)

IP 数据包 → 交给以太网驱动(加以太网帧头,填路由器 MAC)→ 发到以太网

路由器收到以太网帧,解封装到 IP 层,查到目标服务器 IP,选择出口

路由器重新封装成令牌环数据帧(填服务器 MAC),发到令牌环网

服务器收到帧,逐层向上解封装:数据链路层→网络层→传输层→应用层 FTP

FTP 服务器拿到原始业务数据,处理文件请求

⾸先理解⼀下IP地址的意义

• 为什么要去⽬标主机,先要⾛路由器?

• ⽬的IP的意义

然后结合封装与解包,体现路由器解包和重新封装的特点

IP 地址和 MAC 地址,是网络中两个完全不同层级的地址,它们的作用、生命周期都不一样:

IP 地址:全程不变的 "起点和终点"

IP 地址是三层逻辑地址,用于标识源主机和目标主机,也就是通信的起点和终点。

在一次跨网通信中,源 IP 和目的 IP 在传输过程中全程保持不变,不会因为经过不同网络设备而改变。

MAC 地址:每一段路程的 "临时换乘站"

MAC 地址是二层物理地址,只在同一个局域网内有效,用于局域网内部一跳一跳的转发。

当数据包跨多个网络传输时,源 MAC 和目的 MAC 会在每一段链路动态更新,就像你从山西到北京,每换一趟车,你的 "上下车站点" 都会变,但你的最终目的地(北京)始终没变。

总结:

IP 地址是你要去的终点城市,全程不变;

MAC 地址是你每一段路程的上 / 下车站点,每过一个局域网就会更新一次。

提炼IP⽹络的意义和⽹络通信的宏观流程

• IP⽹络层存在的意义:提供⽹络虚拟层,让世界的所有⽹络都是 IP ⽹络,屏蔽最底层⽹络的差异

IP 网络层屏蔽了底层不同局域网的链路协议差异,向上提供统一的 IP 寻址接口,让上层应用只需要关心源 IP 和目的 IP,无需感知底层具体传输方式。

相关推荐
LZZ and MYY1 小时前
RTS 在windows和Linux之间ShareMem
linux·运维·服务器
aningx1 小时前
openSUSE Leap 16.0 运行 sunshine 报错的解决方法
linux
爱学习的徐徐1 小时前
Linux 基础IO
linux·服务器
xiaobobo33301 小时前
面向对象:linux内核中函数转数据的用法
linux·面向对象·隔离·函数指针绑定
姓刘的哦2 小时前
C++软件架构设计思路
linux
ModestCoder_2 小时前
windows/ubuntu解决挂梯子但是codex reconnecting五次的问题
linux·windows·ubuntu
禹凕2 小时前
Linux基础——环境
linux·运维·服务器·ubuntu
好好风格2 小时前
【一行代码】查看本机公网 IP
linux·命令行
2601_959480152 小时前
Moneta Markets亿汇:“网络安全新盾快速登场”
网络
leo__5202 小时前
随机接入退避算法过程模拟实现
网络·算法