vb.net - ReceiveBufferSize - 从具有高延迟的服务器下载
问题描述
我有一个从英国连接到美国的非常基本的文件下载。该文件大约10MB,连接速度很快,但延迟为80ms。
既然我们有高延迟,有什么办法可以减少 TCP 层的确认窗口以减少发生的聊天?
' Download a Large PDF
Using client As New System.Net.WebClient()
Dim url As String = "doc url"
Dim beginTime As DateTime = DateTime.Now
client.Credentials = System.Net.CredentialCache.DefaultCredentials
client.DownloadFile(url, "TMP.ZIP")
logWriter.WriteLine("6 MB ZIP File" & "," & (DateTime.Now - beginTime).TotalMilliseconds)
End Using
解决方案
有什么方法可以减少 TCP 层的确认窗口以减少发生的聊天?
在应用程序级别,您无法控制通信网络层中发生的事情,这一切都由较低级别的 API 处理。.NET 框架只为您提供了一些建立在这些 API 之上的类型,以简化实现过程。
话虽如此,确认是使 TCP 可靠的原因,这些确认可以保证所有数据都发送到连接的另一端。您可以切换到使用不使用确认的 UDP,这意味着您永远无法验证数据是否已成功接收,这对于实时通信非常有用(以平衡速度和质量),但不适用于发送文件,因为我们希望文件被完全传输,而不仅仅是总文件的 96%。验证我们是否收到完整文件的唯一方法是让接收方通知我们它确实收到了数据包。
对我来说,这听起来像是与基础设施/网络架构相关的问题。因此,我个人不会尝试在应用程序级别尝试解决此问题。使用 WebClient 类,因此使用 TCP,感觉就像是适合您的用例的正确协议。所以在我看来,你已经完成了你的工作并正确地实现了文件下载。
如果您有可能,我会尝试在服务器和客户端之间放置一个内容交付网络 (CDN),以便 CDN 可以卸载下载并上传到靠近您的物理位置的边缘服务器。
如果这不可能,您就可以发挥创造力,例如,在英国拥有第二台服务器,该服务器与位于美国服务器上的文件同步。出于时间/金钱的原因,我不会这样做,而只是按原样处理延迟;80ms 对我来说是可以接受的。
推荐阅读
- linux - 使用参数访问 JQ 变量
- sqlite - 烧瓶应用程序中的 SQL Alchemy Query 用于多对多关系
- spring - IllegalStateException:无法将“StandardMultipartHttpServletRequest$StandardMultipartFile”类型的值转换为所需的“java.lang.String”类型
- firebase - 错误:没有为类“对象”定义吸气剂“文档”。- “对象”来自“飞镖:核心”
- c++ - boost::qi 按最后一个顺序项评估结果
- angular - 使用 Angular。当我单击链接时,我想打开新页面来显示,而不是显示在链接下方
- mysql - Django:如何通过 ORM 或 Mysql 过滤属性?
- activemq-artemis - ActiveMQ Artemis - max-delivery-attempts 超过 7
- java - 线程“JavaFX 应用程序线程”中的异常 java.lang.IllegalArgumentException:此 ParagraphText 不是给定形状的父级
- c++ - 按规则对结构的 std::list 进行排序