2.5 IP与以太网的包收发操作
2.5.1 包的基本知识
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信对象。
我们在 TCP 的讲解中也经常提到 IP,下面就来讨论一下 IP 模块是如何将包发送给对方的。
包的基本结构
包是由头部和数据两部分构成的(图 2.14(a))。
头部包含目的地址等控制信息,大家可以把它理解为快递包裹的面单。
头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物。
一个包发往目的地的过程如图 2.15 所示。
创建包
首先,发送方的网络设备会负责创建包,创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据。
传递包
接下来,包会被发往最近的网络转发设备。当到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来应该发往哪里。
这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向。
经过多个转发设备的接力之后,包最终就会到达接收方的网络设备。
当然,发送方向接收方发送一个包,接收方可能也会向发送方返回一个包,此时的发送方到了接下来的某个时刻就会变成接收方。
因此,我们不需要把发送方和接收方明确区分开来,在这里我们把发送方和接收方统称为终端节点
传递包的设备——路由器和集线器的作用
网络中有路由器和集线器两种不同的转发设备,它们在传输网络包时有着各自的分工。
(1)路由器根据目标地址判断下一个路由器的位置
(2)集线器在子网中将网络包传输到下一个路由
实际上,集线器是按照以太网规则传输包的设备,而路由器是按照 IP规则传输包的设备,因此我们也可以作如下理解。
(1)IP 协议根据目标地址判断下一个 IP 转发设备的位置
(2)子网中的以太网协议将包传输到下一个转发设备
MAC头部和IP头部的作用
具体来说,如图 2.14(b)所示,TCP/IP 包包含如下两个头部。相应地,转发设备被称为转发节点或者中间节点。
(a)MAC 头部(用于以太网协议)
(b)IP 头部(用于 IP 协议)
IP头部中的IP地址为目的地服务器
这两个头部分别具有不同的作用。首先,发送方将包的目的地,也就是要访问的服务器的 IP 地址写入 IP 头部中。
这样一来,我们就知道这个包应该发往哪里,IP 协议就可以根据这一地址查找包的传输方向,从而找到下一个路由器的位置,也就是图 2.16 中的路由器 R1。
MAC头部中的MAC地址为下一个路由器的MAC地址
接下来,IP 协议会委托以太网协议将包传输过去。这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将这个地址写入 MAC 头部中。
这样一来,以太网协议就知道要将这个包发到哪一个路由器上了。
MAC头会通过集线器中的以太网表查询以太网的传输方向
网络包在传输过程中(图 2.16 ①)会经过集线器,集线器是根据以太网协议工作的设备。
为了判断包接下来应该向什么地方传输,集线器里有一张表(用于以太网协议的表),可根据以太网头部中记录的目的地信息查出相应的传输方向。
这张图中只有一个集线器,当存在多个集线器时,网络包会按顺序逐一通过这些集线器进行传输。
IP头会通过路由器中的IP协议的表查询下一个要去往哪个路由器并将其MAC地址替换原来的MAC头部
接下来,包会到达下一个路由器(图 2.16 ②)。
路由器中有一张 IP 协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器。
为了将包发到下一个路由器,我们还需要查出下一个路由器的 MAC 地址,并记录到 MAC 头部中,大家可以理解为改写了 MAC 头部。这样,网络包就又被发往下一个节点了。
更准确地说,收到包的时候 MAC 头部会被舍弃,而当再次发送的时候又会加上包含新 MAC 地址的新 MAC 头部。
网络包会通过路由器到达下一个路由器 R2。
这个过程不断重复,最终网络包就会被送到目的地,当目的地设备成功接收之后,网络包的传输过程就结束了。
2.5.2 包收发操作概览
实际上将包从发送方传输到接收方的工作是由集线器、路由器等网络设备来完成的,因此 IP模块仅仅是整个包传输过程的入口而已。即便如此,IP 模块还是有很多工作需要完成。
TCP模块将包委托给IP模块
包收发操作的起点是 TCP 模块委托 IP 模块发送包的操作(图 2.17 中的“①发送”)。
这个委托的过程就是 TCP 模块在数据块的前面加上 TCP头部,然后整个传递给 IP 模块,这部分就是网络包的内容。
与此同时,TCP 模块还需要指定通信对象的 IP 地址,也就是需要写清楚“将什么内容发给谁”。
IP模块给包加上IP头和MAC头
收到委托后,IP 模块会将包的内容当作一整块数据,在前面加上包含控制信息的头部。
刚才我们讲过,IP 模块会添加 IP 头部和 MAC 头部这两种头部。
IP 头部中包含 IP 协议规定的、根据 IP 地址将包发往目的地所需的控制信息。
MAC 头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息。
关于IP头部和MAC头部的区别以及其中包含的控制信息的含义,我们将稍后介绍。
总之,加上这两个头部之后,一个包就封装好了,这些就是 IP 模块负责的工作。
IP模块封装完毕后交给网卡
接下来,封装好的包会被交给网卡(图 2.17 中的“②发送”)。
传递给网卡的网络包是由一连串 0 和 1 组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去。
然后这些信号就会到达集线器、路由器等转发设备,再由转发设备一步一步地送达接收方。
包送达对方之后,对方会作出响应。返回的包也会通过转发设备发送回来,然后我们需要接收这个包。
接受的过程和发送的过程是相反的
接收的过程和发送的过程是相反的,信息先以电信号的形式从网线传输进来,然后由网卡将其转换为数字信息并传递给 IP 模块(图 2.17 中的“③接收”)。
接下来,IP 模块会将 MAC 头部和 IP 头部后面的内容,也就是 TCP 头部加上数据块,传递给 TCP 模块。
接下来的操作就是我们之前讲过的 TCP 模块负责的部分了。
IP模块只负责打包或者接收包
TCP 模块在收发数据时会分为好几个阶段,并为各个阶段设计了实现相应功能的网络包。
但 IP 的包收发操作都是相同的,并不会因包本身而有所区别。
因为 IP 模块会将 TCP 头部和数据块看作一整块二进制数据,在执行收发操作时并不关心其中的内容,也不关心这个包是包含 TCP 头部和数据两者都有呢,还是只有 TCP 头部而没有数据。
当然,IP 模块也不关心 TCP 的操作阶段,对于包的乱序和丢失也一概不知。
总之,IP 的职责就是将委托的东西打包送到对方手里,或者是将对方送来的包接收下来,仅此而已。
因此,接下来我们要讲的这些关于 IP 的工作方式,可适用于任何 TCP 委派的收发操作。