Networking 网络数据包是什么时候创建的?

Networking 网络数据包是什么时候创建的?,networking,tcp,packet,tcp-ip,packets,Networking,Tcp,Packet,Tcp Ip,Packets,在从客户机到主机的消息传输过程中(或反之),消息实际上是在哪一点被分为数据包的 根据我目前的理解,应用程序将整个文件放入套接字中,并将其完全移交给TCP。TCP首先缓冲文件/消息,当时间合适时(时间合适吗?)剪切缓冲区数据块(创建数据包)并添加TCP头以将数据块转换为段 如果应用层中根本没有数据包,我们为什么要在应用层中讨论数据包呢?只是整个文件。。。这不合适 有人能证实我的理解吗?数据在传输层(UDP、TCP)被分片并由段封装。网段由网络层(IPv4、IPv6等)的数据包进行封装。数据包由数据

在从客户机到主机的消息传输过程中(或反之),消息实际上是在哪一点被分为数据包的

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

如果应用层中根本没有数据包,我们为什么要在应用层中讨论数据包呢?只是整个文件。。。这不合适


有人能证实我的理解吗?

数据在传输层(UDP、TCP)被分片并由段封装。网段由网络层(IPv4、IPv6等)的数据包进行封装。数据包由数据链路层(以太网等)的帧封装。

基于TCP的应用程序有一条消息要发送。消息的内容取决于应用程序——它可能只是一个小请求,也可能是一个完整的文件。它将消息传递给传输层(TCP),传输层将消息分成若干段,并将它们逐个传递给网络层(Internet协议)。网络层向每个数据包添加一个报头,并将其传递给处理帧的链路层(以太网)

因此,原则上,我们有:

  • 应用层的消息
  • 传输层的段
  • 网络层的分组;及
  • 链接层上的帧

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

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