当前位置: 首页 > 知识库问答 >
问题:

为什么我对网络中tcp连接终止的观察不同于给定序列图的标准终止?

奚翰海
2023-03-14

让我们创建tcp连接建立、http请求和响应以及tcp连接终止的整个过程。

  1. 我的文件内容:

/var/www/html/phplearn/send.php

<form action="http://127.0.0.1/phplearn/do.php" method="post">
name: <input type="text" name="userName" size="12"/>
key:  <input type="text" name="PS" size="12"/>
<input type="submit" value="login">
</form>

/var/www/html/phplearn/do。php

<?php
$userName = $_POST["userName"];
$PS = $_POST["PS"];
echo "the name is:  ".$userName;
echo "<br>key word is:  ".$PS;
?>

使用以下参数打开tcpump:

sudo tcpdump-i本地主机127.0.0.1-w/tmp/dataDst。pcap

用curl发送信息

curl-d"userName=test

打开/tmp/dataDst。带wireshark的pcap

过程1:tcp连接建立。

从1号到3号,没问题。


no5客户端从38219端口发送超文本传输协议请求到80服务器
no6服务器发送tcp信号到客户端
no7服务器发送超文本传输协议响应到客户端

过程3: tcp连接终止
从tcp转储观察到的tcp连接终止过程与web上的图表完全不同。

根据我的观察,
从端口38219的客户端到服务器端口80的no7确认
从端口38219的客户端到服务器端口80的no8确认
从服务器端口80到端口38219的客户端的no9确认
从端口38219的客户端到服务器端口80确认

从图中可以看出,从客户端到服务器有两个tcp数据包,从服务器到客户端有两个tcp数据包。

从我的tcp转储,有三个tcp数据包从客户端到服务器,只有一个tcp数据包从服务器到客户端。

你能详细解释一下我的观察结果和时序图不同的原因吗?

共有1个答案

贾飞章
2023-03-14

>

  • 在数据包7中,客户端确认收到来自服务器的HTTP响应OK数据包。这不在您的TCP连接关闭时序图中,因为它不属于它,而是属于正常的TCP传输。

    然后,客户端在数据包8中指示它想要关闭连接。请注意,尽管在该数据包中设置了ACK-标志,但由于ACK-编号的值相同(194),因此不会确认接收到任何新数据。把这个和7号包核对一下。在那里,ACK-编号的值也是194。此步骤对应于图表的第一个箭头。

    在数据包9中,服务器确认客户机的关闭指示,并告诉客户机,它还想终止他那一方的连接。这一步对应于图表中从服务器到客户端的两个箭头。您的服务器将其打包在一个数据包中,与发送两个数据包相比,这非常聪明,因为它可以节省数据。

    在数据包10中,客户机确认,服务器也希望终止其连接的一部分,因此双方的连接都被关闭。此步骤对应于图表的最后一个箭头。

    这与您在问题中嵌入的时序图完全一致,但是确认字符-数据包与FIN-数据包一起发送

    请注意,TCP是双向的,因此客户端可以发送到服务器,服务器可以通过相同的连接对此做出响应。但是它也允许半关闭连接。这意味着,尽管数据包8中的客户端指示他不想再发送了,但他仍然可以从服务器接收数据。但是由于服务器不想再发送数据,他也通过数据包9中的FIN数据包来表示这一点。我告诉你,正如你可能想知道的那样,为什么服务器也需要向客户端发送FIN数据包。

    对于TCP连接的状态模型,可以在Tanenbaum p.532中找到一个有用的和更详细的图形,或者也可以在苏黎世联邦理工学院的讲座幻灯片中描述。

  •  类似资料:
    • 问题内容: 我正在尝试使用H2OR内的库在具有7000万行和25个数字特征的训练集上使用随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取了H2O对象中的两个文件。 然后,我给出以下命令来构建模型: 但是几分钟(不生成任何树)后,出现以下错误: “ .h2o.doSafeREST中的错误(conn = conn,h2

    • 我有一个tcp客户端向tcp服务器发送HTTP POST请求。一旦建立连接,数据将从服务器传输到客户端。最后,服务器向客户端发送[FIN,ACK]。客户端发送一个ACK。37秒后,客户机发送[FIN,ACK],但客户机没有从服务器获得ACK,因此客户机继续在指数计时器上重新发送[FIN,ACK]。问题:是否允许客户端以37秒的延迟发送[FIN,ACK]?在这种情况下有没有标准的计时器值?在这种情况

    • 我有两个演员,父母和孩子。家长使用内容监视孩子。看(孩子)。如果孩子调用上下文。停止(自我)父级收到终止消息。但是,如果子级抛出异常,akka将重新启动该异常,但不会向父级发送终止消息。 家长参与者如何监视孩子并监视任何终止/重新启动? 我提出的一个选项是覆盖父级中的主管策略,以便在出现任何异常时停止: 据我所知,这将适用于这位演员的所有孩子。理想情况下,我希望对个别孩子(演员类型)有一个不同的监

    • 问题内容: 考虑以下程序: 为什么它在本地终止而不在Playground终止?我的程序终止是否依赖未定义的行为? 问题答案: 该代码不能提供太多保证。它几乎完全依赖于围绕未定义行为的实现细节。 在大多数多线程系统中,不能保证一个线程中的更改不会出现障碍。您有一个goroutine,可以在另一个处理器上运行,总共将一个值写入一个没有人保证读取的变量。 将可以很容易地重写,因为从未有一个保证该变量的任

    • 我正在对一个拥有7000万行和25个数字特征的训练集使用R内部的< code>H2O库来尝试一个随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为 1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取H2O对象中的两个文件。 然后我发出以下命令来构建模型: 但是几分钟后(没有生成任何树),我得到以下错误: "在. h2o.doSafeREST(conn = conn,