识别 TCP 发送的消息中的最后一个数据包
Identifying last packet in a message sent by TCP
假设我们让发送者 A 使用 TCP 向接收者 B 发送消息。假设要从 A 发送到 B 的消息被分成三个长度为 500 字节、500 字节和 50 字节的数据包,并按该顺序发送。 A 如何向 B 表明长度为 50 字节的数据包是消息的最后一部分?我可以理解从 B 到 A 的 ACK,发送 B 收到的每个其他数据包,使用序列号指示自 B 发送最后一个 ACK 以来 B 收到了多少数据。我读到 FIN 用于终止发送者和接收者之间的联系。但是,我找不到关于如何指示最后一个数据包(将一条消息分成多个数据包)的描述。我认为在将消息发送到接收应用程序之前,必须按顺序重新组装数据包。我认为,由于 TCP 的一项操作是将消息拆分为数据包,因此发送方必须以某种方式标记消息的最后一个数据包已发送。
I think that as one of TCPs actions is to split the message into
packets
不,TCP 获取数据流并将其分段为称为 段 的 PDU。 IP 使用 TCP segments 作为 IP packets 的有效负载,而 IP packets 又是 data-link 协议的有效负载,例如以太网,帧.
However, I can't find a description of how the the last packet, of a
message split into several packets, is indicated.
类似的东西取决于更高的协议,例如HTTP。我认为您以错误的方式看待 TCP。 TCP 连接就像一个双向管道;无论你在一端放什么,都会从另一端出来。 TCP 不知道数据结构,它只是发送从应用程序或 application-layer 协议获得的任何内容。当应用程序或 application-layer 协议通过使用连接时,它告诉 TCP 将其断开。
接收方 TCP 只是简单地接收数据并重新排序,询问丢失或丢失的段。它将正确排序的数据传递给应用程序或 application-layer 协议,不知道数据结构,因为它只是到 TCP 的数据流。
此外,请记住,TCP 连接的两端是可以发送和接收的对等端,并且任何一端都可以发送一个带有 FIN 的报文段,告诉另一端已完成发送,但发送 FIN 的一端是有义务继续接收,直到另一端也发送一个 FIN 表示发送完成。任何一方也可以终止与 RST 段的连接。
there must be some way of the sender flagging the last packet of a
message has been sent.
可能,但这不是 TCP 的工作,这取决于应用程序或 application-layer 协议。 application-layer 完成后,它告诉 TCP 关闭,并启动 FIN 进程。 TCP 不知道消息的最后一部分是什么,因为它对数据一无所知。它保持管道打开,直到它被告知关闭它。
假设我们让发送者 A 使用 TCP 向接收者 B 发送消息。假设要从 A 发送到 B 的消息被分成三个长度为 500 字节、500 字节和 50 字节的数据包,并按该顺序发送。 A 如何向 B 表明长度为 50 字节的数据包是消息的最后一部分?我可以理解从 B 到 A 的 ACK,发送 B 收到的每个其他数据包,使用序列号指示自 B 发送最后一个 ACK 以来 B 收到了多少数据。我读到 FIN 用于终止发送者和接收者之间的联系。但是,我找不到关于如何指示最后一个数据包(将一条消息分成多个数据包)的描述。我认为在将消息发送到接收应用程序之前,必须按顺序重新组装数据包。我认为,由于 TCP 的一项操作是将消息拆分为数据包,因此发送方必须以某种方式标记消息的最后一个数据包已发送。
I think that as one of TCPs actions is to split the message into packets
不,TCP 获取数据流并将其分段为称为 段 的 PDU。 IP 使用 TCP segments 作为 IP packets 的有效负载,而 IP packets 又是 data-link 协议的有效负载,例如以太网,帧.
However, I can't find a description of how the the last packet, of a message split into several packets, is indicated.
类似的东西取决于更高的协议,例如HTTP。我认为您以错误的方式看待 TCP。 TCP 连接就像一个双向管道;无论你在一端放什么,都会从另一端出来。 TCP 不知道数据结构,它只是发送从应用程序或 application-layer 协议获得的任何内容。当应用程序或 application-layer 协议通过使用连接时,它告诉 TCP 将其断开。
接收方 TCP 只是简单地接收数据并重新排序,询问丢失或丢失的段。它将正确排序的数据传递给应用程序或 application-layer 协议,不知道数据结构,因为它只是到 TCP 的数据流。
此外,请记住,TCP 连接的两端是可以发送和接收的对等端,并且任何一端都可以发送一个带有 FIN 的报文段,告诉另一端已完成发送,但发送 FIN 的一端是有义务继续接收,直到另一端也发送一个 FIN 表示发送完成。任何一方也可以终止与 RST 段的连接。
there must be some way of the sender flagging the last packet of a message has been sent.
可能,但这不是 TCP 的工作,这取决于应用程序或 application-layer 协议。 application-layer 完成后,它告诉 TCP 关闭,并启动 FIN 进程。 TCP 不知道消息的最后一部分是什么,因为它对数据一无所知。它保持管道打开,直到它被告知关闭它。