2017-10-06 211 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增加了接收 窗口,因爲套接字緩衝區中有新的空間。它根據協議狀態發送一個 數據包。如果沒有數據包傳輸,則系統調用終止。

相關問題