【网络基础一】几乎不讲任何网络协议细节,搭建网络基本结构


统编程帮助我们处理数据,网络编程帮助我们获取数据,网络配上我们写的线程池模块很快就搭建起来了。

问题

网卡是文件吗?
是的,所以未来网络通信的本质反馈到编程上他就是文件操作,所以未来网络各种协议都不要管,
就记住文件里写,就是往网卡里写,往网卡里写就是往网络里写。

局域网和广域网只是相对的概念
我们认为在你家里就是一个局域网,如果你访问自己的服务器,那么就是访问广域网。

网络发展是历史的必然,如果没有网络那么每个人关注数据处理数据的点不一样,那你用U盘传效率太低,所以就会有网线把所有计算机连起来,每个人想要数据从服务器上去拿。
随着发展可能一个局域网要和另一个局域网共同处理一个项目,所以把两个不同的子网链接起来也是发展的必然。

认识“协议”

计算机里因为数据经过长距离传输,所以沟通的成本就高了,距离变成,信息传输衰减是问题,传递过来的信息我得知道这信息是什么意思,所以长距离传输是需要定一些协议的。

例子:你去上大学,老爹在老家有一部座机,你给家里打电话 响铃一声,2声,三声,你和老爹约定好了这三种情况都是啥意思,这个东西就叫做协议。
从故事里得到一个结论,一个问题。
结论:我们可以通过协议降低沟通信息的成本。所以协议本质是一种约定,通过双方规定的方式,减少沟通成本。
问题:我们在计算机领域的协议该如何理解他呢?
不管如何,我们定协议是为了解决计算机通信问题,把问题罗列出来协议能解决什么问题也就清楚了,协议就是解决通信问题的。

计算机通信问题

技术问题

长距离传输的数据丢失的问题 1.你怎么知道丢了 2.丢了之后怎么办 》tcp协议
如何定位主机的问题-》ip协议
你怎么保证你的数据能准确到达下一个设备 -》数据链路层
这几个问题假设都解决了,我能精准定义某一个主机把数据传给另一个主机了,这个传数据给远端主机是目的吗?

应用问题

把数据传送给远端不是目的,我们要的是如何处理发来的数据? 》https http ftp协议…
他是让我干什么呢?是让我上传还是下载?

主机是对称的,发送方和接收方都有相同的这样的问题,所以我们就要在双方机器上每一层对应的问题都要解决。
那我们怎么做的,所以每一层都要有自己的协议。

在这里插入图片描述
为什么网络会有这些问题呢?
如果今天两台机器就在一块会有这样的问题吗?
根本原因就是单纯的传输距离变长了!

我们实际生活中收快递,假如你买了一个洗面奶,可是你会收到多出来的快递盒子,盒子上的各种信息字段,这个多出来的信息字段就叫做协议的报头。

如果用C语言想把快递单描述起来该如何描述?
用C语言该如何描述这个报头呢?答案就是你会用结构体。
你要发“在吗“”这个字符串,只要把在吗拷贝到结构体后面你就构建了一个报文。

协议的最终结论
协议是双方的约定,最终他的表现形式就是结构体对象

所以左侧机器定义结构体A,右侧机器也认识结构体A,对端也能立马认识这个 结构体,因为我们类型是一样的,所以就可以跨主机基于结构体快速形成约定。

思考:
只要通信的两台主机,约定好协议就可以了吗?
在这里插入图片描述

标准定出来之后,从硬件到软件,协议是标准的子集

问题
能不能告诉我一些软件分层的场景?什么叫做软件分层啊?
我们学习过的linux操作系统就是分层的
具体如何分层的例子有:继承和多态带来的软件的意义不就是在做软件分层吗?
基类就是上层,子类的各种多态化实现就是下一层,所以你改下一层并不影响上一层,这就是典型的软件分层。

我们学习虚拟文件系统时,不同的硬件对应struct file中对应不同的指针指向读写方法,就是在用户和硬件驱动之间加一层软件层。

软件分层不一定非得是上下的关系,也可以是左右的关系,比如虚拟地址空间的分层将进程管理和文件管理很明显就区分开了。

软件分层上的结论
它最典型的表现是在结构体或类的设计上,在数据层面上作分离。
第二种,回调函数,通过回调的方式在软件逻辑上分层,大部分的分层既是在数据结构上分层,又是在软件逻辑上分层,这样代码耦合度就低了也就好维护了。

为什么我要分层呢?
一旦分层最大的好处就是层和层之间,它代码耦合度降低了,大项目被肢解为多个子项目,这样后期维护成本非常低。
遵守的维护原则让层和层之间他的耦合度降低,层和层不要有太多的交互,要交互接口一定设计的非常轻量化。
凡事划分同一层内部,大家的代码和数据和逻辑都必须是强相关的,这叫高内聚。

协议分层

为什么网络协议是层状的呢?
原因:
技术上的原因
1.网络通信时规模太大了
实际情况的原因
2.协议本身是解决问题的,刚好你的问题是层状的,所以协议定义出来也是层状的。
比如你得先解决主机到下一跳主机的问题,解下的问题是如何定位目标主机的路由问题,解决之后A到B主机的问题后,但我并不能保证可靠性,所以继续衍生到可靠性问题。下一组问题是你打算把数据怎么处理?
所以软件协议就进行软件分层方面 的设计了。

自此把软件协议从是什么,为什么,后面大部分都在说一个问题,如何进行分层?每一层究竟有什么,协议是怎么解决这些问题的。


在这里插入图片描述
张三和李四 打电话实际上认为人和电话在沟通

但是重要的是 逻辑上我们认为 人和人,在同一层进行直接交互,电话和电话在沟通。

语言层,我们有协议,比如你不是上来就说话,而是简单握手比如 喂,电话层的协议就更不用说了。
打电话场景中,同层协议能做到高内聚,层和层之间就叫做低耦合,电话的协议用户不关心,用电话的人说中文还是英文,电话一点不关心。
层和层交互时我们只用一个话筒就可以交互了。

所以层状结构的好处就是好维护,一层出问题只会影响某一层本身,不会影响上一层,甚至我把电话层全换掉,也不影响上一层,上一层也可以换。

所以分层最大的好处在于通过高内聚低耦合可以大大降低软件维护的成本。

那么网络分层应该怎么分层呢?

OSI 开放系统互连组织 定制了网络标准 分了七层
在这里插入图片描述

虽然他定制的标准很好,但是工程实践时发现有些东西做不进操作系统内核中,
所以实际被划分成五层协议,叫做物理层,数据链路层,网络层,传输层,应用层。

物理层我们学软件就不关心,不考虑。
所以只剩四层。

标准还能改?人家定了七层
实践时其实整个协议栈中 会话层 和 表示层 肯定是有的,如果没有就很容易出问题的。

链路层, 网络层,传输层 直接就可以在OS内核实现。因为会话 表示 在OS实现不合适,而是把上三层压缩层一层了叫做应用层,刚好就是五层,并不是它偷工减料。

站在纯操作系统层面,最重要的两层协议就是 网络层(最具有代表性的协议叫IP) 和 传输层(最具有代表性的协议叫TCP),又因为这两层最重要我们又把这样的网络协议栈命名为TCP/IP协议栈。

我们自底向上聊一聊每层都干嘛

物理层
负责光电信号的传递,我们经常看到的网线也叫双绞线。
光纤
集线器,光电信号在发热后传送效率就降低了,信号强度降低了,集线器在物理层做信号放大,他不就可以传送距离更远了。

数据链路层
网络通信前提是首先把数据交给下一个设备,比如你连着家里的无线路由器,你要访问抖音前提是把访问请求交给路由器,让后家里路由器把数据传递出去。
所以数据链路层它主要解决同一个局域网中两台设备数据帧的传递和识别。
例如 网卡设备的驱动,交换机。

如果现在直接两个相连的设备可以互相跳转了,所以世界上就会有两个毫不相干的入网设备就有了可能会互相连通的前提。
在这里插入图片描述

下一个问题就是我们要对每一台机器要有身份识别或者唯一性的标识,支持我们未来在网络中进行路径选择,找到目标主机。
关键问题是你为什么选择红色路径而不是其他路径
在这里插入图片描述
网络层
主机定位的问题,数据包路由的问题
重要设备:路由器

我们已经解决数据从A能送到B了,但你怎么保证数据传输不会出问题呢?
传输层
解决数据通信的可靠性问题

应用层
数据传过去到目标主机不是目的,而是数据怎么应用。

随着网络拓扑结构的复杂,伴生处理复杂问题的中间设备:交换机,路由器,集线器。
他们工作在那一层不代表他只有这一层的功能。
比如路由器工作在网络层不代表他只有网络层的功能,他把网络层及其之下的所有层的功能他都有,比如他也有交换机和集线器的功能。

从此往后我们只谈四层。


OS,网络协议栈

网络协议栈和我们之前学习的OS有什么关系?
在这里插入图片描述
所以网络协议呢 他和OS之间的对应关系是这样的。

物理层很好理解就是网卡,本质上就是硬件
数据链路层是软件,他在各种软件驱动内部实现的,它就属于网卡驱动的一部分
在这里插入图片描述
传输层和网络层是真正在Linux内核中实现的,他是内核中的模块!
所以网络层和传输层就是操作系统一部分。

用户要访问抖音,用户就要访问网卡那就是访问硬件,必须得贯穿OS,而OS又必须保证自身安全,所以网络协议层就必须要提供系统调用给上层访问。

目前大部分就是传输层提供的系统调用。
有了系统调用把数据贯穿OS交给网卡,再把数据发送出去。
此时开发者基于系统调用就可以写出很多应用层协议,比如http、smtp、DNS等。

另一些用户就可以直接用这些协议就可以了。
在这里插入图片描述

网络通信的本质: 就是贯穿协议栈的过程,无非就是从上往下,还是从下往上贯穿。
在这里插入图片描述
不同平台OS部分不一样都没关系,因为网络都一样,脑子里不要只放一台主机,而是多台主机。

标准的制定让大家的每一层都相同,具有相同的协议,逻辑上我们又认为同层协议在逻辑上直接在和对方在沟通。

网络传送宏观流程

先上一个结论
局域网 的两台主机数据是可以直接通信的,比如宿舍用网线把两个电脑连起来就能打游戏。
这种技术保证叫局域网协议,典型的协议有:以太网,令牌环网,无线LAN。
时代最终选择了以太网和无限Lan
以太网这个名字这么奇怪?
以太本来是预言光电传播宇宙中的介质,但是宇宙里是真空的,后来计算机科学家调侃物理届,我们能将光电信号从A传到B

在这里插入图片描述

网络协议栈的层状结构中,每一层都有协议,我们之前讲了用户要发送你好,必须要多带一点东西,例如应用层一般都需要带上协议的版本V1的报头信息。
你好这个数据不是给应用层而是要交给用户,V1这个版本才是要交给应用层。

与此同时,网络在通信时必须贯穿协议栈,因为你最终需要网卡把数据收发的,所以应用层必须要把数据向下进行交付,此时到达传输层,他也要能够保证报文能够传输给对方,他也要有自己的协议,例如,要保证报文是有序的,所以传输层也要有自己的报头,给报头再添加上数据顺序的序号。

此时到了网络层,你至少得知道主机给另一个主机发了消息,所以网络层就必须约定好另外一个协议报头字段,就必须得写,我是谁,我要去哪里,如果这个报文到对方了它就知道了 澳原来是给我的啊。

继续向下到达数据链路层,要添加链路层的协议,他至少也要知道数据包要发给谁。

在左侧我们把这个数据的自顶向下交付,称作完成了一个叫做封装的过程。

我们把每一层添加的不同的形状的图像叫做,每层要添加报头。

应用层 v1叫 做应用层的报头,去掉报头,剩下的叫做 报文的有效载荷

报文 = 报头 + 有效载荷

到了传输层,传输层的报头就是 圆形的序号,传输层关心v1版本吗, 你好 吗?它根本就不关心,他只关心自己的报头序号,剩下的v1和你好就是自己的有效载荷。

首先局域网两台主机可以直接通信,链路层再往下就有网卡,数据就可以通过报头,经过以太网把信息交给了对方主机上,它抓到了报文之后,一定是对方的网卡先拿到了数据,为什么一定是网卡先拿到了数据?网卡要把数据交给OS,
把数据从硬件外设 交到内存里,OS就在内存里,交给OS然后才有数据链路层,网络层,传输层,我们说过了他们本来就是软件写到OS里了,为什么网卡要交给OS也就是内存里呢?
因为冯诺依曼体系规定 外设拿到数据必须要被CPU处理必须先把数据导入到内存里。

同层协议,代码一样 ,数据类型一样,你加的报头我认识,接收方他能区分那部分是报头那部分是有效载荷。
我们可以用数据指针强转成结构体指针,想怎么提报头数据就怎么提,这就叫报头解析
在这里插入图片描述
所以这一层就可以将报头和有效载荷分离,报文最终要交给应用层,它就要把自己的报头去掉,有效载荷交给上一层,对方发什么对端收什么,曾经最底层协议报头都在最外侧,所以交付上来时最外层报头就是ip层的报头了。
所以继续指针强转,报头直接提出来,报头和有效载荷就分离了,然后继续交给上一层,直到交付给应用层。
在这里插入图片描述
应用层继续报头和有效载荷分离,把有效载荷你好交付给了用户。

用户曾经在自己的这一层想发送你好,对方收到你好。
曾经传输层,网络层,链路层想发送各自的报头,对方也收到同样的报文,
这不就叫做同层协议在逻辑上和对方直接在沟通

因为分层的存在,传输层不关心上下,只关心传输层和传输层之间如何正常通信。

我们又发现,当数据包到达目标主机之后要进行自底向上不断交付的过程,这个过程显然是不断再去掉报头的过程,我们管他叫做解包

另外比如链路层还要决定把报头交给ip,ip还要决定把报文交给TCP,那你为什么不交给UDP啊?TCP还要决定交给FTP,那你为什么不给HTTP?
这就叫做分用

两台主机在进行通信时,在局域网中可以直接通信。
通信的过程,本质就是不断的封装和解包的过程!


问题

1.你把一碗水倒到桶里的水里面,可是你必须要把这碗水从桶里面分开,所以你把水放到瓶子里面在进到桶里就可以把瓶子拿出来就可以分开了。我在说什么,
几乎每一层协议他在定义时封装时,就必须考虑未来怎么解包。

所以几乎可以断言

扩展:
1.几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力
2.几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力,称之为分用
你怎么突然说这两条呢?
面对封装和解包,才不会困惑
大部分协议的共性,未来我们学习具体协议的时候,我都会问这两个问题!

以太网通信

两个主机在以太网上是如何进行通信的?也就是数据链路层中局域网通信的过程。

前提:每台主机在局域网上,都要有自己的唯一的一个标识

1、一个故事
以太网通信相当于我们在教室里上课,每人都有自己的名字,其中一名同学叫张三,还有一人叫李四,老师说话:张三你的作业呢给我看看。
当老师说这句话的时候所有人是不是全部都听到了?是的,但是只有张三会站起来。那李四为什么不站起来呢?这就说明所有人都收到报文,而且还对报文做提取,你做了张三和李四的对比,发现不是给你的就把这个报文丢弃了。所以张三才站起来,他说我给你作业了,你是不是忘了,这句话每一人都听到了,李四会不会回复这句话呢?不会,对比报文提取报文继续舍弃这个报文。
至此在教室里成功老师和张三进行了一次通话,张三和老师互相认为和对方沟通,但实际上有一大批吃瓜群众,这种通信方式就叫做局域网,也叫做以太网通信原理。
在这里插入图片描述

2、一个原理

为了更好的标识每一台主机,所以每一台主机都有自己的Mac地址。
网卡上的48bit位的序列号就叫做MAC地址,一般是全球唯一,实际上只需要保证局域网唯一性就可以了。

则数据链路层的报头里必须要有 src mac 和 des mac
在这里插入图片描述

主机发送h1->h10的报文,会在数据链路层中 以太网驱动程序做判断,判断报文是不是给局域网中某个主机的,如果不是就直接丢弃,上层不知道你曾经收到过这个报文就好像这个主机从来没收到过这个报文,如果是自己的才会向上交付。
所有在同一局域网中的主机都能收到这个报文,都能看见,就会有数据安全问题。
在这里插入图片描述
这就叫局域网通信原理。

如果h1再给h10发消息,那如果h2也想给h3发消息呢?就像教室里课间休息彼此声音里乱糟糟的。

如果我正在发消息,周围也有人发消息,这是就会发生以太网数据碰撞问题
所有人的消息也就全部失效了,光电信号都乱完了。
如果我今天想搞掉一个局域网,我只需要不断向局域网发送垃圾信息和正常局域网发生碰撞,我就能搞到一个局域网。
例如,你上网,其他人在下载大数据文件,你就会卡,这就是增加碰撞概率。

如果发生碰撞,发送主机都要执行碰撞避免算法,算法是以太网驱动程序自己定的。

既然发生了碰撞,我就等一会在发送,错峰出行,随机数生产延迟时间。

所以把局域网构成的众多主机叫做 碰撞域

你怎么知道发生碰撞了?

局域网发送的报文自己能收到吗?我自己在教室说话我自己能听到吧,所以发送主机可以甄别自己的报文就能够检测到发生碰撞,就执行碰撞避免算法。

安全问题
h1给h10发消息时,你的数据其实在局域网进行裸奔,其他主机能拿到,他也可以抓上去让上层看到,这好不好啊?
正常情况网卡直接丢弃不属于自己的报文,但是也可以让网卡工作模式变为混杂模式,接受不属于自己的报文。

那这里会不会存在安全问题呢?
会。
关键问题不在于别人吧数据抓了,关键问题在于你发的数据从哪来?
关键是你的数据从哪里来啊?从顶层来的,以太网虽然都能被别人看到,但是不要紧,我们会在应用层进行加密,实际上抓到了他也看不到,除非从头到尾你没加密。

所以你的意思是任意时刻局域网中只有一台主机可以往局域网中发送消息吗?
因为两个以上的发送主机不就碰撞了吗?我就是这个意思!

思路
局域网的主机越多,碰撞的概率越大?
是的,比如你上公开课那就肯定安静不下来,那不就是大家在碰撞吗
如果非要让局域网很大,我们可以引入交换机,他也是一台机器,只不过h1想和h7交互,交换机判断h1和h7都在交换机左侧的话,他也就不必转发到h7的右侧了,这里可以通过交换机有效减低数据包碰撞的概率,因为它防止了数据包在更大的局域网中扩散。
在这里插入图片描述
如果交换机右侧有碰撞的报文,碰撞的报文也就不会被交换机交换到左侧。

交换机的核心工作:划分碰撞域。

重新看待局域网的方式。
如何看待局域网
所以你的意思是整个局域网中任意时刻只有一台主机可以往局域网中发送消息吗?
不要用你的感知去评估光电的速度,虽然只有一个主机可以投递数据,大家不要害怕,这个过程非常快。
任何主机都可想局域网发消息,但任意时刻只允许一台主机想局域网发送消息,
所以局域网是不是所有主机的共享资源?是的。
任意时刻只允许一台主机想局域网发送消息,这个过程不就是要在使用共享资源时保证共享资源的互斥访问,他不是通过加锁完成的,而是通过发生错误然后重新发,相当于它假设自己在用的时候没有人会使用这个共享资源。
所以局域网可以看做成多台主机共享的临界资源。

所以在我看来,向网络里发送,进行网络读网络写,最终也是进程在网络读网络写。
所以每台主机的背后都是进程。
所谓的碰撞域,碰撞检测就为了保证临界资源数据一致性。碰撞了我在写你也来写吗?
所以系统网络不分家。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值