This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220MODA:端口443上的 HttpClient_readResponseBody 延迟

Guru**** 1125150 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1171557/cc3220moda-httpclient_readresponsebody-delay-over-port-443

器件型号:CC3220MODA

我们设计了一款采用 CC3220SFMODA 的产品、该产品从休眠状态中唤醒、与 AP 建立连接、然后向我们的服务器发送请求。  服务器以大约1KB 的有效负载进行响应、然后器件返回休眠状态。  作为测试的一部分、我们能够通过端口80、8443和443完成此事务、尽管我们更喜欢使用端口443。   

我们注意到、当使用端口443时、来自服务器的响应数据包被延迟、因此我们的代码在 HttpClient_readResponseBody 中挂起、等待它返回。  使用端口80或8443时不会发生这种情况。  我们使用相同的证书来保护端口443和8443。   

Wireshark 跟踪端口8443 (“正常”情况):

参考资料2636/2637,.208上服务器的响应是背对背的。  我们的设备在结束时再次休眠、我认为这是 TCP 重新传输的责任。  最终、整个过程在大约3秒内完成、虽然我看到 FIN 和 CC3220的 ACK 存在实际延迟、但这并不是一个关注的领域。   



Wireshark 跟踪端口443 (问题案例):



这里的问题是,从服务器在.208上传送两个传输的时间介于271和514之间。  从串行调试中可以看到、HttpClient_readResponseBody 从271行返回预期的服务器响应、代码只是在再次调用后等待函数返回、因为 moreDataFlag 不清零。 当返回时、函数中没有其他数据、因此我们不了解我们在等待什么。  这实际上是数据如何从服务器返回的一个症状,我们正在尝试弄清楚为什么端口443上的操作会导致它以不同的方式运行。  我们还有其他软件产品、当通过端口443连接到同一服务器时、这些产品不存在此异常。

应用代码:

我们按照示例代码建议继续调用 HttpClient_readResponseBody、直到 MoreDataFlag 被清除。  第一个调用返回我们所期望的消息内容,第二个调用处理从服务器发送的其余内容。

包含调试语句的代码部分:

    Len = 0;

    int rOnce = 0;

    操作

    {

        Display_printf (display、0、0、"do loop start、ReadResponse 读取\r\n);

        RET = HttpClient_readResponseBody (httpClientHandle、data、sizeof (data)、

                                          MoreDataFlag (&M);

        display_printf (display、0、0、"read response done \r\n);

        if (ret > 0){

            //循环至少读取一次

            ROnce = 1;

            Display_printf (display、0、0、"rOnce \r\n");

        }

        //如果读取响应在此循环中至少返回一次数据并且当前循环为0,则为 True

        if (rOnce && ret =0){

            //数据数组的前2个元素由于某种原因被垃圾数据覆盖

            //在此处手动修复问题

            数据[0]='{';

            DATA[1]= 0x22;// ASCII 中的双引号

            Display_printf (display、0、0、"Manual Fix \r\n);

        }

        if (ret < 0)

        {

            printError ("httpTask:Response body processing failed"、ret);

        }

        display_printf (display、0、0、"display print:%.*s end line \r\n"、ret、data);

        len += ret;

        display_printf (display、0、0、"display print done LEN =%d \r\n"、len);

        Display_printf (display、0、0、"MoreDataFlag =%d \r\n"、MoreDataFlag);

    }

    while (moreDataFlag);

运行时在端口8443上的串行输出:

执行循环启动、读取 readResponse

读取响应完成

rOnce

手动修复

显示:{"消息":"成功"、"已启用":true、"心轴排定":{"星期日":["10"、"20"、"13"、"16"]、"星期一":["10"、"20"、"20"、"19"、"6"]、"19"、"19"、"19"、"19"、"19"、"2022"、"10"、"6"、"10"、"18"、"2022"、"10"、"10"、"10"、"2022"、"10"、"10"、"10"、"10"、"2022"、"10"、"10"、"10"、"10"10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10

显示打印完成 LEN = 339

MoreDataFlag = 1.

执行循环启动、读取 readResponse

读取响应完成

手动修复

显示打印: 结束行

显示打印完成 LEN = 339

MoreDataFlag = 0

运行时在端口443上的串行输出:

执行循环启动、读取 readResponse

读取响应完成

rOnce

手动修复

显示:{"消息":"成功"、"已启用":true、"心跳时间表":{"星期日":["10"、"20"、"13"、"16"]、"星期一":["10"、"20"、"20"、"19"、"6"]、"19"、"2022"、"10"、"17"、"10"、"10"、"2022"、"6"、"10"10"、"2022"、""、"10"、"10"、"10"、"2022"、"10"、"10"、10"、10"、"2022"、"10"、"10"、10"、10"、"2022"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10

显示打印完成 LEN = 339

MoreDataFlag = 1.

执行循环启动、读取 readResponse

读取响应完成

手动修复

显示打印: 结束行

显示打印完成 LEN = 339

MoreDataFlag = 0

工具版本:

Simplelink 版本:4.40.07

编译器版本:TI v20.2.7.LTS

XDCtools 版本:3.62.1.14_core



我们对如何处理这种情况的任何想法都表示赞赏。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    也许我在这里缺少一些东西、但在这两种情况下、输出似乎是相同的。 这是预期的吗?

    其次、打印输出和流程毫无意义。 我希望在第一轮转塔>0时标记 rOnce,因此显示“rOnce”打印输出,而不显示“手动修复”(因为转塔不是0),但我看到它被打印。 您能解释一下吗? 您能否打印转台、因为我在尝试打印时看不到它。

    无论如何、您在  循环中测试 rOnce、而不会在每个周期中将其归零(因此标记后它将保持为1)。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shlomi、让我澄清一下。  由于 MoreDataFlag = 1,当循环第二次进入时,当使用端口443时,我们看到这2行的打印之间存在显著的差距:

    执行循环启动、读取 readResponse

    读取响应完成

    当我们查看 Wireshark 时、它与服务器的第二个数据包响应延迟保持一致。  我们正在尝试理解为什么在这种情况下第二个"块"会延迟、而在使用端口8443时根本不会延迟。  

    若要回答第二个问题、请在设置 rOnce 后打印"Manual Fix"、 并且 HttpClient_readResponseBody 返回0、该0仅在循环的第二次迭代之后发生。  rOnce 只是一个用于检测我们收到的内容的标志、打印"Manual Fix"的代码用于检测我们认为收到的内容。

    这里的问题实际上是端口8443与端口443上使用完全相同代码的事务速度。

    这是否有助于澄清问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在很清楚,谢谢。

    因此、客户端的行为似乎正常、因为在这两种情况下、它都获得了 MoreFlag、并按预期调用读取另一个块。 但是,对于端口443,由于某种原因,服务器将被推迟,它需要~5秒的响应时间。 查看此差距之前的 TCP 帧、似乎客户端发送 TCP ACK、确认6817字节。 就在它之前、服务器发送了序列5601、其中数据包的聚合长度为1270字节(包括标头)、因此如果我进行计算、它将变为5601+1270 - 20 (TCP 标头)- 20 (IP 标头)- 14 (加密)= 6817!

    因此、客户端的行为似乎是正确的。 其他 HTTP 服务器也会发生这种情况吗? 这在非加密会话中也会发生吗? 您使用的是什么服务器?

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    服务器是一种使用多年的公司软件产品、它不是新产品。  我们还有其他执行类似定期连接的软件客户端、我在端口443或8443上的传输中没有看到这种延迟。   

    就这个问题而言、您可以在 Wireshark 中看到、我通过端口8443包含了相同的传输、在这种情况下以及使用端口80时、我们都看不到延迟。  由于协议是非常自定义的、因此该设备不能连接到任何其他服务器。   

    我意识到我们专注于传输的接收数据结束、但启动时是否会出现导致此症状的情况?  在我们测试的服务器的所有实例(甚至没有为任何其他负载提供服务的实例)上通过端口443进行的每次传输都会发生这种情况、这一事实表明、这对我来说不是一个资源问题。   

    您是否将8443传输与443传输进行了比较?  也许您可以发现我们没有注意到的问题。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    就在快照中、很难看到任何内容。

    TCP 窗口和流看起来正常。

    您是否能够在服务器端查看日志以了解更多内容?

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们正在检查服务器端。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、当您有一些具体反馈时、请告诉我。