前言

这个系列的博客是针对阅读《网络是怎样连接的》([日] 户根勤, 译 [中] 周自恒, ISBN: 9787115441249)一书的记录与思路整理。
有些概念是做纯路由交换的网络工程师很少接触但又很重要的部分,因此整理到这里以做分享。

包的基本知识

在前期一系列的讲解中我们谈到了应用程序(浏览器)如何调用操作系统协议栈来使用TCP 协议与远程服务器去建立连接、传输数据和关闭连接的过程。其中我们多次说到了TCP包头、IP包头的概念。

那么什么是包呢?

这是一个抽象的概念,它概括了数据在网络中传输的一种形态。逻辑上,我们认为包是由头部和数据两部分构成。

头部包含了控制信息,例如IP 头部包含了源目IP 地址;TCP 头部包含了序列号,ACK 号,SYN、ACK、FIN 等控制位。可以将其理解为快递包裹的面单(指明了谁是发件人,是收件人,是航空件还是陆运件,是加急件还是普通件)。

数据就是头部后面委托方要发送给对方的数据,也就相当于快递包裹内部的货物。

如上图,对于TCP 来说,上层应用数据委托的数据块就是TCP 的数据;对于IP 头部来说,整个TCP 包就是其数据。

包的转发

发送方负责将包创建好,添加各类控制信息,然后附加上需要发送的数据。接下来,包就会被发往最近的网络转发设备。当数据包到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来应该发往哪里。这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里面记录的目的地址在表中进行查询,并根据查到的信息判断接下来应该发往哪个方向。例如,表内查询结果是“目标地址为xxx 的包应该发到xxx号线路”,那么转发设备就会把这个包发送到xxx号线路去。数据包就这样一路被转发,直至到达目的地。

还是以快递类比,例如,A从深圳发送一个包裹到北京的B。那么A首先要填写一个快递单(控制信息),然后将要发送的货物打包成箱(数据),然后将快递单号贴在货物箱上(封装)。之后,A 将包裹交给快递员,快递员将包裹送往最近的快递集散中心(数据包发送给最近的转发设备)。快递集散中心收到包裹后,查看快递单信息,发现是发送到北京的包裹,他们将包裹放到发往广州集散中心的货车上,将包裹送往广州(路由选择)。当广州的集散中心收到包裹查看快递单,发现是发往北京的包裹,他们将包裹发往白云机场,送上直飞北京的货运飞机。到达北京后,北京机场的快递集散中心,将包裹又放上送往西城区集散中心的货车。最终,西城区的快递员收到包裹,成功将包裹交到B 手中,整个送货过程(转发过程)结束。

整个转发需要涉及到两种不同的地址IP地址(逻辑地址)和MAC 地址(物理地址)。

  • IP地址根据目标地址判断下一个IP转发设备的位置;
  • MAC 地址根据以太网协议将数据包传输到下一个转发设备。

发送方将数据包发往目的地时,在控制信息(IP包头)中写入要访问的服务器IP地址(类似快递面单的目的地址)。这样一来,所有沿途的转发设备都知道数据包的最终目的地址是什么了,IP协议可以根据这一地址查找数据包的传输方向,从而找到下一个路由器的位置。接下来,IP协议会委托以太网协议将数据包传送到下一个路由器。这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将该地址写入MAC 头部。这样一来,以太网协议就知道要将这个包发送到哪一个路由器上了(个人愚见,为何需要两个地址。一个是因为协议分层,IP 在逻辑上指明源目地址即可,物理上如何实现转发需要另一个协议层来执行,所以有两个地址;另外,以太网默认情况下是一个点到多点的网络,即使两台路由器是直联状态,也需要MAC 地址在多点中去明确下一跳到底是哪里)。

分层浅识

在整个转发过程中,IP 和以太网是有明确分工的。也就是IP协议层和以太网协议层是分开的。在这里,以太网实际上是可以替换成其它协议的,例如:无线局域网(Wi-Fi),ADSL(调制上网技术),FTTH(光纤入户)等等,这些协议都可以替代以太网来协助IP协议传输数据包。

同样的,传输层有TCP和UDP 协议,它们都可以委托IP 协议来传输数据包。分层的特性让不同协议来使用IP 协议进行传输成为可能。

因此,将IP和负责实际传输的网络分开,可以更好地根据需要使用各种通信技术。互联网这样庞大复杂的网络,从架构上需要保证灵活性,这就是设计这种分工/分层方式的原因。

但是需要注意的是,在操作系统中,IP 模块(非协议)负责给数据包添加MAC 头部和IP头部。