我对TCP/IP模型及其协议的理解

52 阅读16分钟

我对于计算机网络协议的理解和认识

主要针对两个问题:

  • TCP/IP 模型有几层?
  • 在游览器输入网址,期间发生了什么?

TCP/IP 模型有几层

同一设备上的不同进程需要通信的话,有很多种方式,如管道、消息队列、信号量、信号、共享内存等方式,而对于不同设备上的不同进程通信的话,需要使用网络通信,而设备是多种多样的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议

网络协议是分层的。

image.png

应用层

最上层也是我们能接触到的就是应用层,我们电脑或手机使用的应用软件都是在应用层实现。 所有应用层只需要专注于为用户提供应用功能,主要涉及的协议有HTTP、DNS、FTP、SMTP、Telnet等协议。

应用层是不用去关心数据是如何传输的,而且应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。

image.png

传输层

传输层主要的协议就是TCP、UDP两个协议

  • TCP 是面向连接的、可靠的、字节流的协议(滑动窗口、拥塞控制、超时重穿)
  • UDP 是不可靠的协议(数据包,不保证到达接收方)

应用层的数据可能非常大,我们需要在传输层进行分片操作,我们传输层最大传输数据的长度为MSS

应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段TCP Segment)。

image.png

当设备作为接受方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接受或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口

  • 比如 80 端口通常是Web服务器用的。
  • 22端口通常是远程登录服务器用的。

而对于游览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。

网络层

传输层是决定把数据包发送给哪一个应用,而网络层则是决定把数据包发送给那一台机器上的某一个应用,网络层的IP协议是控制数据包从一个设备传输到另外一个设备。

网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文

image.png

IP地址一般为32位,我们一般以8位划分为四段,比如 192.1.1.0,每个 . 代表一段。但是这样寻址太麻烦了,全世界那么多台设备,不可能一个个去寻址。

  • **网络号,负责标识该ip地址是属于那个【子网】的。
  • **主机号,负责标识同一【子网】下的不同主机。

其实IP地址除了寻址,还有路由的功能,实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。

image.png 所以,IP地址的寻址作用是告诉我们去往下一个目的地该往那个方向走,路由则是根据[下一个目的地]选择路径。寻址更像是在导航,路由更像是在操作方向盘。

网络接口层

网络接口层包含数据链路层、物理层

主要是ARP协议找到 MAC地址,还有物理层。

以太网在判断网络包目的地时和 IP 的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而 MAC 头部就是干这个用的,所以,在以太网进行通讯要用到 MAC 地址。

MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址。

所以说,网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。

总结

综上所述,TCP/IP模型可以分为 应用层、传输层、网络层、网络接口层。

封装格式:

image.png 网络接口层的传输单位是帧(Frame),IP层的传输单位是包(Packet),TCP层的传输单位是段(segment),HTTP传输单位则是消息或报文(message).

在游览器输入网址,这个过程发生了什么

首先先来看一下网络拓扑图,探究其中发生了什么?

image.png

image.png

HTTP-解析URL

游览器做的第一步工作的解析URL

首先游览器做的第一步工作是要对URL 进行,然后再对Web服务器发送请求。

一条长的URL里面的各个元素代表什么,如下图

image.png

真实地址查询-DNS

我们通过游览器解析URL并生成HTTP消息,URL一般都是域名,我们发送请求必须发送给真实的IP地址,所以需要查询服务器域名对应的IP地址

就比如我们打电话时的通讯录,电话号码难记,必须用备注来记忆,但是真实通话的还是号码。

所以,有一种服务器就专门保存了Web服务器域名与IP的队友关系,他就是DNS服务器。

域名的层级关系 DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限

在域名中,越靠右的位置表示其层级越高

毕竟域名是外国人发明,所以思维和中国人相反,比如说一个城市地点的时候,外国喜欢从小到大的方式顺序说起(如 XX 街道 XX 区 XX 市 XX 省),而中国则喜欢从大到小的顺序(如 XX 省 XX 市 XX 区 XX 街道)。

实际上域名最后还有一个点,比如 www.server.com.,这个最后的一个点代表根域名。

也就是,. 根域是在最顶层,它的下一层就是 .com 顶级域,再下面是 server.com

所以域名的层级关系类似一个树状结构:

  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(server.com)

image.png

发送请求-协议栈

通过DNS获取到IP后,就可以把HTTP的传输工作交给操作系统中的协议栈。 协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行

  • 应用程序
  • 操作系统
  • 驱动程序
  • 硬件

image.png

可靠传输-TCP

HTTP是基于TCP协议传输的,所以在这里先了解下TCP协议。(虽然在http3.0 是基于unic的udp协议,但是现在还没有普及

TCP 包头格式

image.png

首先,源端口号目标端口号是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。

接下来有包的号,这个是为了解决包乱序的问题。

还有应该有的是确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。

接下来还有一些状态位。例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。

还有一个重要的就是窗口大小。TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快,撑死我,也别发的太慢,饿死我。

除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即控制发送的速度。不能改变世界,就改变自己嘛。

远程定位-IP

TCP模块在封装后,只是应用和应用间传输知道了,我们还需要委托IP模块将数据封装成网络包发送通信对象

IP包头格式

image.png

在ip协议里面包含了源IP地址和目标地址IP:

  • 源地址IP,即是客户端输出的IP地址
  • 目标地址,即通过DNS域名解析得到的WEB服务器的IP

两点传输-MAC

MAC相当于标识的思想,两台计算机之间的标识,生成了IP头部之后,接下来需要在ip头部上加MAC头部

MAC包头格式

image.png 在 MAC 包头里需要发送方 MAC 地址接收方目标 MAC 地址,用于两点之间的传输

一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:

  • 0800 : IP 协议
  • 0806 : ARP 协议

MAC 发送方和接收方如何确认?

发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读取出来写入到 MAC 头部就可以了。

接收方的 MAC 地址就有点复杂了,只要告诉以太网对方的 MAC 的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的 MAC 地址。

所以先得搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给 Gateway 列中的 IP 地址就可以了。

既然知道要发给谁,按如何获取对方的 MAC 地址呢?

不知道对方 MAC 地址?不知道就喊呗。

此时就需要 ARP 协议帮我们找到路由器的 MAC 地址。

image.png ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。

然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。

如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

好像每次都要广播获取,这不是很麻烦吗?

放心,在后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用,不过缓存的时间就几分钟。

也就是说,在发包时:

  • 先查询 ARP 缓存,如果其中已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用 ARP 缓存中的地址。
  • 而当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 广播查询。

出门-网卡

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这是真的数据发送过程。

负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。 网卡驱动获得网络包之后,会将其复制到网卡内的缓冲区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

image.png

  • 起始帧分界符是一个用来表示包起始位置的标记
  • 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏

最后网卡会将包转为电信号,通过网线发送出去(终于把包发出去了)。

送别者-交换机

交换机的设计是将网络版原样转发到目的地,交换机工作在MAC层,也称为二层网络设备

交换机的包接收操作

首先,电信号到达网线接口,交换机里的模块进行接受,接下来交换机里的模块将电信号转为数字信号。 然后通过包末尾的FCS校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。交换机的端口不具有MAC地址

将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC 地址是否已经在 MAC地址表中有记录。

交换机的MAC地址表主要包含两个信息:

  • 一个是设备的MAC地址,
  • 另一个是该设备连接在交换机的哪个端口上。

image.png

交换机会根据MAC地址表查找 MAC地址,然后将信号发送到相应的端口

当 MAC 地址表找不到指定的MAC地址会怎么样?

地址表中找不到指定的MAC。可能的原因有:

  • 具有该地址的设备还没有向交换机发送过包。
  • 这个设备一段时间没有工作被地址表删除了。

这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。 此外,如果接收方MAC地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。

以下两个属于广播地址:

  • MAC地址中的 FF:FF:FF:FF:FF:FF
  • IP地址中的 255.255.255.255

转发者-路由器

路由器和交换机的区别

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备

这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

不过在具体的查找过程上,路由器和交换机是有区别的。

  • 路由器是基于IP设计的,俗称三层网络设备,路由器的各个端口都具有MAC地址和IP地址,
  • 交换机是基于以太网设计的,俗称二层网络设备交换机的端口不具有MAC地址

路由器的基本原理

路由器的端口具有MAC地址和IP地址,因此他就能成为以太网的接收方和发送方;同时还具有IP地址,从这个意义上来说,他和计算机网卡是一样的。

当转发包时,首先路由器端口会接受发送给自己的以太网包,然后路由表查询转发目标,再由相应的端口为发送方将以太网发送出去。

路由器包的接收操作

首先,电信号到达网线接口部分,路由器的模块会将电信号传成数字信号,然后通过包末尾的FCS进行错误校验。

如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

查询路由器表确定输出端口

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

转发操作分为几个阶段,首先是查询路由表判断转发目标。

image.png

路由器的发送操作

首先,我们需要根据路由表的网关列判断对方的地址。

  • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。

  • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点

知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。

路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。

接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。 发送出去的网络包会通过交换机到达下一个路由器。

由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。