gpt4 book ai didi

c - TCP/IP发送数据和接收数据顺序

转载 作者:行者123 更新时间:2023-11-30 19:56:23 25 4
gpt4 key购买 nike

我正在我的嵌入式微 Controller 上使用 uIP 开源 TCP 堆栈。我读过很多 TCP/IP 的帖子,看起来与这个问题相似,但我仍然无法得到我正在寻找的答案。所以我才问这个。

我知道发送数据将按顺序保存在以太网 Controller (服务器)Tx 缓冲区中。接收到的数据将按顺序保存在以太网 Controller (客户端)Rx Buffer 中。

如果我有 100 字节的消息,我使用 TCP 一起发送(使用 PSOCK_SEND 方法)到客户端。我知道如果我将所有内容一起发送,接收者将保证一起接收所有内容。

现在,如果我一一发送两个 50 字节,是否有可能先收到发送的第二个 50 字节。发送的前 50 个字节可以第二个接收吗?

我的理解是,这在 HTTP 协议(protocol)中是可能的。但在 TCP 中,无论字节是分两步发送还是一步发送,接收端都会以相同的顺序接收。因此 TCP 将继续发送前 50 个字节,直到成功或超时。只有这样它才会发送第二个 50 字节。

最佳答案

I know if I send all together receiver will guarantee receive all together.

不保证上述情况。 TCP 是面向字节流的协议(protocol),而不是面向消息的协议(protocol),因此除了数据字节将按照发送的顺序接收之外,它不保证任何其他内容。接收器可能通过一次recv()调用接收所有100个字节,或者可能(至少原则上)在100个recv()调用中一次接收1个字节,或者介于两者之间,这取决于接收代码准备好正确处理传入的数据,无论它到达的 block 的大小是多少。

Now If I send two 50 bytes one by one, it there any possibility that second 50 bytes sent can be received first. And first 50 bytes sent can be received second?

就应用程序而言,没有。 TCP保证在应用层按顺序接收TCP数据。 (底层数据包可能会被 TCP 堆栈乱序接收,但 TCP 堆栈不会乱序地将它们呈现给应用程序层。相反,它会等待,直到它以正确的顺序准备好更多数据,然后再导致recv() 返回更多数据)

My understanding is that this is possible in HTTP Protocol.

由于 HTTP 是建立在 TCP 之上的,因此 TCP 所做的任何保证也适用于 HTTP。特别是,HTTP 数据将按照发送者发送的顺序接收。 (您可能对 HTTP 规范中的一些内容感到有点困惑,例如发送方可以按不同的顺序发送 HTTP header ,但请注意,无论发送方发送它们的顺序如何,都将与接收方接收它们的顺序完全相同,因为它们都经过 TCP 层的字节流,严格来说是 FIFO)

关于c - TCP/IP发送数据和接收数据顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com