Segments, Packets 和 Frames 的区别(译)

Posted by 黄润豪 on Monday, January 28, 2019

TOC

“Segments”, “Packet”, “Frames” 等词在不同的书籍和文章中被广泛的使用和重用, 以表达不同的含义, 它们的含义现在变得有点混淆. 特别是在引入了不同分层架构的网络通信之后.

将它们称为 “PDU(Protocol Data Unit)” 是清除混淆的好方法. 无论是在谈论网络层, 传输层, 还是物理层, “PDU” 都是通用的, 适用于所有情况.

当然, 不同的层在数据上添加不同的字段, 但它们仍然可以称为 PDUs. 在 OSI 七层模型中, 下面这句话被广泛地接受:

传输层的PDU称为“段”,网络层的PDU称为“分组”,数据链路层的PDU称为“帧”(PDU of Transport layer is called as a “Segment”, PDU of network layer is called as a “Packet” & PDU of data link layer is called as a “Frame”)

网络通信实际上是面向消息的. 对应用程序而言, 它的需求可以是通过网络发送一个文件给另外的机器; 或者是从远程服务器下载一个特定的文件. 但是你无法通过一条消息就发送一个文件. 你必须把这个文件分成不同的块(chunk)才能将它发送出去. 虽然应用程序可以编程来执行此操作, 但对程序员来说, 这个工作量会非常地大. 然后, 应用程序应该具有”发送和确认哪个块”, “还需要发送哪个块”, “需要重发哪个块”的逻辑. 此外, 你还需要指定每个块的大小.

块的分割, 指定大小, 创建, 不是应用应该所关心的 , 这是 TCP 工作. 因此, 应用只需向 TCP 发送一个字节流(以字节为单位的数据流), 而 TCP 将负责将其分割并以离散消息形式发送.

因此, 应用为 TCP 提供字节流, TCP 负责将其创建为离散的消息片段. 传输层把这些离散消息称为”Segments”(So applications provide byte stream to TCP, and TCP takes care of creating it into discrete pieces of messages. These discrete pieces of messages at Transport Layer(where TCP comes into picture) are called “Segments”).

什么是 TCP Segment?

TCP 段可以同时执行多个操作. 我们知道应用提供的字节流数据会被分割成不同的块(称为Segments), 传送给接收端. 一个 Segment 携带数据, 以及另一个 Segment 的确认信号. TCP Segmetn 由具有不同含义的不同字段组成.

这意味着每个 Segment 中的相当大的空间是用于传达不同的功能和控制(称为 headers). 数据块被这些 headers 包裹. 通常, 每个 Segment 中都会有 20 字节 headers 专用的空间.

想要快速地查看 Segment, 最好的方法是使用 tcpdump. 你可以先启动一个终端, 执行命令 sudo tcpdump -vvv -n host www.example.com; 然后再启动一个终端, 执行命令 curl http://www.example.com.

你应该可以在第一个终端中看到类似下面的消息流(eg. 其中也会有 HTTP 协议的消息和页面的响应, 但是这里没有贴出来):

192.168.40.27.59365 > 93.184.216.34.80: Flags [S], cksum 0x6331 (correct), seq 1889608132, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1304554704 ecr 0,sackOK,eol], length 0
 
93.184.216.34.80 > 192.168.40.27.59365: Flags [S.], cksum 0xdaa9 (correct), seq 3872433988, ack 1889608133, win 65535, options [mss 1460,sackOK,TS val 3936428224 ecr 1304554704,nop,wscale 9], length 0

上面的两行输出显示了 segment headers. 所有的 TCP Segments 都会有类似的 headers. 它们由以下几个部分组成:

  • 源端口(59365)
  • 目标端口(80)
  • 标志位(Flags, 在 TCP 中 Flags 是一个很长的列表, 它们代表不同意思. 这里就不一一介绍了, 它们不是今天重点介绍的对象).
  • 校验和(用于验证 segment 的完整性, How Does TCP Segment Checksum work?)
  • 序列号(接收端用于标识不同的 Segment)
  • 可选项(其它的一些重要设置, 这里不细讲)

现在让我们继续本文的下一个话题, Packets. Segment 从传输层被传递到网络层. 这个网络层是 IP 地址工作的地方. 由于在网络层的包含 IP 地址, 所以这些包也叫 IP 包.

在 segments 添加一些字段, 就构成了网络层的包. 下面列举出几个比较重要的字段:

  • 源 IP 地址
  • 目标 IP 地址
  • 生存时间(TTL)
  • Identification
16:45:57.867336 IP (tos 0x0, ttl 64, id 57113, offset 0, flags [DF], proto TCP (6), length 64)
    192.168.40.27.59365 > 93.184.216.34.80: Flags [S], cksum 0x6331 (correct), seq 1889608132, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1304554704 ecr 0,sackOK,eol], length 0
16:45:58.072306 IP (tos 0x28, ttl 54, id 0, offset 0, flags [DF], proto TCP (6), length 60)

下面给出的 tcpdump 的输出其实跟上一个 tcpdump 的输出是一样的. 只是为了避免混淆了 Segments 的讨论, 我把第一个输出的第一行和最后一行删掉了.

在第一行中各个字段, 是数据包头部(headers)的一部分. 这些 headers 至少需要 20 字节的空间.

现在位于数据包中的 segment 被传递给下一层, 数据链路层(data link layer). 数据链路层在这个数据包的上添加自己的控制和功能字段, 就构成了 Frame(A “segment” which is now sitting inside a “packet”, is now passed down to the next layer called data link layer. Data link layer will add its own control and functional fields on top of the packet(called headers) to make something called as a “frame”).

什么是 Frame?

Frame 是用于表示参考模型最底层的 Protocl Data Unit(PDU) 的一个名词. 它是在数据链路层中的 PDU. 在两台计算机长或两个网络设备的通信中, 总是需要用到 MAC 地址. MAC 地址是网卡中的物理地址.

如果你想要通过网络发送消息给其它的机器, 那么需要先确认目标机器的 MAC 地址. 这就会用到 ARP(Address Resolution protocol), ARP 的作用是根据 IP 地址找出 MAC 地址. ARP 是网络的核心组成部分.

每个具有网络功能的操作系统, 都会有 ARP. ARP 有一个 ARP 表, 里面保存着 IP 地址和 MAC 地址的映射关系. 如果没有在 ARP 表中找到目标 IP 地址的映射, 那么它将会被转发给网关. 网关再次在自己的系统中搜索 ARP 表, 如果找到了相应的 MAC 地址, 那么会把消息发送给这个 MAC 地址. 如果没找到, 那么网关会将它转发给下一个网关, 直到找到最终的 MAC 地址.

推荐阅读: How Address Resolution Protocol Works?

跟 Segments 和 Packets 类似, Frames 也添加自己的 headers. 理解 Frames 中的 headers 是非常重要的, 而在 Frames 中的数据不是那么的重要, 它们只是一些从网络层传来的包.

  • 源 MAC 地址
  • 目标 MAC 地址
  • 数据(Data, or Payload)
  • 长度(数据长度, 通常是1500字节)
  • 校验和(CRC)

总结

Segment Packet Frame
PDU at Transport layer is called as segments PDU at network layer is called as Packet PDU at data link layer is called as Frame
Port numbers are part of Segments IP addresses are part of a Packet

Mac addresses are part of Frames

原文: Difference Between Segments, Packets and Frames

「真诚赞赏,手留余香」

AbeWang's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付


comments powered by Disqus