【问题标题】:When exactly are network packets created?网络数据包究竟是什么时候创建的?
【发布时间】:2016-10-11 07:47:27
【问题描述】:

在从客户端到主机(或反之亦然)的消息传输中,消息实际上被分割成数据包?

根据我目前的理解,应用程序将整个文件放入套接字中,并将其完全交给 TCP。 TCP 首先缓冲文件/消息,然后在合适的时候(什么时候合适?)切割缓冲区数据的块(创建数据包)并添加 TCP 标头以将块转换为段。

如果应用层根本没有数据包,为什么还要谈论应用层的数据包?只是整个文件...这不正确。

谁能证实我的理解?

【问题讨论】:

    标签: networking tcp packet tcp-ip packets


    【解决方案1】:

    基于 TCP 的应用程序有一个消息要发送。消息是什么取决于应用程序——它可能只是一个小请求,也可能是整个文件。它将消息传递到传输层 (TCP),传输层将消息分割成 ,然后将它们一一传递到网络层(Internet 协议)。网络层为每个数据包添加一个标头,并将其传递给处理的链路层(以太网)。

    所以,原则上,我们有:

    • 消息在应用层;
    • 在传输层;
    • packets 在网络层;和
    • 在链接层。

    然而,在实践中,人们并没有那么迂腐,并且倾向于混淆概念。你会经常听到人们谈论 TCP 数据包(正确的术语是带有 TCP 负载的 IP 数据包),他们甚至会谈论应用程序发送数据包(正确的表述是应用程序将消息传递给传输层)。大多数时候,不准确的术语不是问题,因为上下文可以消除歧义。

    【讨论】:

    • 将术语 message 与流式协议一起使用很容易让新手感到困惑。 message 经常被相关协议(例如 UDP)误读为 datagram。使用流协议,您在应用层发送字节(序列)。但是,您可以在解释的术语中将这样的字节序列每次传递到较低层(通常是操作系统 API)标记为 消息
    • 您使用什么术语来表示从应用程序传递到传输层的信息单元?我喜欢message,我相信这个词是标准的,但如果你有更好的词,我很愿意改变主意。
    • 我不确定什么是好词。我会选择 message,但会添加应用程序层可能会向 API 层发送任意字节序列,并且这些调用将形成一般意义上的 messages。您还可以添加一些注释,说明使用 TCP 时,message 也可以在被分割成段之前与更早或更晚的消息连接。因此,消息不是形成段(和数据包)的自然边界。
    • 我同意,而且比这更复杂。我经常在应用程序的缓冲区中累积多条消息,并在一次调用writewritev 时将它们全部推送。但我仍然觉得上面的解释是我能做的最好的解释,而不涉及这些肮脏的细节。
    【解决方案2】:

    数据在传输层(UDP、TCP)被segments分割和封装。这些段由网络层(IPv4、IPv6 等)的数据包封装。数据包在数据链路层(以太网等)由 封装。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2021-04-15
      • 2014-09-09
      • 2017-12-11
      • 2023-02-25
      相关资源
      最近更新 更多