[英]How can I verify that a TCP packet has received an ACK in C#?
使用阻塞/非阻塞方法發送一些tcp數據后,例如:
Socket.Send() or Socket.SendAsync()
我怎么知道我的數據收到了ACK消息?
.NET能否知道TCP數據是否已成功發送?
確切知道的唯一方法是實現某種應用程序級別的確認。 TCP級別“ACK”數據包根本不會暴露給應用程序級別,因此您必須使用更多內容。
你讓另一端回應它。
即使TCP已經Acked它,如果接收端在處理消息並對其進行操作之前終止(有好的或壞的原因),你仍然不知道,所以唯一的方法是讓對方告訴你。
無法從.net的類庫中獲取此信息。 當我開始在C#中使用此端口掃描程序時,我有同樣的注意事項。 我已經使用了libpcap的.NET包裝器(在安裝相應的驅動程序之后),SharpPcap( http://sourceforge.net/projects/sharppcap/ ),以獲得這種信息。 ACK數據包是通過SharpPcap的接口獲得的(透明地調用本機libpcap接口)。
我的應用程序是NScanner Port Scanner / Sweeper,您可以在codeplex找到代碼,並參考我對上述庫( http://nscanner.codeplex.com/ )的簡單使用。
我希望我幫忙。
“我正在努力關注你怎么知道你的數據何時被連接的另一方接受。”
我認為您需要了解要實現的應用層協議類型以及它對應用程序性能的影響。
以HTTP為例,說明“Streaming like”協議。 服務器將數據流發布到客戶端。 沒有更多的額外應用程序層“ACK”,服務器實際上並不關心他的數據流何時以及如何到達。 這在高延遲鏈路上非常有效。
現在將其與SMB進行比較! 數據被分區為塊,而不是流式傳輸文件。 每個成功傳輸的數據塊都在應用層上進行處理。 這為您提供了更多控制,但是,它有效地殺死了WAN網絡上的協議(請查看“帶寬延遲產品”)。
考慮到這一點,您可以為自定義協議提出自己的設計。
如果您確實需要知道TCP連接的數據包級別詳細信息,那么除了創建用於發送的TCP套接字之外,您還需要應用程序使用winpcap API來查看原始流量。 您可以安裝過濾器,僅接收與確定遠程端的特定IP,端口組合相關的數據包。
有一些項目在那里為libpcap創建.NET包裝器,例如這里
TCP層將繼續重新發送數據包,直到它收到成功的ACK。
發送將阻止,直到發生這種情況 - SendAsync不會阻塞,並且您可以在TCP層處理發送數據包時繼續處理其他內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.