运维开发网

一文洞悉 OSI和TCP/IP模型,理通所有协议,再也不用似懂非懂了

运维开发网 https://www.qedev.com 2021-01-27 08:39 出处:51CTO 作者:mb5ff409fbbe221
为什么网络要分层?这其实很好理解,隋朝开始就有吏部、户部、礼部、兵部、刑部、工部了,一个庞大的组织要管理好必须要拆分出来,各有各的职责出了事情直接定位,每一层可以制定自己的标准来解决好自己层面上的事情。再比如一个项目分dao数据库层,缓存层,service层,controller接入层一样,每一层专注自己的部分,关于优势,把高内聚,低耦合,可维护性强这些词甩在网络分层上面也是用得的,出了事情直接找

为什么网络要分层?

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

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

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

OSI模型 比对 TCP/IP模型

OSI模型(Open System Interconnection Reference Model开放系统互连参考模型),他只是一种参考概念模型,并没有提供一个可以实现的方法,现在的因特网采用的是 TCP/IP 模型(五层),TCP/IP 网络通信协议(四层)。

了解网络发展史会发现OSI模型出现的时间比 TCP/IP 晚,是在 TCP/IP 模型基础上面提出的,那时候 TCP/IP 协议应用已经成型了,各大运营商们不想再换,再加上OSI模型有些设计冗余,因此因特网最终选择了草根选手 TCP/IP。但是OSI在理论研究上面具有很大参考价值,所以各大教材都会提到OSI模型.

TCP/IP 模型

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

物理层

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

以打魂斗罗为例(这个游戏有点暴露年龄),首先可以使用一个键盘,两个人一起打,这样没问题但是也太影响体验了。

两个人两台电脑联机打,两台电脑最简单的通信方式是一根双绞线,两个水晶头,交叉接法,连接两个电脑的网卡,分别配置‘ip地址’,‘子网掩码’,‘默认网关’使之成为一个网络,这两台电脑就组成了一个最简单的局域网,可以联机打魂斗罗啦!

如果第三个人想加进来,就可以买一个有多个口的集线器(hub)设备,将三个人的电脑都连起来。集线器是纯物理工作,将自己收到的字节全部复制到其他的端口,其他机器看着收进来,这样就实现了三个人一起 happy 了。

一个网吧人都想加入进来,可以加上交换机,交换机互联,形成网络拓扑。一个网吧人辣么多,必须要畅快啊,因此交换机是具有 MAC 地址学习功能的,有利于更快找到目标机器。不过交换机是工作在数据链路层的。

一个城市的人都想加进来,就需要移动联通电信这样的运营商到处铺电缆光纤,建立基站了,才能像我们如今这样无论身处何处,都能”每晚八点,王者峡谷见“了。

数据链路层

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

  1. 以太网协议

物理层里面,已经帮你把电信号转化成数字信号 010101001 形式,但是两台机器要交流总不可能一个 bit 一个 bit 的 0101 交流,如果别人和你说话总是故意一个字一个字的蹦估计你早就火了。

数据链路层就是要负责把这些无穷尽的 010011001 封装成一个个帧来进行传输,这时以太网协议就诞生了,帧也叫做以太网帧,以太网协议规定成帧的各项规则,例如多少位成一个帧等。以太网协议如下:

以太网帧

三个人一起互联打格斗游戏,游戏是有严格的角色和顺序的,随便一个人发出信号,这一层主要就是解决这三个问题:

  • 发给谁,谁接收?
  • 先接收哪个信号,顺序怎么办?
  • 发错了怎么办?

为什么叫”媒体访问控制“,控制的就是这些。

  1. MAC地址

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

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

  1. ARP协议

有个问题就是,一个数据包过来,怎么找到对应的主机呢?网路里面最开始肯定是谁也不认识谁,当机器不多的时候,可以把目标机器的 MAC 地址直接放进数据包里,但是如果有 n 台机器呢?一个网吧的人一起玩格斗,总不可能一个个去问哎,兄弟你的 MAC 地址是啥?,这种操作太骚了,于是就有了 ARP 协议。

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

网络层

上面其实已经提到过一些 IP 地址,计算机网络世界里面,都是通过 IP 地址来进行定位的,怎么配置自己的ip地址呢?

  • 其实可以使用 ifconfig(window系统是ipconfig)
  • 也可以if addr,将网卡up一下就可以
  • 电脑小白可以打开自己的电脑网络配置中心更改IP地址就行。

现实中我们的网络是由一个个局域网组成的复杂网络拓扑,每个局域网处于同一个网段,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的处理方式:

一文洞悉 OSI和TCP/IP模型,理通所有协议,再也不用似懂非懂了

太晚了就这个图吧!

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

DNS(DOMAIN NAME SYSTEM)域名系统

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

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

图画的有点丑丑的

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

一文洞悉 OSI和TCP/IP模型,理通所有协议,再也不用似懂非懂了

image

CDN(content delivery network)缓存

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

传输层

TCP,UDP

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

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

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

端口(port)

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

应用层

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

http,https协议

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

传输层协议和应用层协议之间的关系

应用层协议 = TCP/UDP + PORT端口号

  • HTTP = TCP + 80
  • HTTPS = TCP + 443
  • RDP(远程桌面协议) = TCP + 3389
  • FTP协议 = TCP + 21
  • TELNET = TCP + 23
  • SMTP = TCP + 25
  • DNS = UDP + 53
  • TFTP = UDP + 69
  • SNMP = UDP + 161
  • RIP = UDP + 520

0

精彩评论

暂无评论...
验证码 换一张
取 消