最后更新:2021-12-22 17:15:16 手机定位技术交流文章
你能想到,当你看到这个标题时, TCP 连接被创建和断裂了, 我很清楚这一点, 不仅仅是三次握手和四次挥手? 等等,你可能会尝试在你的脑海中先回答这些问题:
这不是一个采访,这是一个真正的问题, 我会在回答之前先把它卖掉, 将会有一个关于事情的特别故事, 所以,让我们在谈论真正的问题之前先讲理论吧。
从在典型环境下如何切断TCP连接开始, 我们向浅处和深处前进。 下面的图表描述了标准的 TCP 握手三次, 4次波( 来自 TCP/IP 详细卷1) 。

例如,在我们的机器上, 您可以使用 Python 的简单HTTPServer 来轻松建立 http 服务( http 还基于 TCP 协议), 例如 :
python -m SimpleHTTPServer 20880
使用 Nc 或 Tonnet 等两个命令中的任何一个命令来建立 TCP 连接。 对于此测试, 我使用 nc 来创建连接 。
nc -v ip port
关于 ip 端口 [tcp/*] 的咨询已被取代! 无法关闭临时文件夹:%s 。

我们如何看待这种关系?这种联系可能与网络或Issof有关,我更喜欢这样。
lsof -i:20880

港口将由客户或服务公司占用,但服务港口是固定的,客户港口是随机的。
如果我们每次连接和分离、握手和挥手时都想查看 TCP TCP 的 TCP 报告呢? tcpdump 命令可以使用 。
tcpdump -A -vv -i any -S host 10.179.245.95
除了上面提到的杰作之外

参数是——S,如果你不观察到第三次握手=1, 这和书中的想法不一样, 但它只是一个简化的tcpdum, 它必须附在实际值上--S。
国旗[S]/[S]/[..]/[..]/[..]/[..][原件:英
序列相当于三次握手。我们有以下波数据。

这张图有点奇怪,四波降为三波。这是《TCP协议》的实际执行。如果在第二和第三波之间没有提供数据,被动断开器然后可将第二个ACK和第三个FIN组合成一个波。
当然,我抓到了四个正常的挥手, 比如这个。

上面有太多的东西 我们终于能说到重点了
考虑以下问题:谁触发了TCP连接的断裂?是应用程序还是操作系统?
让我们来看看一个非常基本的 TCP连接 建造和断开代码。
tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:20880")
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
fmt.Println("Client connect error ! " + err.Error())
return
}
defer func() {
err := conn.Close()
fmt.Println("Client connect closed !")
if err != nil {
fmt.Println(err)
}
}()
fmt.Println(conn.LocalAddr().String() + " : Client connected!")
time.Sleep(10 * time.Second)
运行后,结果如下和预期结果:打印时,您可以看到连接。当断开链接时,您可以看到连接

如果我们在连接失效前用杀9怎么办?

关闭没有做它,但它发生了四次!
对数据的研究得出以下结论:
a.b 两个对等对等程序。如果进程b不叫近,则发送FIN软件包是内核操作系统。
根据前一次试验的结果,我们发现,即使过程意外终止,操作系统也将有助于四次发动波浪。
但是,如果出现断电或网络中断,操作系统将无法接管。为了简化测试,将两个个人电脑连接到服务器上,然后切断服务器的网络以模拟停电。
已知的情况是,当电网缩小时,链接不会立即下降。
如果当网络关闭时数据被传输,由于无法进入ACK,所以会重试,然而,这种情况不能无限期地继续下去。在多次重复之后,如果对查询的答案仍未确认,则没有答案。如果你想参与其中,你将被视为网络或终端主机异常。强制关闭连接。目前,关闭是直接关闭。他们不会挥手(数据甚至没有发出)。还挥啥手),将 Linux 配置为
最低的再传送时间为200毫秒,最高再传送时间为120毫秒,再传送次数为15毫秒。
如果网络关闭时没有数据传输,可检查TCP所附的活性键是否打开。 TCP的主要活性特征如下:
由许多操作系统参数控制 :
读取 Linux 上的以下文件 :
cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
cat /proc/sys/net/ipv4/tcp_keepalive_probes

如果需要两个小时时间而不按默认方式传输数据,则维持生命开始运作!
只有两个参数可以设定在 Go 中 :
conn.SetKeepAlive(true)
conn.SetKeepAlivePeriod(5 * time.Second)
其中第二个是SetPlaveAlivePeridod, 其源代码如下:
func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
// The kernel expects seconds so round to next highest second.
secs := int(roundDurationUp(d, time.Second))
if err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, sysTCP_KEEPINTVL, secs); err != nil {
return wrapSyscallError("setsockopt", err)
}
err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE, secs)
runtime.KeepAlive(fd)
return wrapSyscallError("setsockopt", err)
}
SetkeepalivePeriod 参数设置为 tcp_keepalive_intvl 和 tcp_keepalive_time, 以及 tcp_keepalive_ probes 。
简单的测试 : 一旦 Cliet 打开了关键连接连接服务器, 没有传输数据, 服务器的网络被打破, 关键的生命心跳软件包是可见的, 连接被设置在 CLLOSED 上一段时间 。

如果CasepeAlive在没有数据传输的情况下被关闭, 连接将永远不会被切断 。
考虑另一种情况,即在与服务器和服务器终端网络运行中断后没有数据传输;如果重新启动服务器软件并恢复网络,连接工作是否会进行?
如果服务器重新启动,我不确定 阴蒂 或者我不传输数据连接似乎正在运行中 。因为他们不知道对方的立场然而,如果客户 向服务器发送少量的数据 在这个时刻,你会看到服务器会给客户发RST然后,突然间, 连接被切断。

除正常情况外,本条将试验与TCP联系分离的一些结果结合起来:
本文由 在线网速测试 整理编辑,转载请注明出处。