如何重用连接/请求以避免握手

时间:2014-06-13 09:52:49

标签: c# ssl xamarin.ios httpwebrequest xamarin

我想知道重用HttpWebRequests如何工作以避免每次都进行SSL握手过程。

我在请求中使用keep alive headr并且第一次握手是成功的,但我想重用该请求以避免将来对同一证书进行握手。

Think是我不知道我是否必须重用HttpWebRequest对象实例,或者即使我创建了一个新的请求对象,它也将使用相同的连接,因为keep alive已经就位并正常工作。

我应该存储现有的请求对象,让我们说在类级别并重用它?或者我可以安全地处理该对象,下次我创建一个请求时它会受到保持连接的影响吗?

我问这个原因我需要降低应用程序的时间,最糟糕的部分总是ssl握手,在带有来自运营商的中等信号的手机中可能需要3秒钟。

我正在使用C#开发。 我试图寻找这种信息,但我通过互联网阅读的是如何设置SSL服务器并启用某些设置,但不知道如何使客户端使用这些功能。

编辑:调查结果 我使用以下代码在.NET C#中创建了一个示例程序:

Stopwatch sw = new Stopwatch();
sw.Start();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(@"https:\\www.gmail.com"));
request.KeepAlive = true;
request.Method = "GET";
request.ContentType = "application/json";
request.ContentLength = 0;
request.ConnectionGroupName = "test";
//request.UnsafeAuthenticatedConnectionSharing = true;
//request.PreAuthenticate = true;
var response = request.GetResponse();
//response.Close();
request.Abort();
sw.Stop();
listBox1.Items.Add("Connection in : " + sw.Elapsed.ToString());
sw.Reset();
sw.Start();
HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(new Uri(@"https:\\www.gmail.com"));
request2.KeepAlive = true;
request2.Method = "GET";
//request2.UnsafeAuthenticatedConnectionSharing = true;
//request2.PreAuthenticate = true;
request2.ContentType = "application/json";
request2.ContentLength = 0;
request2.ConnectionGroupName = "test";
var response2 = request2.GetResponse();
//response2.Close();
request2.Abort();
sw.Stop();
listBox1.Items.Add("Connection 2 in : " + sw.Elapsed.ToString());

结果是第一个连接触发了CertificatevalidationCallback 3次(每个证书一个),然后第二个连接只触发一次,但是当我关闭响应,然后再执行下一个请求时,没有回调是触发。

我认为保持响应打开会使套接字保持打开状态,这就是发生部分握手的原因(而不是完整的证书链)。

很抱歉,如果我在这件事上听起来像菜鸟,SSL和时间是由工作伙伴编写的,代码不明确。但我想我有答案。 感谢Poupou的大力帮助

1 个答案:

答案 0 :(得分:0)

这已经内置了Xamarin.iOS附带的SSL / TLS堆栈(即低于HttpWebRequest)。 无法设置启用此功能。事实上,如果你想禁用它,你需要额外的代码。

如果服务器支持它,那么后续握手会更快,因为将使用会话ID 缓存(请参阅TLS 1.0 RFC第30页)。

然而,服务器不必遵守会话ID(给予它)。在这种情况下,需要再次进行完全握手。如果您不能从客户端强制执行此操作(仅限优惠)。

您可以使用网络分析仪验证这一点,例如: wireshark,通过查看交换(并将它们与RFC进行比较)。