“段”、“包”、“数据报”、“框架”等术语在不同的书籍和文章中被大量使用和重复使用,以传达不同的含义,现在已经变得完全令人困惑。特别是在介绍了网络通信的分层结构之后。
一个很好的方法来解决这个问题,就是把它们称为“PDU(协议数据单元)”。无论您谈论的是网络层、传输层还是物理层,术语PDU都是通用的,适用于所有领域。
当然,不同的层在数据之上添加不同的字段,但它们仍然可以被称为pdu。也就是说,根据OSI参考分层架构,下面是被广泛接受的。
传输层的PDU称为“段”,网络层的PDU称为“包”,数据链路层的PDU称为“帧”。
网络通信实际上是以信息为导向的。就应用程序而言,需求可能是向网络上的另一台机器发送文件。或者从远程服务器下载特定的文件。但是您不能在一条消息中发送文件。你必须把它分成不同的部分,然后发送出去。虽然可以编程应用程序来做到这一点,但这将是程序员的大量开销。然后应用程序应该有关于哪些块被发送,哪些块被确认,哪些块有待发送,哪些块需要重新发送等等的逻辑。此外,您还必须为应用程序将创建的每个块提供特定的大小。这基本上是应用程序编程中比较繁琐的工作。
如果应用程序可以提交数据流,而不用担心数据流的大小和数量,而不是由应用程序进行所有这些切片、大小和创建块(这是可能的)。这正是TCP能够做到的。所以基本上应用程序将发送一个字节流到TCP(完全不用担心大小和块)。它只是以字节为单位的数据流),而TCP将负责将其分割并以离散的消息形式发送。
因此,应用程序向TCP提供字节流,而TCP负责将其创建为离散的消息片段。在传输层(TCP出现的地方),这些离散的消息片段被称为“段”。
TCP段是怎样的?
TCP段可以同时做多项事情。我们知道这样一个事实,即由应用程序提供的字节流数据被分割成称为段的不同块,并分别交付给接收方。一个单段携带数据与另一个段的确认。TCP段由不同的字段组成,这些字段具有不同的含义。
这意味着每个段中有相当多的空间用于传递不同的函数和控件(称为头)。数据块由这些头包装。一般来说,每个段都有一个专用的20字节的段,仅用于头。
要快速查看一个片段,最好的程序是tcpdump。您可以在一个终端上启动命令sudo tcpdump -vvv -n主机www.example.com,并在另一个终端上执行命令curl http://www.example.com
您应该能够看到如下所示的消息流(在您启动tcpdump命令的第一个终端中)(它还应该向您显示HTTP协议消息/和web页面响应,我已经将输出缩减到最低限度)
192.168.40.27.59365 > 93.184.216.34.80: Flags [S], cksum 0x6331(正确),seq 1889608132, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1304554704 ecr 0,sackOK,eol],长度0
93.184.216.34.80 > 192.168.40.27.59365: Flags [S.], cksum 0xdaa9(正确),seq 3872433988, ack 1889608133, win 65535, options [mss 1460,sackOK,TS val 3936428224 ecr 1304554704,nop,wscale 9],长度0
上面的两行显示了段标题。所有TCP段都有类似的头。它将包含以下组件。
源端口(59365以上);
目的端口(80以上)
标志(在TCP中有一长串标志,它们表达不同的含义。因为它们都需要特别注意,所以我不会一一讨论,而且我们讨论的主题不是tcp头。)
校验和(可以用来验证段的完整性)
读取:TCP段校验和如何工作?
序列号(有助于在接收端识别不同的片段)
选项(其他一些重要的设置,传达不同的含义。有很多这样的东西。正如前面所提到的,我们将从本文的标题出发,不再深入其细节)
现在让我们继续讨论本文中的下一个主题,即数据包。段(包括数据块及其头)然后从传输层向下传递到下一个称为网络层的层。这就是IP地址的作用所在。我认为在这三种(段、包和帧)中,包是在不同地方正确使用的。由于信息包是具有IP地址的网络层中的离散消息,所以它们有时被称为“IP信息包”。
与在段中表达不同含义的字段类似,包也有自己的字段(头)。所以一个数据包就是里面的一个段。包在段的顶部广告它自己的字段。
在网络层中创建包时,在段之上添加的重要字段如下所述。
源IP地址
目的IP地址
TTL
识别
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(正确),seq 1889608132, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1304554704 ecr 0,sackOK,eol],长度0
16:45:58.072306 IP (tos 0x28, ttl 54, id 0, offset 0, flags [DF], proto TCP (6), length 60)
上面显示的tcpdump输出与前面显示的完全相同。在前一个例子中,我故意删除了第一行和最后一行。这是为了在我们讨论分段时避免混淆。
您在第一行看到的组件是数据包头的一部分(以及在第二行中显示的ip地址)。此控件和功能信息(头)最少消耗约20个字节。
一个“段”现在坐在一个“包”里面,现在被向下传递到下一层称为数据链路层。数据链路层将在包(称为报头)的顶部添加自己的控制和功能字段,使一些东西称为“帧”。
什么是帧?
帧是用来表示参考模型中最低层次之一的协议数据单元(PDU)的名称。它是数据链路层的PDU。两台计算机或两台网络设备之间的任何通信总是使用MAC地址完成的。MAC地址只是与网络接口卡相关联的物理地址。
如果要将消息传递到网络上的另一台机器,它将首先搜索目的地的物理地址。实际上有一种叫做ARP的东西,它将IP地址转换为物理地址。地址解析协议(ARP)是网络的核心组件之一。
每一个具有网络功能的操作系统都有一个叫做ARP的特性。它的工作是维护ip地址和对应的MAC地址(物理地址)之间的映射关系。
如果在表中没有找到目标IP地址的映射,通常会发生的情况是它被转发到网关。网关将再次在自己的系统中搜索ARP表,如果目的地找到了,它将把消息发送到正确的目的地物理地址。如果它没有被发现,网关将再次将它转发到下一个网关。从网关到下一个网关的信息包的转发将完成,直到到达最终目的地。
与段和包类似,帧也添加了自己的报头(控制帧的东西)。了解一个帧最重要的是它的标题。帧(或有效负载)内的数据只是来自网络层的ip包。
源Mac地址
目的Mac地址
数据(有效载荷-它只是网络层给出的网络包)
长度(数据的总长度——通常为1500字节)。
校验和(CRC)
Segment | Packet | Frame | ||||
PDU at Transport layer is called as segments | PDU at network layer is called as Packet |
| ||||
|
|
|
Source: Difference Between Segments, Packets and Frames (slashroot.in)