经历过操作系统部分的拷打后,终于来到了计算机网络部分。网络虽然我们每天都在用,但是或许是因为太过于常见,而导致使用起来觉得很理所当然,深究其原理却又摸不着头脑,笔者从今天开始记录在学习计算机网络的过程中,一些重要的知识笔记和代码。尽可能有条理的分享我学到的知识。
在没有网络的时候,一台机器无法和其他机器进行联系,因此代码文件这种东西只能先通过一些像U盘光碟这样的东西储存起来,然后再给另一台机器使用,这样的效率太低下了。
随后出现了局域网,可以将几台机器进行连接
局域网越来越多,然后就出现了广域网
但是局域网和广域网其实只是一个相对的概念,比如我们国内的广域网其实就可以看作一个很大的局域网。
刚学网络可能对协议分层感到很抽象,举个例子,协议也就是约定。我们日常中想朋友进行交流,分享我们各自的信息,我们都说的是汉语,朋友能理解我说的汉语并提取信息,朋友对我也是如此,这其实就可以把汉语看作一种协议。
对于两台机器进行通信也是如此,我们需要先规定好双方的数据格式,这样才能理解对方发过来的信号的含义, 对于发送放也是如此。
比如我们小时候用座机打电话
从逻辑层面上来 ,我们跟朋友用汉语直接进行信息交流,而座机是用信号来传递信息的。
因此从物理层面上来说,我们打电话的时候,我们的座机首先将我们说的话转化成了电信号这些,经过座机的处理后,再将处理好的信号依据座机之间的协议传给了对方的座机,然后这个座机处理好信号后,再播放给朋友。至此就完成一个通话流程。
在这个例子中,我们的协议只有两层,一层汉语协议,一层座机之间的协议。在网络通信中会更加复杂,因此需要分更多的层次。
分层的好处就是封装,可以使整个体系变得高内聚,低耦合,使其维护成本降低。
五层包括 物理层,数据链路层,网络层,传输层和应用层,对于每层的描述可以大概了解一下
其中路由器这个东西,它不但在网络层中发挥了作用,它在数据链路层也可以起到交换机的作用,在物理层可以起到集线器的作用。
OSI模型和TCP/IP模型分层的对比
OS也就是操作系统,它和网络协议栈有什么关系呢?
用户操作接口可以看作是应用层。
在Linux内核模块中就有传输层和网络层
驱动程序就是数据链路层
网卡就是物理层
所以一个用户要是想要发送信息,那么就是从上到下,直到网卡。
所以网络通信的本质就是贯穿协议的过程。
TCP/IP的通讯流程
就如之前打电话的例子,虽然在逻辑层面上,我们是直接与朋友通过汉语进行交流的。然而,在物理层面上,我们的声信号会被先转化成电信号等等,然后再发送到远端的朋友的座机,然后这个信号又被翻译成声信号播放给朋友。这个声信号变成电信号的过程就是封装。
比如,我们通过网络在用户层给朋友发送了一个 “你好”。然后我们是用qq发送的,对于应用层,也就是这个qq来说,“你好”就是有效载荷,在一层会把“你好”封装,加上一个报头,这个报头也可以是当前这个用户所使用的qq的版本。这样这个信息就变成了报文,因此报文 = 报头 + 有效载荷。然后再将这个报文给下一层,直到使用以太网发送到另一台机器上,然后朋友的机器接收到这个信息后,就会从下往上对这个信息进行解包,也就是分用,每一层的解包会提取报文的报头,最终到用户时变只剩下了“你好”。
对于封装和解包,我们需要记住以下总结:
1.几乎任何层的协议,都需要提供将报头和有效载荷分离的能力。
2.几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一种协议的能力。(分用)
分用的示意图
首先我们要知道,每台主机在局域网上,都要有自己的唯一的一个标识。
在局域网中,每一个主机都有一个Mac地址来标记当前主机。来保证当前主机在这个局域网的唯一性。
如图,有四台机器,它们通过一个网线连接在一起,一旦有机器想要给另一台机器发送消息,那么这个信息就会随着网线传输过去。但是我们发现,因为在这根网线上不只有这两台机器,因此其他机器也会收到这个消息,问题就来了,这样话发送信息岂不是没有隐私了吗?
正常情况下,比如有H1向H4发送信息,那么这个信息中的特定位置包含了H1和H4的信息,其他机器收到这个信息后,首先会读取这部分信息,然后跟自己的进行对比,如果对比发现并不是发送给自己的信息,那么这个机器会直接丢掉这个包。
我们的网卡有两种模式,一种是正常模式,对处理信息的方式如上;还有一种就是混杂模式,即便这个消息不是发送给自己的,机器依旧不会丢掉这个包。
网络上的抓包就是基于这样的原理来获取信息的。
除了信息安全问题,还有一个就是当一台机器在发送消息的时候,如果此时还有一台机器在发送信息,那么就会发送失败,这个就是数据碰撞问题。发送主机都要执行碰撞避免的算法。
如果一个局域网对请求的处理能力有限,但是需要处理的请求又很多时,网络就会变得卡顿,原因就是发生了很多数据碰撞。比如我们在军训或者疫情期间在操场排队做核酸时,如果人很多,那么网络就会变得很卡顿。
如果一个局域网内的机器数量太多,可以使用交换机来划分碰撞域,这样可以减少碰撞的次数。
IP地址可以标识唯一的一台主机,而Mac地址只能标识当前局域网内唯一的主机。
在远距离网络传输中,一台主机通过网络向另一台主机发送消息,中间可能会经过很多个路由器
通过在局域网类以太网的通信原理,信息从发送方,到目的地,它的Mac地址可能会不断变化,而IP地址是始终不变的。
IP协议有两个版本,分别是IPV4和IPV6。现在主流还是IPV4。
IPV4协议,它是4字节,32位的整数。它的格式就是类似于192.168.1.1这样,每一个用点分隔的数字的范围是0~255,也就是一个字节的范围。不过目前IPV4可能已经有点不够用了,所以现在国家支持IPV6技术,只是现在推广度还不高,主流都还是IPV4。
令牌环网也是网络协议的一种,我们知道以太网通信,所有主机都能自由的发送信息,只是可能会发生数据碰撞而导致发送错误或失败。那么令牌环网就是在当前局域网内只有一块令牌,拥有令牌的主机才能发送信息,如果令牌传给了其他主机,那么发送信息的能力就只有得到令牌的主机才拥有,虽然听起来很像OS里面的锁,但是由于锁的概念只在OS中,所以这里管叫做令牌,不过令牌环网并没有以太网这么常用,所以这里只做了解。
比如在该场景中,用户发送了一个请求,那么这个请求就会从上到下依次进行封装,最后变成了帧,然后通过以太网被路由器所提取,那么首先路由器就要对这个帧进行解包,当然就读取到了关于Mac地址方面的信息,我们假设这个信息是Mac_c(发送方)和Mac_d(接收方)。然后路由器再根据IP信息(也分有发送方IP和接收方IP),分析接收方是否在路由器本地的局域网内,如果在,那么就重新封装然后发送给目的主机。这里需要特别注意的是,路由器拿到帧后,提取了对应层协议的报头信息后,是直接丢掉了报头信息,然后再重新封装成了一个新的帧,这个帧的Mac地址部分的发送方就变成了路由器--Mac_R,接收方依旧不变。
那么如果不在本地的局域网内,那么路由器作为中间人会做相同的事情,直到找到了目的主机。然后如果目的主机使用的是以太网,那么就按照以太网的协议对数据进行解包分用,如果是令牌环网,那么就按照令牌环网的协议来,最终也是从下至上层层解包和分用到达用户手里,至此就完成了一次简单的通信。
计算机技术和通信协议是计算机网络产生与发展的两个基本要素。
HTTP协议是超文本传输协议。
DNS协议为域名解析协议。
FTP协议为文件传输协议。
SMTP协议为电子邮件传输协议。
UDP协议为用户数据报协议,在传输层工作。
TCP协议为传输控制协议,在传输层工作。
IP协议为网际协议,在网络层工作。
ARP协议为地址解析协议,在网络层工作。
ICMP协议为Internet控制报文协议,它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,所以是通过IP协议来进行传输。
TCP协议为传输控制协议,在传输层工作。
UDP协议为用户数据报协议,在传输层工作。
SMTP协议为电子邮件传输协议,在应用层工作。
OSPF为开放的最短路径优先协议,在传输层工作。
传输层负责两端之间的数据传输。
网络层负责地址管理与路由选择。
数据链路层负责相邻设备之间数据帧传输,完成帧同步,差错控制,流量管理,链路管理。
物理层负责物理光电信号传输。
交换机在数据链路层,路由器在网络层。
MAC地址,也叫物理硬件地址,用于识别相邻的两个物理硬件设备,它的大小为:6字节。
MAC地址是物理网卡硬件地址,在出厂时就会设定,不能修改,它的大小是6字节,用于识别相邻设备,在链路层完成相邻设备之间的数据传输。
一台计算机可以绑定多个网卡,进而可以拥有多个MAC地址。
IP地址是一个数字,用于唯一标识网络中的一台主机。应用于网络层,基于网络拓扑描述起点和终点 。
Mac地址是物理网卡硬件地址,用于标识相邻设备,应用于链路层。
由于IP地址是一个逻辑地址,所以可以给MAC地址对应分配不同的IP地址,使网络通信更加灵活。
当需要跨网络进行传递的时候,也就是意味着需要找到该数据包的下一跳的MAC地址,所以认为从发送方出来,首先先到到达本网段的路由器,所以获取本网段的路由器的MAC地址。
每个网络都会有不同的网段,网段是该网络的标识,在该网络中分配的IP地址都会带有网段标识,标识自己所属网络,这样路由器才能进行路径规划,因此当主机改变所在网络时需要将IP地址改成该网段的ip地址,但是MAC地址不用修改,MAC地址本身也是不允许修改。
OSI的链路层通常同时使用报头和报尾进行封装。
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)。