( 该图由AI制作 )
目录
包的基本知识
包收发操作概览
生成包含接收方 IP 地址的 IP 头部
生成以太网用的 MAC 头部
通过 ARP 查询目标路由器的 MAC 地址
以太网的基本知识
将 IP 包转换成电或光信号发送出去
给网络包再加 3 个控制数据
向集线器发送网络包
接收返回包
将服务器的响应包从 IP 传递给 TCP
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信对象
包的基本知识
包是由头部和数据两部分构成的 ( 图 (a ))
头部包含目的地址等控制信息 (理解为:快递单)
头部后面就是委托方要发送给对方的数据 (理解为:快递本体)
发送方的网络设备会负责创建包(创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据)
包会被发往最近的网络转发设备
转发设备会根据头部中的信息判断接下来应该发往哪里 。
这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址 在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向
我们把发送方和接收方统称为终端节点
相应地,转发设备被称为转发节点或者中间节点
具体来说 , 如图 (b ) 所示 , TCP/IP 包包含如下两个头部 。
我把图再拿下来一遍
(a ) MAC 头部 ( 用于以太网协议 )
( b ) IP 头部 ( 用于 IP 协议 )
这两个头部分别具有不同的作用 。
首先 , 发送方将包的 目的地 , 也就 是要访问的服务器的 IP 地址写入 IP 头部 中
IP 协议就可以根据这一地址查找包的传输方向 , 从而找到下一个路由器的位置(路由器 R1)
IP 协议会委托以太网协议将包传输过去
这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将这个地址写入 MAC 头部中
这样一来,以太网协议就知道要将这个包发到哪一个路由器上了。
网络包在传输过程中 ( 图 ① ) 会经过集线器
集线器是根据以太网协议工作的设备 。 为了判断包接下来应该向什么地方传输 , 集线器里有 一张表 ( 用于以太网协议的表 ), 可根据以太网头部中记录的目的地信息查 出相应的传输方向
包会到达下一个路由器(图②)
路由器中有一张 IP 协议的表 , 可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发 往哪个路由器 。 为了将包发到下一个路由器 , 我们还需要查出下一个路由 器的 MAC 地址 , 并记录到 MAC 头部中
这就是在 TCP/IP 网络中,一个网络包从出发到到达目的地的全过程
IP 和以太网的分工
其中以太网的部分也可以替换成其他的东西:无线局域网 、 ADSL 、 FTTH 等
它们都可以替代以太网的角色帮助 IP 协议来传输网络包
将 IP 和负责传输的网络分开 , 可以更好地根据需要使用各种通信技术
包收发操作概览
在协议栈中 IP 模块是如何完成包收发操作的
将包从发送方传输到接收方的工作是由集线器 、 路由器等网络设备来完成的
IP模块仅仅是整个包传输过程的入口而已
包收发操作的起点是 TCP 模块委托 IP 模块发送包的操作(图1)
这个委托的过程就是 TCP 模块在数据块的前面加上 TCP 头部,然后整个传递给 IP 模块,这部分就是网络包的内容
与此同时, TCP 模块还需要指定通信对象的 IP 地址 , 也就是需要写清楚 “ 将什么内 容发给谁 ”。
IP 模块会将包的内容当作一整块数据 , 在前面加上包含 控制信息的头部 。 刚才我们讲过 , IP 模块会添加 IP 头部和 MAC 头部这两 种头部 。 IP 头部中包含 IP 协议规定的 、 根据 IP 地址将包发往目的地所需 的控制信息 ; MAC 头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息
关于 IP 头部和 MAC 头部的区别以及其中包含的控制信息的含义 , 我们将稍后介绍 。 总之 , 加上这两个头部之后 , 一个包就封装 好了 , 这些就是 IP 模块负责的工作
IP 模块负责添加如下两个头部。
(1) MAC 头部:以太网用的头部,包含 MAC 地址
(2) IP 头部:IP 用的头部,包含 IP 地址
接下来, 封装好的包会被交给网络硬件 ( 图 ②发送”)如以太网 、 无线局域网等
网络硬件可能是插在计算机主板上的板卡,也可能是笔记本电脑上的 PCMCIA 卡,或者是计算机主板上集成的芯片,不同形态的硬件名字也不一样,我们将它们统称为网卡
传递给网卡的网络包是由一连串 0 和 1 组成的数字信息 , 网卡会将这些数字信息转换为电信 号或光信号 , 并通过网线 ( 或光纤 ) 发送出去 , 然后这些信号就会到达集线 器 、 路由器等转发设备 , 再由转发设备一步一步地送达接收方
包送达对方之后,对方会作出响应。返回的包也会通过转发设备发送回来,然后我们需要接收这个包
接收的过程和发送的过程是相反的 , 信息先以电信号的形式从网线传输进来 , 然后由网卡将其转换为数字信息并 传递给 IP 模块 ( 图 “ ③接收 ”)。 接下来 , IP 模块会将 MAC 头部 和 IP 头部后面的内容 , 也就是 TCP 头部加上数据块 , 传递给 TCP 模块 。
在这个过程中,有几个关键的点
无论要收发的包是控制包还是数据包,IP 对各种类型的包的收发操作都是相同的。
生成包含接收方 IP 地址的 IP 头部
下面来看一看 IP 模块的具体工作过程
IP 模块接受 TCP 模块的委托, 负责包的收发工作 , 它会生成 IP 头部,并附加在 TCP 头部前面 。
IP 头部包 含的内容如表 所示
其中最重要的内容就是 IP 地址。它表示这个包应该发到哪里去。这个地址是由 TCP 模块告知的,而 TCP 又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序。
IP 头部中还需要填写发送方的 IP 地址 , 大家可以认为是发送方计算机的 IP 地址
IP 头部的“接收方 IP 地址”填写通信对象的 IP 地址。发送方 IP 地址需要判断发送所使用的网卡,并填写该网卡的 IP 地址。
但如果计算机上有多个网卡 , 如何判断应该把包交给哪块网卡呢?
答:与路由器使用 IP 表判断下一个路由器位置的操作是一样的。因为协议栈的 IP模块,与路由器中,负责,包收发的部分,都是根据 IP 协议规则,来进行包收发操作的,所以它们也都用相同的方法,来判断,把包发送给谁。
这个 “ IP 表 ” 叫作路由表
首先 , 我们对套接字中记录的目的地 IP 地址与路由表左侧的 Network Destination 栏进行比较
例如,TCP 模块告知的目标 IP 地址为 192.168.1.21,那么就对应
图中的第 6 行,因为它和 192.168.1 的部分相匹配。
如果目标 IP 地址为 10.10.1.166,那么就和 10.10.1 的部分相匹配,所以对应第 3 行。
以此类 推 , 我们需要找到与 IP 地址左边部分相匹配的条目
接下来看从右边数第 2 列和第 3 列的内容
Interface 列 , 表示网卡等网络接口( 也叫网络掩码:用来判断 IP 地址中网络号与主机号分界线的值 )这些网络接口可以将包发送给通信对 象 。
Gateway (网关) 列表示下一个路由器的 IP 地址 , 将包 发给这个 IP 地址 , 该地址对应的路由器 就会将包转发到目标地址
路由表的第 1 行中,目标地址和子网掩码都是 0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行
这样一来 , 我们就可以判断出应该使用哪块网卡来发送包了
可以在 IP 头部,的发送方 IP 地址中,填上这块网卡对应的 IP 地址 。
生成以太网用的 MAC 头部
生成了 IP 头部之后 , 接下来 IP 模块还需要在 IP 头部的前面加上MAC 头部
IP 头部中的接收方 IP 地址,表示网络包的,目的地 , 通过这个地址,我们就可以判断,要将包发到哪里
但在以太网的世界中 , TCP/IP 的这个思路,是行不通的
以太网,在判断,网络包目的地时,和 TCP/IP 的方式不同 , 因此必须采用,相匹配的方式,才能在以太网中,将包发往目的地 , 而 MAC 头部,就是干这个用的 。
IP 模块,在生成 IP 头部之后 , 会在它前面,再加上 MAC 头部 。 MAC 头部是以太网使用的头部 , 它包含了接收方和发送方的 MAC 地址等信息
MAC头部的相关知识
MAC 头部的开头是接收方和发送方的 MAC 地址 , 大家可以认为它们和 IP 头部中的接收方和 发送方 IP 地址的功能差不多
第 3 个以太类型字段和 IP 头部中的协议号类似
在 IP 中 , 协议号表示 IP 头部后面的包内容的类型 ; 而在以太网中 , 我们可以认为以太网类型后面就是以太网包的内 容 , 而以太类型就表示后面内容的类型
在生成 MAC 头部时,只要设置表中的 3 个字段就可以了
首先是 “ 以太类型 ”, 这里填写表示 IP 协议的值 0800
接下来是 发送方 MAC 地址 , 这 里填写网卡本身的 MAC 地址 (MAC 地址是在网卡生产时写入 ROM 里)
而接收方 MAC 地址:需要进一步查询
查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给 Gateway 列中的IP 地址就可以了,既然已经知道了包应该发给谁,那么只要将对方的 MAC 地址填上去就好了,但到这里为止根本没有出现对方的 MAC 地址,也就是说我们现在根本不知道对方的 MAC 地址是什么。因此,我们需要执行根据 IP 地址查询 MAC 地址的操作。
通过 ARP 查询目标路由器的 MAC 地址
在以太网中 , 有一种叫作广播的方法 , 可以把包发给连接在同一以太网中的所有设备
ARP 就是利 用广播对所有设备提问 :“×× 这个 IP 地址是谁的 ? 请把你的 MAC 地址 告诉我 。”
然后就会有人回答 :“ 这个 IP 地址是我的 , 我的 MAC 地址是××××。”
如果对方和自己处于同一个子网中 , 那么通过上面的操作就可以得到对方的 MAC 地址 。 然后 , 我们将这个 MAC 地址写入 MAC 头部 , MAC 头部就完成了
将 MAC 头部加在 IP 头部的前面,整个包就完成了
以太网的基本知识
完成 IP 模块的工作之后 , 下面就该轮到网卡了 , 不过在此之前 , 我们先来了解一些以太网的基本知识
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,
它的原型如图 (a ) 所示
当一台计算机发送信号时 ,信号就会通过网线流过整个网络 , 最终到达所有的设备
网络中任何一台设备发送的信号所有设备都能接收到
我们无法判 断一个信号到底是发给谁的 , 因此需要在信号的开头加上接收者的信息
为了控制这一操作 , 我们就需要使用表 2.3 中列出的 MAC 头 部 。 通过 MAC 头部中的接收方 MAC 地址 , 就能够知道包是发给谁的
尽管以太网经历了数次变迁,但其基本的 3 个性质至今仍未改变,
- 即:将包发送到 MAC 头部的接收方 MAC 地址代表的目的地,
- 用发送方 MAC 地址识别发送方,
- 用以太类型识别包的内容。
因此 , 大家可以认为具备这 3 个性质的网络就是以太网
将 IP 包转换成电或光信号发送出去
下面来看看以太网的包收发操作
我们需要将数字信息转换为电或光信号 , 才能在网线上传输
负责执行这一操作的是网卡 ,
这是一张网卡主要构成要素的概念图 , 并不代表硬件的实际结构
网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的
网卡中保存的 MAC 地址会由网卡驱动程序读取并分配给 MAC模块
给网络包再加 3 个控制数据
看网卡是如何将包转换成电信号并发送到网线中的
网卡驱动从 IP 模块获取包之后 , 会将其复制到,网卡内的缓冲区中 , 然后向
MAC 模块,发送, 发送包 ,的命令 。 接下来就轮到 MAC 模块进行工作了
MAC 模块会将包从缓冲区中取出 , 并在开头加上报头和起始帧分界符 , 在末尾加上用于检测错误的帧校验序列
报头是一串像 10101010…这样 1 和 0 交替出现的比特序列
它的作用是确定包的读取时机
当这些 1010 的比特序列被转换成电信号后,会形成如图这样的波形
用电信号来表达数字信息时 , 我们需要让 0 和 1 两种比特分别对应特定的电压和电流 , 例如图 ( a ) 这样的电信号就可以表达数字信息 。
这里暂时略过
向集线器发送网络包
加上报头 、 起始帧分界符和 FCS 之后 , 我们就可以将包通过网线发送出去了
发送信号的操作分为两种 , 一种是使用集线器的半双工模式 , 另一种是使用交换机的全双工 模式 。
接收返回包
网卡将包转换为电信号并发送出去的过程到这里就结束了 , 既然讲到了以太网的工作方式 , 那我们不妨继续看看接收网络包时的操作过程
将服务器的响应包从 IP 传递给 TCP