一文通透TCP/IP五层模型

0 阅读9分钟

前言

关于网络知识,一直以来都是一知半解,悔于大学期间没有好好学习。

因此这次抽出一段时间,彻底的搞清楚网络知识,从ISO七层模型(实际上是TCP/IP五层模型)一层层往上,通过假设一个无网络的虚拟世界,一步一步模拟搭建网络,从而从根上弄清楚网络知识。

物理层

假设现在有个虚拟世界,刚刚发明出了计算机,但还没有网络,于是人们开始想如何能让两个计算机可以彼此发送数据,实现数据的远程传递。

于是人们发明了网线,网线可以把0和1转换为电信号(高电压代表1,低电压代表0),于是只要把数据转换为二进制的0和1,再将两个计算机用网线连接起来,那这两个计算机就可以互相发送数据了。 网线传输

到此物理层的网路通讯就已经实现了,通过网线或光线,就可以实现数据的远程传输。

c 解决了物理层的通讯问题,人们又犯难了,比如现在一个村子里面好多人都有电脑,如果每两个电脑之间都用网线连接,那这线盘综复杂简直就是灾难。

所以有人提议,不如弄个中心设备,所有电脑都和这个中心设备连接,而不是彼此连接,这样一个电脑只用一根网线就够了,然后某电脑想向另一个电脑传输数据,就通过中心设备将数据转发给目标电脑,这个承担中转的中心设备就是交换机。

那么问题又来了,交换机怎么知道某个电脑要把数据发给哪个电脑呢?

这时每个电脑就需要有个“身份证号”,作为这个电脑的唯一标识,刚好每个电脑生产出来就会有个唯一编号,这个编号就是MAC地址。

mac地址的组成是厂商的编码+编号,每个生产电脑的厂商都有自己的编号,比如Intel的编号是0x00,AMD的编号是0x01,这是由一个公认的组织机构EUI48所规定,大家都遵守,所以每个电脑的MAC地址都是唯一的。

有了mac地址,电脑发送数据的时候,就会把数据加上mac地址,然后通过交换机转发给目标电脑。

mac

交换机怎么知道某个mac地址对应的哪个端口呢?交换机如果不知道mac地址对应的端口,就会通过广播的方式告诉所有端口,谁认领就发给谁,然后会通过这种“偷听”方式记录下来哪个端口对应的哪个mac地址。

网络层

互联网

目前解决了多天电脑彼此互相通讯的事,但是问题又来了,人们想把世界上所有的电脑都连接起来,这样就可以实现互联网了

于是有人提议搞一个超级大的交换机,把世界上所有的电脑都连接起来,然后超级交换机就可以实现互联网了。

但是这样就会出现一个问题,世界上的电脑那么多,即使某个电脑知道目标电脑的mac地址,但发送给交换机,交换机要通过广播来确认哪个端口对应这个mac地址,但世界上的设备太多了,广播给所有设备简直是灾难。

想想现实世界是如何送快递的,如果只有身份证号或手机号(相当于这里的mac地址),那快递公司要问所有世界上的人谁是这个身份证号/手机号,然后有人认领,才给他送过去,这岂不是弱智行为。

实际上送快递一定要留的就是地址,比如:中国.辽宁省.大连市.XX小区,国际快递公司一看中国,发给中国中转站,一看是辽宁,发给辽宁中转站,依此类推,最后给收件人发,整个过程没有一条路是白走的。

快递

所以问题的解决方案就清晰了,要有个类似“中国.辽宁省.大连市.XX小区”这样的地址,这个地址就是IP地址。还要有一个可以类似中转功能的承上启下的设备,这个设备就是路由器。

比如现在就划分1.x.x.x给中国用,2.x.x.x给韩国用,而中国又细分1.2.x.x给山东,1.3.x.x给辽宁,辽宁再按不同的市再依次细分,依次类推。实际上ip地址是分为4段,每段是8位二进制,对应范围是0-255,而本文只简化考虑下

而路由器就相当于网络世界的中转站,他负责根据ip地址判断路线该如何走,于是上面送快递的图就变成下面这个网络图了: ip

图中如1.3.1.1这个路由器,它和它的下级组成了1.3.x.x这个网段,所以在他的管辖范围内,前两位是网段,后两位是设备地址,为了表示前两位是网段地址,所以引入了子网掩码,这个网段的子网掩码按二进制就是前16位,也可以表示为255.255.0.0(通过二与ip地址与计算就可算出1.3.x.x)

为了避免不同国家彼此冲突,抢占网段,世界上成立了一个IANA组织负责分配网段

局域网

虽然可分配的ip地址非常多,但是如果所有可上网设备都分配一个唯一ip也不可能够用,而且也没有必要,比如家里的上网设备有电脑、电视、手机等等,完全没有必要每个设备都分配一个公网ip地址,只要自己家里搭建一个局域网,大家共享一个公网ip出口,就可以实现所有设备同时上网

所以IANA特意预留了一些ip地址作为局域网的网段,供大家搭建局域网使用,这些网段不会被公网ip占用

  • 10.0.0.0 ~ 10.255.255.255 超大公司、园区、大型企业
  • 172.16.0.0 ~ 172.31.255.255 中型公司、酒店、商场
  • 192.168.0.0 ~ 192.168.255.255 家庭、小公司、小网吧

ARP

虽然有了ip地址,但网络层是基于数据链路层实现,因为网线、网卡、交换机只认mac地址,所以一个路由器要通过ARP(Address Resolution Protocol)协议将ip地址转换成mac地址,最终实际发送数据包。

传输层

有了网络层,世界上的所有计算机之间就可以互相通信了,再此之上实际使用还是要做到程序与程序(即端口和端口)之间的通讯,比如微信和微信通讯,再就是数据传输怎么校验数据有没有丢失,有没有乱序,如果发送失败如何处理,这就是传输层要解决的问题。

传输层的实现重点是计算机(操作系统)彼此之间遵循一致的协议,比如A计算机说要发送到B计算机的80端口(数据包一定包含该信息),B计算机可以通过接受的数据包识别出来这个数据是要发送到80端口的 端口

传输层除了要解决端口问题,再次之上还要根据不同场景解决额外问题:

  • 要不要校验数据完整性?
  • 要不要保证送达?
  • 要不要保证顺序?
  • 要不要控制流量?

于是就分化出两种路线:

  • TCP协议:把可靠、顺序、连接、重传全都做了(速度相对慢)
  • UDP协议:只做端口和数据完整校验,其他都不管(速度相对快)

UDP协议

先说最简单的UDP协议,它很简单,就是把数据包发送给目标主机的目标端口,至于数据是否送达它不管。

它的消息头也非常简单,只包含源端口,目标端口,数据长度,校验和。

UDP协议最大的特点是,它不保证数据包送达,也不保证数据包顺序,总之就是为了简单快速,适合于数据准确性不重要,但速度要求高的场景。

TCP协议

TCP协议,它的消息头比UDP协议要复杂一些,它除了包含源端口,目标端口,数据长度,校验和外,还包含一个序列号,一个确认号,一个窗口大小,一个紧急标志等等。

TCP协议的出发点就是保障数据的送达,并且能保证数据包的顺序。它是一个可靠的传输协议,为了保证这些,TCP协议会制定复杂的规则进行确认,比如三次握手,四次挥手等等,导致传输效率一定会损失。

TCP是面向连接的,也就是它要求彼此先建立连接,然后再进行数据传输,最后关闭连接,就好像打电话,先接通,再通话沟通,最后挂断。而UDP是无连接的,它就像发短信,发过去了就可以,也不管对方收没收到。

所谓的连接是虚拟的,并不是有一条专线,而不过是通信双方各自在自己内存里,保存了一套关于这次对话的信息

建立连接需要三次握手,目的是保证彼此发出的数据对方都能收到

三次握手

断开连接需要四次挥手,目的是断开连接同时保证数据收发完毕 四次挥手

应用层

操作系统层面解决了传输层的问题,实现了转发端口,和选择可靠、不可靠传输方式。然后就是程序自身的协议了,这就来到了应用层。

程序自己的协议也是在TCP/UDP的基础上,规定了数据包的字段,格式等。

比如最出名的HTTP协议,基于TCP实现,最早是为了浏览器访问网页而创建的协议,它对顶了报文的格式,定义了报文头和报文体,以及报文头中包含的HTTP版本、状态码、请求方法、URL、请求头、响应头等等等等。

所以从应用层开始,所谓的协议不过就是根绝具体的场景定义了一个数据格式,通讯双方都遵守就可以互相理解,比如HTTP规定第X位为状态码,那浏览器就可以读取对应的位置获取状态码 http

我们可以继续在HTTP协议的基础之上再定义一个协议,比如我们开发后端接口返回的数据包含两个字段:一个是code、一个是data, 前端通过code来判断接口是否成功,通过data获取返回数据,这本身也是一种基于HTTP协议之上的自定义协议。

最后

最后补充一张完整层级图 五层模型