2 用电信号传输TCP/IP数据



热身问答

下列说法是正确的(√)还是错误的(×)?

  1. 我们现在使用的以太网中存在不符合国际标准(IEEE802.3/802.2)的部分。
  2. TCP/IP是由TCP和IP两个协议的名字组合而成的,最开始这两个协议是合在一起的。
  3. 网络包通信技术是20世纪60年代为用计算机进行数据通信而设计出来的。
参考
  1. √。一般情况下,以太网的头部(网络包开头的控制信息)格式并非遵循国际标准(IEEE802.3/802.2),而是遵循一个更古老的规格(以太网第2版,又称DIX规格),相对地,国际标准(IEEE802.3/802.2)的头部格式由于长度太长、效率降低而没有普及。
  2. √。最早的TCP/IP协议原型设计相当于现在的TCP和IP合在一起的样子,后来才拆分成为TCP和IP两个协议。
  3. √。在网络包出现之前,通信都是像电话一样把线路连接起来进行的。但是,连接线路的通信方式只能和固定的对象进行通信,无法发挥计算机可以处理多种工作的特点。为了解决这个问题,人们设计出了使用网络包来进行通信的方式。

1 创建套接字

浏览器、邮件等一般应用程序收发数据时用 TCP;
DNS 查询等收发较短的控制数据时用 UDP

网络包:网络中的数据会被切分成几十字节到几千字节的小块,每一个小数据块被称为一个包

IP 中还包括 ICMP 协议和 ARP 协议。

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制消息
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作

在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,例如通信对象的 IP 地址、端口号、通信操作的进行状态等。本来套接字就只是一个概念而已,并不存在实体,如果一定要赋予它一个实体,我们可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体

协议栈是根据套接字中记录的控制信息来工作的

创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态


2 连接服务器

以太网头部又称“MAC 头部”

通信操作中使用的控制信息分为两类。

  1. 头部中记录的信息
  2. 套接字(协议栈中的内存空间)中记录的信息

连接操作的第一步是在 TCP 模块处创建表示连接控制信息的头部。
通过 TCP 头部中的发送方和接收方端口号可以找到要连接的套接字


3 收发数据

MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
MSS:除去头部之后,一个网络包所能容纳的 TCP 数据的最大长度

MTU:Maximum Transmission Unit,最大传输单元

MSS:Maximum Segment Size,最大分段大小。 TCP 和 IP 的头部加起来一般是 40 字节,因此 MTU 减去这个长度就是 MSS。例如,在以太网中,MTU 为 1500,因此 MSS 就 是 1460。TCP/IP 可以使用一些可选参数
(protocol option),如加密等,这时头部的长度会增加,那么 MSS 就会随着头部长度增加而相应缩短

img1

img2

应用程序的数据一般都比较大,因此 TCP 会按照网络包的大小对数据进行拆分

IP 模块会在网络包前面添加 IP 头部和以太网的 MAC 头部后发送网络包

img3

我们在前面讲连接操作的时候说过 SYN 为 1 表示进行连接,这是因为将SYN 设为 1 并告知初始序号这一操作仅在连接过程中出现,因此发送SYN 为 1 的网络包就表示发起连接的意思。实际上,SYN 是 Synchronize(同步)的缩写,意思是通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查,这才是 SYN 原本的含义

img4

序号和 ACK 号的交互

网卡、集线器、路由器都没有错误补偿机制,一旦检测到错误就直接丢弃相应的包。应用程序也是一样,因为采用 TCP 传输,即便发生一些错误对方最终也能够收到正确的数据,所以应用程序只管自顾自地发送这些数据就好了

不过,如果发生网络中断、服务器宕机等问题,那么无论 TCP 怎样重传都不管用。这种情况下,无论如何尝试都是徒劳,因此 TCP 会在尝试几次重传无效之后强制结束通信,并向应用程序报错

通过“序号”和“ACK 号”可以确认接收方是否收到了网络包

所谓滑动窗口,就是在发送一个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包。这样一来,等待 ACK 号的这段时间就被有效利用起来了

img5

img6

滑动窗口与接收缓冲区


4 从服务器断开并删除套接字

img 断开连接的交互过程

img TCP 的整体流程


5 IP 与以太网的包收发操作

img 网络包的结构

网络中有路由器和集线器两种不同的转发设备,它们在传输网络包时有着各自的分工。

  1. 路由器根据目标地址判断下一个路由器的位置
  2. 集线器在子网中将网络包传输到下一个路由
    实际上,集线器是按照以太网规则传输包的设备,而路由器是按照 IP 规则传输包的设备,因此我们也可以作如下理解。
  3. IP 协议根据目标地址判断下一个 IP 转发设备的位置
  4. 子网中的以太网协议将包传输到下一个转发设备

TCP/IP 包包含如下两个头部

  1. MAC 头部(用于以太网协议)
  2. IP 头部(用于 IP 协议)
    这两个头部分别具有不同的作用。首先,发送方将包的目的地,也就是要访问的服务器的 IP 地址写入 IP 头部中。这样一来,我们就知道这个包应该发往哪里,IP 协议就可以根据这一地址查找包的传输方向,从而找到下一个路由器的位置。接下来,IP 协议会委托以太网协议将包传输过去。这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将这个地址写入 MAC 头部中。这样一来,以太网协议就知道要将这个包发到哪一个路由器上了

网络包在传输过程中会经过集线器,集线器是根据以太网协议工作的设备。为了判断包接下来应该向什么地方传输,集线器里有一张表(用于以太网协议的表),可根据以太网头部中记录的目的地信息查出相应的传输方向。这张图中只有一个集线器,当存在多个集线器时,网络包会按顺序逐一通过这些集线器进行传输。
接下来,包会到达下一个路由器。路由器中有一张 IP 协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器。为了将包发到下一个路由器,我们还需要查出下一个路由器的 MAC 地址,并记录到 MAC 头部中,大家可以理解为改写了 MAC 头部 A。这样,网络包就又被发往下一个节点了。

更准确地说,收到包的时候 MAC 头部会被舍弃,而当再次发送的时候又会加上包含新 MAC 地址的新 MAC 头部

当使用除以太网之外的其他网络进行传输时,MAC 头部也会被替换为适合所选通信规格的其他头部。

因此,将 IP 和负责传输的网络分开,可以更好地根据需要使用各种通信技术

img ip网络包的传输方式

img 包收发操作的整体过程

IP 模块负责添加如下两个头部。

  1. MAC 头部:以太网用的头部,包含 MAC 地址
  2. IP 头部:IP 用的头部,包含 IP 地址

凡是局域网所使用的头部都叫 MAC 头部,但其内容根据局域网的类型有所不同。此外,对于除局域网之外的其他通信技术,还有不同名称的各种头部,但它们只是名字不叫 MAC 头部而已,承担的作用和 MAC 头部是相同的

以太网的部分也可以替换成其他的东西,例如无线局域网、ADSL、FTTH 等,它们都可以替代以太网的角色帮助 IP 协议来传输网络包

接下来,封装好的包会被交给网络硬件,例如以太网、无线局域网等。网络硬件可能是插在计算机主板上的板卡,也可能是笔记本电脑上的 PCMCIA 卡,或者是计算机主板上集成的芯片,不同形态的硬件名字也不一样,本书将它们统称为网卡 B。传递给网卡的网络包是由一连串 0 和 1 组成的数字信息,网卡会将这些数字信息转换为电信号或光信号,并通过网线(或光纤)发送出去,然后这些信号就会到达集线器、路由器等转发设备,再由转发设备一步一步地送达接收方

IP 模块会将 TCP 头部和数据块看作一整块二进制数据,在执行收发操作时并不关心其中的内容,也不关心这个包是包含 TCP 头部和数据两者都有呢,还是只有 TCP 头部而没有数据。当然,IP 模块也不关心 TCP 的操作阶段,对于包的乱序和丢失也一概不知。总之,IP 的职责就是将委托的东西打包送到对方手里,或者是将对方送来的包接收下来,仅此而已

无论要收发的包是控制包还是数据包,IP 对各种类型的包的收发操作都是相同的。

IP 头部包含的内容中最重要的内容就是 IP 地址,它表示这个包应该发到哪里去。这个地址是由 TCP 模块告知的,而 TCP 又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序。

IP 地址实际上并不是分配给计算机的,而是分配给网卡的,因此当计算机上存在多块网卡时,每一块网卡都会有自己的 IP 地址。很多服务器上都会安装多块网卡,这时一台计算机就有多个 IP 地址,
在填写发送方 IP 地址时就需要判断到底应该填写哪个地址。这个判断相当于在多块网卡中判断应该使用哪一块网卡来发送这个包,也就相当于判断应该把包发往哪个路由器,因此只要确定了目标路由器,也就确定了应该使用哪块网卡,也就确定了发送方的 IP 地址。

IP 头部的“接收方 IP 地址”填写通信对象的 IP 地址。发送方 IP 地址需要判断发送所使用的网卡,并填写该网卡的 IP地址

只有在操作系统启动过程中对网卡进行初始化的时候才会读取MAC 地址,读取出来之后会存放在内存中,每次执行收发操作时实际上使用的是内存中的值。此外,读取 MAC 地址的操作是由网卡驱动程序来完成的,因此网卡驱动程序也可以不从网卡 ROM 中读取地址,而是将配置文件中设定的 MAC 地址拿出来放到内存中并用于设定 MAC 头部,或者也可以通过命令输入 MAC 地址

IP 模块根据路由表 Gateway 栏的内容判断应该把包发送给谁

A Gateway(网关)在TCP/IP 的世界里就是路由器的意思。
B 如果 Gateway 和 Interface 列的 IP 地址相同,就表示不需要路由器进行转发,可以直接将包发给接收方的 IP 地址

img 用 ARP 查询 MAC 地址
ARP:Address Resolution Protocol,地址解析协议

img ARP
查询 MAC 地址需要使用 ARP

以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术

img 以太网的基本结构

路由器等网络设备的网卡是集成在设备内部的,其电路的设计也有所不同,尽管结构有差异,但功能和行为是没有区别的

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

负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序

MAC:Media Access Control 的缩写---介质访问控制。MAC 头部、MAC 地址中的 MAC 也是这个意思。也就是说,通过MAC 模块控制包收发操作时所使用的头部和地址就叫作 MAC 头部和 MAC 地址

img 网卡

网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的。
网卡中保存的 MAC 地址会由网卡驱动程序读取并分配给 MAC模块

img 网卡发出去的包

报头是一串像 10101010…这样 1 和 0 交替出现的比特序列,长度为 56比特(7字节),它的作用是确定包的读取时机。当这些 1010 的比特序列被转换成电信号后,会形成如图 2.25 这样的波形。接收方在收到信号时,遇到这样的波形就可以判断读取数据的时机

img 报头和起始帧定界符

加上报头、起始帧分界符和 FCS 之后,我们就可以将包通过网线发送出去了(图 2.24)。发送信号的操作分为两种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工模式

发送和接收同时并行的方式叫作“全双工”,相对地,某一时刻只能进行发送或接收其中一种操作的叫作“半双工”

MAC 模块从报头开始将数字信息按每个比特转换成电信号,然后由 PHY,或者叫 MAU 的信号收发模块发送出去根据以太网信号方式的不同,有些地方叫 MAU(Medium Attachment Unit,介质连接单元),有些地方叫 PHY(Physical Layer Device,物理层装置)。在速率为 100 Mbit/s 以上的以太网中都叫 PHY

大家可以认为 PHY(MAU)模块的功能就是对 MAC 模块产生的信号进行格式转换。

网卡的 MAC 模块生成通用信号,然后由 PHY(MAU)模块转换成可在网线中传输的格式,并通过网线发送出去。

中断是有编号的,网卡在安装的时候就在硬件中设置了中断号,在中断处理程序中则将硬件的中断号和相应的驱动程序绑定。例如,假设网卡的中断号为 11,则在中断处理程序中将中断号 11 和相应的网卡驱动绑定起来,当网卡发起中断时,就会自动调用网卡驱动了。现在的硬件设备都遵循即插即用 C 规范自动设置中断号,我们没必要去关心中断号了,在以前需要手动设置中断号的年代,经常发生因为设置了错误的中断号而导致网卡无法正常工作的问题。

UDP 可发送的数据最大长度为 IP 包的最大长度减去 IP 头部和 UDP 头部的长度。不过,这个长度与 MTU、MSS 不是一个层面上的概念。MTU 和MSS 是基于以太网和通信线路上网络包的最大长度来计算的,而 IP 包的最大长度是由 IP 头部中的“全长”字段决定的。“全长”字段的长度为 16比特,因此从 IP 协议规范来看,IP 包的最大长度为 65 535 字节,再减去IP 头部和 UDP 头部的长度,就是 UDP 协议所能发送的数据最大长度。如果不考虑可选字段的话,一般来说 IP 头部为 20 字节,UDP 头部为 8 字节,因此 UDP 的最大数据长度为 65 507 字节。当然,这么长的数据已经超过了以太网和通信线路的最大传输长度,因此需要让 IP 模块使用分片功能拆分之后再传输。


小测验

1.表示网络包收件人的接收方IP地址是位于IP头部还是TCP头部中呢?
2.端口号用来指定服务器程序的种类,那么它位于TCP头部还是IP头部中呢?
3.会对包是否正确送达进行确认的是TCP还是IP呢?
4.根据IP地址查询MAC地址的机制叫什么?
5.在收到ACK号之前继续发送下一个包的方式叫什么?

参考
  1. IP 头部
  2. TCP 头部
  3. TCP
  4. ARP
  5. 滑动窗口方式

posted @ 2024-05-14 08:55  guanyubo  阅读(15)  评论(0编辑  收藏  举报