赞
踩
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信对象
包是由头部和数据两部分构成的。头部包含目的地址等控制信息,可以理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物
包收发操作的起点是 TCP 模块委托 IP 模块发送包的操作,TCP 模块还需要指定通信对象的 IP 地址
收到委托后,IP 模块会将包的内容当作一整块数据,在前面加上包含控制信息的头部,分别是:
这两个头部分别具有不同的作用,下面分别介绍
首先,发送方需要知道包应该发往哪里,就可以根据 IP 地址查找包的传输方向,并转发到最近的网络转发设备,即路由器。路由器会根据头部信息的目标 IP 地址判断接下来该往哪发送,这需要用到一张记录了每个地址对应的发送方向的表。比如,目标地址为 xxxx 的包应该发到 xxxx 号线路,那么路由器就会把这个包发到 xxxx 号线路去。接下来,包在向目的地移动的过程中,又会到达下一个路由器,然后又会按照同样的方式被发往下一个路由器。就这样,经过多个路由器的接力之后,包最终就会到达接收方的网络设备
当然了,IP 协议也是委托以太网协议来转发网络包的,以太网协议需要用到 MAC 地址确定目标。上面讲过,网络包需要经过多个路由器设备的转发,因此在转发时,也会将 MAC 头部的地址更新为下一个路由器的 MAC 地址,这样才能传送过去
综上所述,我们也可以作如下理解:
最终,封装好的包会被交给网络硬件,如网卡。传递给网卡的网络包是由一连串 0 和 1 组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备,再由转发设备一步一步地送达接收方
IP 模块接受 TCP 模块的委托负责包的收发工作,它会生成 IP 头部并附加在 TCP 头部前面,IP 头部包含的内容如表所示:
IP 头部中还需要填写发送方的 IP 地址,我们一般可以认为这个 IP 地址就是计算机的 IP 地址,但如果计算机上有多个网卡, 每一块网卡都会有自己的 IP 地址,这时一台计算机就有多个 IP 地址
如果一台计算机有多个 IP 地址, 在填写发送方 IP 地址时就需要判断到底应该填写哪个地址。这个判断相当于判断使用哪一块网卡来发送包,也就相当于判断应该把包发往哪个路由器,因此只要确定了目标路由器,也就确定了应该使用哪块网卡,也就确定了发送方的 IP 地址,那该如何判断呢?
路由器使用 IP 表判断下一个路由器位置的操作是一样的。因为协议栈的 IP 模块与路由器中负责包收发的部分都是根据 IP 协议规则来进行包收发操作的,所以它们也都用相同的方法来判断把包发送给谁。这个 IP 表叫作路由表,对于 win 系统可以通过 route print
命令来显示路由表
例如,TCP 模块告知的目标 IP 地址为 192.168.1.21,那么就对应图中的第 6 行,因为它和 192.168.1 的部分相匹配。如果目标 IP 地址 为 10.10.1.166,那么就和 10.10.1 的部分相匹配,对应第 3 行。以此类推,我们需要找到与 IP 地址左边部分相匹配的条目,找到相应的条目之后,接下来看从右边数第 2 列和第 3 列的内容。右起第 2 列,也就是 Interface 列,表示网卡等网络接口,这些网络接口可以将包发送给通信对象。此外,右起第 3 列,即 Gateway 列表示下一个路由器的 IP 地址,将包发给这个 IP 地址,该地址对应的路由器就会将包转发到目标地址。路由表的第 1 行,目标地址和子网掩码都是 0.0.0.0,这表示默认网关,如果 其他所有条目都无法匹配,就会自动匹配这一行
这样一来,我们就可以判断出应该使用哪块网卡来发送包了,然后就可以在 IP 头部的发送方 IP 地址中填上这块网卡对应的 IP 地址
生成了 IP 头部之后,接下来 IP 模块还需要在 IP 头部的前面加上 MAC 头部。IP 头部中的接收方 IP 地址表示网络包的目的地,通 过这个地址我们就可以判断要将包发到哪里。在以太网,必须采用相匹配的方式才能在以太网中将包发往目的地,而 MAC 头部就是干这个用的,它包含了接收方和发送方的 MAC 地址等信息
然而,我们还不知道对方的 MAC 地址,因此,我们还需要根据 IP 地址查询 MAC 地址
这里我们需要使用 ARP。在以太网中,有一种叫作广播的方法,可以把包发给连接在同一以太网中的所有设备。ARP 就是利用广播对所有设备提问:xxxx 这个 IP 地址是谁的?请把你的 MAC 地址告诉我。然后就会有人回答:这个 IP 地址是我的,我的 MAC 地址是 xxxx
如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到 对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了
不过,如果每次发送包都要这样查询一次,网络中就会增加很多 ARP 包,因此我们会将查询结果放到一块叫作 ARP 缓存的内存空间中留着以后用。也就是说,在发送包时,先查询一下 ARP 缓存,如果其中已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用 ARP 缓存中的地址,而当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 查询。显示 ARP 缓存的方法如图所示:
有了 ARP 缓存,我们可以减少 ARP 包的数量,但如果总是使用 ARP 缓存中保存的地址也会产生问题。例如当 IP 地址发生变化时,ARP 缓存的内容就会和现实发生差异。为了防止这种问题的发生,ARP 缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右。这个删除的操作非常简单粗暴,不管 ARP 缓存中的内容是否有效,只要经过几分钟就全部删掉,这样就不会出问题了。当地址从 ARP 缓存中删除后,只要重新执行一次 ARP 查询就可以再次获得地址了
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,它的原型如图 a 所示,不难看出,这种网络的本质其实就是一根网线。图上还有一种叫作收发器的小设备,它的功能只是将不同网线之间的信号连接起来而已。因此,当一台计算机发送信号时,信号就会通过网线流过整个网络,最终到达所有的设备。同样地,这种网络中任何一台设备发送的信号所有设备都能接收到。不过,我们无法判断一个信号到底是发给谁的,因此需要在信号的开头加上接收者的信息, 也就是地址。这样一来就能够判断信号的接收者了,与接收者地址匹配的 设备就接收这个包,其他的设备则丢弃这个包,这样我们的包就送到指定的目的地了。为了控制这一操作,我们就需要使用 MAC 地址
这个原型后来变成了图 b 的样子,这个结构是将主干网线替换成了一个中继式集线器,虽然结构有所变化,但信号会发送给所有设备这一基本性质并没有改变
后来图 c 这样的使用交换式集线器普及开来,现在我 们说的以太网指的都是这样的结构。这个结构看上去和图 b 很像,但信号会发送给所有设备这一性质变了,现在信号只会流到根据 MAC 地址指定的设备,而不会到达其他设备了。当然,根据 MAC 地址来传输包这一点并没有变,因此 MAC 头部的设计也得以保留
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。