2017-10-06 112 views
1

我正在开发一个domotica程序(Extron),我有一个内存问题。因此,我想知道Python对TCP做了什么回应,我没有放入一个变量。Python如何处理TCP响应你不放入一个变量?

我有下面的代码行:

Matrix.SendAndWait(str(States.MatrixStatus[States.RecorderStatus['Recorder 2']]['Fullscreen Input'])+'*'+\ 
              str(Collegerama['Recorder 2 Output'])+'%', 0.3, deliTag=b'\x0A') 

的SendAndWait命令通常用来放响应中的一个变量,但我用它来减缓编程,并确保该设备已准备就绪下一个命令。

但不是我有内存泄漏我不知道如果响应放在某处并永远不会从内存中清除。

回答

0

信息存储在接收缓冲区中,只要它不超限。通过设置TCP接收窗口大小https://en.wikipedia.org/wiki/TCP_tuning#Window_size)来防止溢出。如果数据包有最大容量,接收缓冲区只能容纳一个数据包。

maximum packet size for a TCP connection

所以分组最初被存储在接收缓冲器中(这是在OSI模型的网络层)从它们由更高层在OSI模型中,即TCP(在OSI模型的传输层取出这个接收缓冲器),然后删除头部以获得数据/有效载荷...

如果当前在接收缓冲区中的数据包未被提取,它们将被新传入的数据包覆盖。所以如果数据处理速度不够快,信息就会丢失,任何新来的数据包都会覆盖接收缓冲区中的旧数据包。

https://en.wikipedia.org/wiki/OSI_model

https://www.cubrid.org/blog/understanding-tcp-ip-network-stack这个详细描述

数据接收

现在,让我们来看看是如何接收数据。数据接收是一个 过程,用于网络堆栈如何处理进入的数据包。图 3显示了网络堆栈如何处理接收到的数据包。

首先,NIC将数据包写入其内存。它通过执行CRC检查来检查数据包是否有效,然后将 数据包发送到主机的内存缓冲区。该缓冲区是驱动程序已经向内核请求 并且分配了 来接收数据包的内存。缓冲区分配后,驱动程序 会告知NIC的内存地址和大小。即使NIC收到 数据包,驱动程序仍未分配主机内存缓冲区时,NIC可能会丢弃数据包。

将数据包发送到主机内存缓冲区后,NIC向主机操作系统发送一个 中断。

然后,驱动程序检查它是否可以处理新数据包。 到目前为止,使用由制造商 定义的驱动程序NIC通信协议。

当驾驶员应该发送的分组到上层,分组 必须包装,所述操作系统使用的操作系统 了解分组的分组结构。例如,Linux的sk_buff, 的BSD系列内核的mbuf和Microsoft Windows的NET_BUFFER_LIST是相应OS的 数据包结构。驱动程序发送 包装的数据包到上层。

以太网层检查数据包是否有效,然后 解除多路复用上层协议(网络协议)。目前,它 使用以太网报头的ethertype值。 IPv4 ethertype 的值是0x0800。它删除以太网报头,然后将IP数据包发送到IP层。

IP层还检查数据包是否有效。换句话说, 它检查IP头校验和。它在逻辑上决定它是否应执行IP路由并使本地系统处理数据包 或将数据包发送到其他系统。如果本地系统必须处理分组 ,则IP层通过参考IP报头的协议值来解复用上层协议 (传输协议)。 TCP协议值为6.它删除IP头,然后将 数据包发送到TCP层。

与下层一样,TCP层检查数据包是否为 有效。它还检查TCP校验和。如前所述,由于当前网络堆栈使用校验和卸载,所以TCP校验和是由NIC而不是由内核计算的 。

然后它搜索数据包连接的TCP控制块。 此时, 数据包的<source IP, source port, target IP, target port>被用作标识符。搜索完连接后,它会执行处理该数据包的协议。如果它已收到新的 数据,它将数据添加到接收套接字缓冲区。根据TCP状态 ,它可以发送一个新的TCP数据包(例如,一个ACK数据包)。 现在TCP/IP接收数据包处理已完成。

接收套接字缓冲区的大小是TCP接收窗口。对于某个点,当接收窗口大于 时,TCP吞吐量会增加。过去,套接字缓冲区大小已在 应用程序或OS配置上进行了调整。最新的网络堆栈具有 函数来自动调整接收套接字缓冲区大小,即接收 窗口。

当应用程序调用读取系统调用时,该区域将 更改为内核区域,并将套接字缓冲区中的数据复制到用户区中的 内存中。复制的数据将从套接字 缓冲区中删除。然后调用TCP。 TCP增加了接收 窗口,因为套接字缓冲区中有新的空间。它根据协议状态发送一个 数据包。如果没有数据包传输,则系统调用终止。

相关问题