软件最需要知道的计算机网络,DHCP,APR,DNS,CDN这一篇就够了

几乎每个学习过计算机网络的人,都是从老师敲黑板,划重点的OSI七层模型讲起,有没有真的理解透彻不要紧,记下来要考的!!!然而作为一个非硬件方向的软工妹纸,最怕面试官往这个里面深问细问,哈哈哈哈不知道大家有没有这种感觉。

为什么网络要分层?

这其实很好理解,隋朝开始就有吏部、户部、礼部、兵部、刑部、工部了,一个庞大的组织要管理好必须要拆分出来,各有各的职责出了事情直接定位,每一层可以制定自己的标准来解决好自己层面上的事情。

再比如一个项目分dao数据库层,缓存层,service层,controller接入层一样,每一层专注自己的部分,关于优势,把高内聚,低耦合,可维护性强这些词甩在网络分层上面也是用得的。

从专业角度来说,程序设计要求,复杂的程序都需要分层。

 

OSI模型(Open System Interconnection Reference Model),他只是一种参考概念模型,并没有提供一个可以实现的方法,现在的因特网采用的是TCP/IP模型(五层),TCP/IP网络通信协议(四层)。了解网络发展史会发现OSI模型出现的时间比TCP/IP晚,是在tcp/ip模型基础上面提出的,那时候tcp/ip协议应用已经成型了,各大运营商们不想再换,再加上OSI模型有些设计冗余,因此因特网最终选择了草根选手TCP/IP,但是OSI在理论研究上面具有很大参考价值,所以各大教材都会提到OSI.

 

有这五层模型进行分工合作,就可以用tcp/ip协议将计算机连起来通信啦。

1.物理层

声音传信靠声波,鸽子传信靠电磁波,电流传信靠电波。物理层需要解决利用传输介质传输比特流的问题。

 

两台电脑最简单的通信方式是一根双绞线,两个水晶头,交叉接法,连接两个电脑的网卡,配置一下ip地址,子网掩码,默认网关成为一个网络,这两台电脑就组成了一个最小的局域网,可以联机打拳皇了。第三个人想加进来,就可以加一个有多个口的集线器(hub)设备。一个网吧人想加入进来,可以加上交换机,交换机互联,形成网络拓扑。一个城市的人都想加进来,就需要移动联通电信到处铺电缆光纤,建立基站了。

 

2.数据链路层

以太网协议

物理层里面,已经帮你把电信号转化成数字信号 010101001 形式,但是两台机器要交谈总不可能一个字节一个字节的01交流,数据链路层要负责把这些无穷尽的 010011001 封装成一个个帧来进行传输,这时以太网协议就诞生了,帧也叫做以太网帧,以太网协议规定成帧的各项规则,例如多少字节成一个帧等。以太网协议如下:

 

 

三个人一起互联打格斗游戏,是有严格的角色和顺序的,随便一个人发出信号,发给谁,谁接收,先接收哪个地方信号,发错了怎么办?这些都是数据链路层需要解决的问题。

 

MAC地址

数据链路层也叫做MAC层,Medium Access Control即媒体访问控制,专业词叫做“多路访问控制”。

数据发给谁接收,最早是只有集线器没有交换机的,三台电脑每台电脑发送信号都是通过广播的方式,广播出去哪一台电脑需要处理呢,每台电脑都需要一个标识能够在数据链路层表示自己,MAC地址由此诞生,对应的物理设备是网卡接口,每块网卡的mac地址都是全球唯一的,生产时就固定了。但是网络通信中,却不用mac地址进行通信,而是ip地址,读者可以自行思考一下原因。

 

有了身份了,以太网帧里面源MAC和目标MAC都有了,就能找到相应目标机器,数据在链路上广播,目标MAC的网卡就能判定这个是给自己的,将其收进来打开,拿掉MAC,发现ip包的地址也是自己的,再拿掉ip层根据tcp层端口找到相应进程,返回也是一样的,源MAC就变成了目标MAC。

 

APR协议

有个问题就是,当机器们互相认识的时候,可以把目标机器的地址放进包里,如果有n台机器呢,一个网吧的人一起玩格斗,总不可能一个一个去问你的MAC地址是啥,于是就有了APR协议。

在局域网里面,如果知道了IP地址不清楚MAC地址,那么就广播吧,发送一个广播包,谁是这个IP谁来回答,回答的包里面会带上自己的MAC信息。为了防止每次都APR广播,机器本地会进行APR缓存,交换机就是具有MAC地址学习能力的设备,学习完之后就能精准找到主机,不需要广播。

 

3.网络层

​上面其实已经提到过一些ip地址,计算机网络世界里面,都是通过ip地址来进行定位的,怎么配置自己的ip地址呢,其实可以使用 ifconfig(window系统是ipconfig),也可以if addr,将网卡up一下​就可以,电脑小白都可以打开自己的电脑网络配置中心更改就行。

 

现实中我们的网络是由一个个局域网组成的复杂网络拓扑,每个局域网处于同一个网段,MAC地址相当于这个人的DNA,能精准到一个人,但是却是没有定位寻址功能的,MAC地址没有为寻址功能设计编号,出厂后网卡被哪里使用不知道,中国都可以进口美国产的网卡,但是ip地址是有设计寻址功能的,每个地区的ip,就像物流地址一样能一层层定位到一个人的地址,黑客找人很多就是根据ip地址的。

 

DHCP(Dynamic Host Configuration Protocol)动态主机配置协议

如果局域网内只有几台主机,自己配置一下ip地址玩玩也是可以的,但是如果一个学校的电脑都需要网管来一个一个配置的话,那就不好玩了,所以我们需要一个可以自动配置ip的协议,即DHCP。

每台主机要加入一个网络的时候,肯定是什么也不知道,只知道自己的MAC地址,因此这个时候还是靠广播,使用ip地址0.0.0.0发送一个广播包,发给目的地址255.255.255.255,封装在UDP里面,UDP封装在BOOTP里面(DHCP的前身),DHCP SERVER收到带有MAC地址的包,在没有ip地址的情况下就知道是谁索要ip了,因此就给他子网掩码,网关和ip信息,然后这台新来的机器就可以欢快的加入大家庭了。

 

网关(gateway)

说了这么多还都是在局域网内小打小闹,外面的世界那么精彩,如果想要出国玩玩第一件事就是解决护照,才能通过网关,前面不止一次说到网卡配置的时候需要配置网关。假如你配置的ip是192.168.1.100,旁边兄弟的是192.168.10.100,然后我要访问他,来看看电脑是怎么理解的,以下是linux的处理方式:

 

网关大家可以理解成工作在网络层的路由器,它有多个网卡分别连着不同的局域网,每个网卡的ip地址都和对应局域网在同一个网段,工作时就像机场,你拿着哪一国护照就往哪一国送,会将MAC头和IP头都取下来,然后判断内容看将包往哪里转发。路由里面又分为静态路由动态路由,路由算法等复杂的逻辑。

 

DNS(DOMAIN NAME SYSTEM)域名系统

如果你有超强的记忆力的话,当然可以 12.34.45.56 这样的方式去访问百度,就跟纯敲电话号码去给一个人打电话一样,但是大多数人都是直接翻看通讯录找名称来打电话吧,网络世界也是一样,需要域名来标示一个ip,于是你就可以通过www.baidu.com来访问百度了。域名就是网络世界里面的通讯录。

想象一下,全世界都靠这个通讯录找人,它一旦挂了那么地球村就gg了,因此dns服务器一定得高可用,高并发,分布式,这么复杂第一反应肯定是分层设计的嘛,思想都是相通的,于是就有了根DNS服务器,顶级域DNS服务器,权威DNS服务器,如下:

 

树状结构,访问就需要递归了,为了提高ip解析性能,就需要缓存了,很多运营商(移动电信联通)会就近部署DNS缓存服务器,DNS解析流程如下:

 

CDN(content delivery network)缓存

访问一个地址都要这么复杂,找这么多层,现实中多等一秒都难受,那么就要想办法尽量走缓存拿数据,全球有那么多数据中心,我们不远的地方都有数据中心,何不在这些数据中心里面部署一些机器来做缓存集群缓存部分数据呢?于是cdn的角色就出来了,这里不细讲其具体形态,无外乎又是分层,高可用设计。

 

4.传输层

TCP,UDP

像物流系统一样,接单之后选好了路径,就要运货了,交通情况那么复杂,运货过程中肯定会遇到拥堵,丢货,超时等一系列问题。传输层就是为了解决这些问题而存在的,主要分为UDP协议和TCP协议,他们之间最主要的区别就是UDP不可靠,TCP可靠。

UDP协议适用于对丢包不敏感的应用,不需要建立连接,速度快,以上说到的APR,DHCP都是基于UDP协议的,还有直播的流媒体协议,早期对实时性要求高的游戏,物联网和移动通信领域等等。

TCP要保证可靠传输,就要考虑到保证顺序,丢包处理,维护连接,流量控制,和拥塞控制等问题,因此就出现了复杂的三次握手,四次挥手,还要维护TCP状态机等。拥塞控制是通过拥塞窗口来解决的,顺序,丢包处理,流量控制对应滑动窗口。

 

端口(port)

试想一下数据跋山涉水的到达了你的电脑,然后呢咋办,你同时开了微信,qq,钉钉,别人给你发条消息你总要运送到对应的程序吧,这样才算最终到达,这里不妨把每个应用都理解成一个程序,端口的需要就体现出来了,这个端口在你电脑是不会重复的,要不然数据过来就没法判断了,很多人在玩tomcat的时候,开两个8080端口都会遇到报错吧。

 

5.应用层

到了应用层,就会比较具体了,毕竟我们看得见,每个人都有不同的需求,比如A需要发邮件,B需要下订单,C需要下载文件,这层需要解决告诉对方,我要干什么的问题,根据干的事情不一样,又会催化出各种不同的协议来最好解决你的需求。

http,https协议

http是最早的协议,其中分为了POST , DELETE, PUT,GET等请求,对应向服务器增删改查数据,然后发展到http2.0通过压缩,分帧,二进制编码,多路复用等技术提升性能,然后发展到https,通过改进加密技术来提高安全性。

 

欢迎关注我的公众号,能力水平有限,如果有误欢迎各路大佬私聊我来订正。

 

 

 

发布了30 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40898368/article/details/103000254