{"id":702,"date":"2015-10-14T03:05:26","date_gmt":"2015-10-14T06:05:26","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=702"},"modified":"2018-12-18T22:06:40","modified_gmt":"2018-12-19T01:06:40","slug":"instancia-default-e-conectividade-nao-default-parte-1","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2015\/10\/14\/instancia-default-e-conectividade-nao-default-parte-1\/","title":{"rendered":"Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default &#8211; Parte 1"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Muito \u00fatil!\" data-post-id=\"702\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div><div class=\"seriesmeta\">Post 1\/3. Este post \u00e9 parte da s\u00e9rie: <a href=\"https:\/\/thesqltimes.com\/blog\/series\/instancia-default-e-conectividade-nao-default\/\" class=\"series-152\" title=\"Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default\">Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default<\/a>\r\n<\/div>\r\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de Leitura:<\/span> <span class=\"rt-time\"> 8<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>Quanto tempo voc\u00ea acha que uma conex\u00e3o com o SQL Server deve levar para ser considerada como r\u00e1pida ou lenta? Esse \u00e9 aquele tipo de pergunta que n\u00e3o foge do famoso &#8220;depende&#8221;. Voc\u00ea j\u00e1 precisou ajustar as configura\u00e7\u00f5es de timeout de conex\u00e3o da sua aplica\u00e7\u00e3o? E voc\u00ea j\u00e1 conseguiu se conectar na inst\u00e2ncia errada, mesmo passando as credenciais e nomes corretos?<\/p>\n<p>\u00c9 meu caro,\u00a0as configura\u00e7\u00f5es de um client tem um papel muito maior quando o assunto \u00e9 inst\u00e2ncia DEFAULT. A brincadeira fica mais interessante quando este tipo de inst\u00e2ncia n\u00e3o est\u00e1 configurado para responder ou no pipe padr\u00e3o ou na porta TCP padr\u00e3o&#8230;<\/p>\n<h2>CLIENTs e Ordem dos Protocolos<\/h2>\n<p>Bom, antes vamos recapitular como um client escolhe um protocolo para se conectar no SQL Server. Dependendo da biblioteca de conex\u00e3o que estiver usando, podemos ter algumas varia\u00e7\u00f5es:<\/p>\n<ul>\n<li style=\"text-align: left;\">SQL Server Native Client (SNAC)<br \/>\nUsa a ordem especificada no SQL Server Configuration Manager (<strong>configura\u00e7\u00e3o referente \u00e0 client<\/strong> e n\u00e3o a servi\u00e7os).\u00a0Esta biblioteca \u00e9 geralmente usada por aplica\u00e7\u00f5es escritas em C\/C++.\u00a0Um exemplo de aplica\u00e7\u00e3o que usa o SNAC \u00e9 o SQLCMD.<br \/>\nComo eu sei disso? BOL:\u00a0<a href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ms187884(v=sql.130).aspx\" target=\"_blank\">https:\/\/technet.microsoft.com\/en-us\/library\/ms187884(v=sql.130).aspx<\/a><\/li>\n<li style=\"text-align: left;\">SqlClient<br \/>\nEsta \u00e9 usada geralmente por aplica\u00e7\u00f5es escritas em .NET! O Management Studio \u00e9 um exemplo bem cl\u00e1ssico. A ordem padr\u00e3o \u00e9: Shared Memory, \u00a0TCP\/IP e Named Pipes.<br \/>\nLembre-se que este client n\u00e3o \u00e9 afetado pela ordem do Configuration Manager<br \/>\nComo eu sei disto? <a href=\"http:\/\/blogs.msdn.com\/b\/adonet\/archive\/2010\/04\/18\/sqlclient-default-protocol-order.aspx\" target=\"_blank\">http:\/\/blogs.msdn.com\/b\/adonet\/archive\/2010\/04\/18\/sqlclient-default-protocol-order.aspx<\/a>\u00a0(se n\u00e3o for suficiente, o link acima tamb\u00e9m fala isso).<\/li>\n<\/ul>\n[stextbox id=&#8221;info&#8221; caption=&#8221;SQL Native Client e SqlClient&#8221;]\n<p>O Native Client, grosseiramente falando, \u00e9 um conjunto de bibliotecas disponibilizadas pela Microsoft para que seja poss\u00edvel se conectar com o SQL Server . Ele cont\u00e9m implementa\u00e7\u00f5es das interfaces OLE DB \u00a0e ODBC e substitui o velho MDAC (Microsoft Data Access Components) que tamb\u00e9m fornecia implementa\u00e7\u00f5es OLE DB e ODBC. Voc\u00ea pode obter mais informa\u00e7\u00f5es e documenta\u00e7\u00e3o do Native Client na p\u00e1gina do mesmo:\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/data\/ff658532.aspx\" target=\"_blank\">https:\/\/msdn.microsoft.com\/en-us\/data\/ff658532.aspx<\/a>.<\/p>\n<p>Assim como o Native Client, o SqlClient \u00e9 a biblioteca disponibilizada pelo .NET Framework para que as aplica\u00e7\u00f5es escritas na linguagem possam se comunicar\u00a0com o SQL Server. Mais informa\u00e7\u00f5es em:\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/system.data.sqlclient(v=vs.110).aspx\" target=\"_blank\">https:\/\/msdn.microsoft.com\/en-us\/library\/system.data.sqlclient(v=vs.110).aspx<\/a><\/p>\n[\/stextbox]\n<p>Quando se trata-de uma inst\u00e2ncia DEFAULT, o client ir\u00e1 usar as op\u00e7\u00f5es padr\u00e3o\u00a0de conex\u00e3o para cada protocolo. Por exemplo, no caso do TCP\/IP a porta default \u00e9 a 1433. No caso do Native Client, voc\u00ea pode alterar tanto a porta como o named pipe padr\u00e3o. Quando uma inst\u00e2ncia NOMEADA \u00e9 utilizada, ent\u00e3o entra em a\u00e7\u00e3o o SSRP, ou <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/cc219703.aspx\" target=\"_blank\">SQL Server Resolution Protocol<\/a>, onde o client vai mandar uma mensagem pro SQL Browser para tentar descobrir as informa\u00e7\u00f5es de pipe e porta da inst\u00e2ncia desejada.<\/p>\n<p>Isso nos leva h\u00e1 alguns cen\u00e1rios bem interessantes quando estamos lidando com inst\u00e2ncias DEFAULT, em portas\/pipe diferentes do padr\u00e3o:<\/p>\n<ol>\n<li>O que acontece se a porta 1433 estiver fechada, isto \u00e9, nenhum servi\u00e7o est\u00e1 associado a ela?<\/li>\n<li>O que acontece se houver um firewall eliminando os pacotes?<\/li>\n<li>O que acontece se houver uma outra inst\u00e2ncia rodando na porta 1433 neste mesmo servidor?<\/li>\n<\/ol>\n<p>Bom, vamos fazer uma brincadeira com cada um\u00a0destes casos!<\/p>\n<h2><strong>Cen\u00e1rio Porta 1433 fechada!<\/strong><\/h2>\n<p>O primeiro cen\u00e1rio \u00e9 o mais interessante e provavelmente o mais comum neste tipo de situa\u00e7\u00e3o. Voc\u00ea instalou a inst\u00e2ncia DEFAULT \u00a0e configurou para ela rodar em outra porta. Em meus testes, eu vi que a conex\u00e3o sempre demora cerca de 1 segundo para completar. Este tempo n\u00e3o \u00e9 alto! Ou \u00e9? Imagine uma aplica\u00e7\u00e3o que necessite abrir v\u00e1rias conex\u00f5es a todo momento e que \u00e9 crucial que o tempo de resposta do banco seja abaixo de 1 segundo. Bom, neste caso, voc\u00ea gastou 1 segundo s\u00f3 pra se conectar!<\/p>\n<p>Para ilustrar, eu fiz um teste onde eu tento me conectar de um client, cujo o IP \u00e9 50.50.50.10, no servidor SQL1 (50.50.50.11) que possui uma inst\u00e2ncia default rodando na porta 1436. Eu usei um script muito\u00a0simples em powershell\u00a0pra gente poder medir o tempo que o <strong>sqlcmd<\/strong> levou:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Testando o tempo de conex\u00e3o\">$start = (Get-Date); #Pega a data atual!\r\nsqlcmd -S SQL1 -U Rodrigo -P rrg -Q \"DECLARE @i int = 1;\"; #Conecta com o SQL1 e faz algo simples\r\n((Get-Date) - $start).totalMilliseconds #Exibe o tempo gasto\r\n\r\n<\/pre>\n<p>Aqui est\u00e1 o meu resultado:<\/p>\n<p><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-704 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao.png\" alt=\"Medindo o tempo de conex\u00e3o com inst\u00e2ncia default\" width=\"1090\" height=\"83\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao.png 1090w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-300x23.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-1024x78.png 1024w\" sizes=\"auto, (max-width: 1090px) 100vw, 1090px\" \/><\/a><\/p>\n<p>No exemplo acima, o sqlcmd\u00a0demorou mais de 1 segundo pra executar. Se voc\u00ea acha que isso \u00e9 normal, ent\u00e3o olhe uma vers\u00e3o mais r\u00e1pida:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Testando o tempo de conex\u00e3o\">$start = (Get-Date); #Pega a data atual!\r\nsqlcmd -S np:SQL1 -U Rodrigo -P rrg -Q \"DECLARE @i int = 1;\"; #Conecta com o SQL1 e faz algo simples\r\n((Get-Date) - $start).totalMilliseconds #Exibe o tempo gasto\r\n\r\n<\/pre>\n<p><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-NamedpipesDireto.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-705 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-NamedpipesDireto.png\" alt=\"Tempo de Conex\u00e3o especificando o protocolo diretamente\" width=\"1100\" height=\"94\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-NamedpipesDireto.png 1100w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-NamedpipesDireto-300x26.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Cenario1-TempoConexao-NamedpipesDireto-1024x88.png 1024w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Incr\u00edveis 148 milisegundos, conta 1073 do anterior. Quase 90% a menos.<br \/>\nNote que a unica diferen\u00e7a entre os dois scripts \u00e9 que eu especifiquei o protocolo diretamente na conex\u00e3o. Para entender o porqu\u00ea dessa diferen\u00e7a,\u00a0primeiro vejamos o que est\u00e1 acontecendo debaixo dos panos.<br \/>\nEu usei o <a href=\"https:\/\/www.wireshark.org\/\" target=\"_blank\"><strong>wireshark<\/strong> <\/a>para capturar os pacotes de rede entre minha m\u00e1quina e o servidor SQL no momento em que eu fiz o primeiro teste. Eis o resultado:<\/p>\n<figure id=\"attachment_706\" aria-describedby=\"caption-attachment-706\" style=\"width: 1428px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-ConexaoLenta.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-706 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-ConexaoLenta.png\" alt=\"Resultado do Wireshark quando a conex\u00e3o ficou lenta\" width=\"1428\" height=\"572\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-ConexaoLenta.png 1428w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-ConexaoLenta-300x120.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-ConexaoLenta-1024x410.png 1024w\" sizes=\"auto, (max-width: 1428px) 100vw, 1428px\" \/><\/a><figcaption id=\"caption-attachment-706\" class=\"wp-caption-text\">Resultado do Wireshark quando a conex\u00e3o ficou lenta (clique para ampliar)<\/figcaption><\/figure>\n<p>O que esse resultado nos revela:<\/p>\n<ol>\n<li>A coluna <strong>Time\u00a0<\/strong>nos mostra o tempo desde o in\u00edcio da sess\u00e3o de captura no formato <strong>Segundos.Milissegundos<\/strong>.\u00a0A linha 1 nos mostra claramente que a primeira comunica\u00e7\u00e3o com o servidor SQL1 \u00e9 feita diretamente na porta\u00a01433, confirmando o que eu disse no \u00ednicio do post. A coluna Info mostra que minha requisi\u00e7\u00e3o, que est\u00e1 saindo pela porta 4752, est\u00e1 tentando abrir uma conex\u00e3o na porta 1433.\u00a0Como o protocolo TCP \u00e9 usado, ent\u00e3o um SYN enviado como parte do <a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/172983\" target=\"_blank\">Three Way Handshake<\/a>.<\/li>\n<li>Na linha 2, cerca de 0.0001 segundos depois do in\u00edcio da captura dos pacotes, o servidor SQL1 (50.50.50.11) responde com um RESET (coluna Info vem com a flag RST), isto \u00e9, como a porta est\u00e1 fechada e nenhum processo est\u00e1 na escuta, ent\u00e3o a tentativa de conex\u00e3o \u00e9 negada. De novo, isso faz parte do\u00a0processo\u00a0<a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/172983\" target=\"_blank\">Three Way Handshake<\/a>\u00a0do protocolo TCP.<\/li>\n<li>Cerca de 0.500 segundos depois, um TCP RETRANSMISSION \u00e9 feito (linha 3). Isto \u00e9, a minha m\u00e1quina est\u00e1 tentando novamente uma conex\u00e3o na porta 1433.\u00a0Na linha 4 o servidor volta a responder com um RST. Justo! <span style=\"color: #ff0000;\"><strong>Note que isto n\u00e3o \u00e9 uma nova tentativa de conex\u00e3o por parte do client SQL, mas uma\u00a0tentativa do protocolo TCP. O client neste ponto,\u00a0ainda est\u00e1 aguardando a reposta da chamada de rede (Ex.: <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms741559(v=vs.85).aspx\" target=\"_blank\">WSAConnect<\/a>())<\/strong><\/span><\/li>\n<li>Na linha 5, j\u00e1 1 segundo depois do \u00ednicio da captura, um novo TCP RETRANSMISSION \u00e9 feito. Se voc\u00ea reparar, o tempo que passou entre a linha 04 e a linha 05 foram os mesmos 500\u00a0milissegundos entre a\u00a0linha 02 e linha 03. Novamente, como mostrado na linha 06, o servidor volta a negar a conex\u00e3o. De novo, essa retrasmiss\u00e3o ainda faz parte da primeira tentativa de acesso do client (que est\u00e1 tentando o protocolo TCP\/IP).<\/li>\n<li>A partir da linha 7, podemos perceber que o Named Pipes j\u00e1 come\u00e7ar a ser usado porque o client tenta se conectar na porta do SMB (445). O Named Pipes \u00e9 uma implementa\u00e7\u00e3o do protocolo SMB, e por isso estamos vendo ele em cena. Aqui, antes que esse tentativa fosse feita, o protocolo TCP respondeu ao client (no caso o Native Client) que a tentativa de conex\u00e3o na 1433 foi sem sucesso, o que ocasionou um &#8220;failover&#8221; de protocolo, e o client tentou o pr\u00f3ximo dispon\u00edvel , que \u00e9 o Named Pipes.<\/li>\n<\/ol>\n<p>Podemos concluir que devido ao fato da porta est\u00e1 fechada, uma retransmiss\u00e3o por parte do client est\u00e1 sendo feita, e essas retransmiss\u00f5es \u00e9 quem est\u00e3o consumindo a maior parte do tempo para efetivar a conex\u00e3o com o SQL Server. <strong>Sim, mesmo que o TCP acaba n\u00e3o sendo usado no final<\/strong>&#8230; Quando eu especifico o protocolo\u00a0diretamente, estamos for\u00e7ando o client a usar este protocolo ao inv\u00e9s de tentar seguir a ordem configurada.\u00a0Ent\u00e3o a tentativa na porta 1433 \u00e9 eliminada, e com isto os retransmissions. Os dois scripts abaixo permitem contornar esse problema porque estamos justamente eliminando aquelas tentativas de conex\u00e3o\u00a0iniciais:<\/p>\n<p>Vers\u00e3o TCP:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Testando o tempo de conex\u00e3o\">$start = (Get-Date); #Pega a data atual!\r\nsqlcmd -S tcp:SQL1,1436 -U Rodrigo -P rrg -Q \"DECLARE @i int = 1;\"; #For\u00e7a a conex\u00e3o na porta TCP 1436\r\n((Get-Date) - $start).totalMilliseconds #Exibe o tempo gasto\r\n<\/pre>\n<p><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-TCPforcado.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-709 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-TCPforcado.png\" alt=\"Tempo de conex\u00e3o com TCP for\u00e7ado\" width=\"1110\" height=\"102\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-TCPforcado.png 1110w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-TCPforcado-300x28.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-TCPforcado-1024x94.png 1024w\" sizes=\"auto, (max-width: 1110px) 100vw, 1110px\" \/><\/a><\/p>\n<figure id=\"attachment_714\" aria-describedby=\"caption-attachment-714\" style=\"width: 1205px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-TCPForcado1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-714 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-TCPForcado1.png\" alt=\"\" width=\"1205\" height=\"378\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-TCPForcado1.png 1205w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-TCPForcado1-300x94.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-TCPForcado1-1024x321.png 1024w\" sizes=\"auto, (max-width: 1205px) 100vw, 1205px\" \/><\/a><figcaption id=\"caption-attachment-714\" class=\"wp-caption-text\">Note que n\u00e3o h\u00e1 tentativa na 1433<\/figcaption><\/figure>\n<p>Aqui a vers\u00e3o com Named Pipes:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Testando o tempo de conex\u00e3o\">$start = (Get-Date); #Pega a data atual!\r\nsqlcmd -S np:SQL1 -U Rodrigo -P rrg -Q \"DECLARE @i int = 1;\"; #For\u00e7a a conex\u00e3o por named pipes\r\n((Get-Date) - $start).totalMilliseconds #Exibe o tempo gasto\r\n\r\n<\/pre>\n<p><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-NPforcado.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-713 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-NPforcado.png\" alt=\"Script-Tempo-NPforcado\" width=\"1049\" height=\"93\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-NPforcado.png 1049w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-NPforcado-300x27.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script-Tempo-NPforcado-1024x91.png 1024w\" sizes=\"auto, (max-width: 1049px) 100vw, 1049px\" \/><\/a><\/p>\n<figure id=\"attachment_716\" aria-describedby=\"caption-attachment-716\" style=\"width: 1364px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-NPForcado2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-716 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-NPForcado2.png\" alt=\"\" width=\"1364\" height=\"308\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-NPForcado2.png 1364w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-NPForcado2-300x68.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Wireshark-Cenario1-NPForcado2-1024x231.png 1024w\" sizes=\"auto, (max-width: 1364px) 100vw, 1364px\" \/><\/a><figcaption id=\"caption-attachment-716\" class=\"wp-caption-text\">Note que aqui tamb\u00e9m n\u00e3o h\u00e1 tentativa 1433<\/figcaption><\/figure>\n[stextbox id=&#8221;info&#8221; caption=&#8221;Curiosidade: Alterando a quantidade de retransmiss\u00f5es&#8221;]\n<p>Outro ponto bem interessante para se notar \u00e9 que a maior parte do tempo gasto para abrir a conex\u00e3o foi devido ao TCP Retransmission. Um dos par\u00e2metros que controla quantas vezes o protocolo TCP\/IP ir\u00e1 tentar um retransmission \u00e9 o MaxSYNRetransmissions. Voc\u00ea precisa instalar <a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/2786464\" target=\"_blank\">este hotfix<\/a> para poder alterar no Windows 7 ou no Windows Server 2008 R2. O chato \u00e9 que o valor m\u00ednimo \u00e9 2 e o m\u00e1ximo \u00e9 8. Para alterar, depois que o hotfix estiver instalado, basta executar o comando netsh:<\/p>\n<div class=\"lang:batch decode:true\" title=\"Alterar MaxSYNRetransmissions\">\n<pre class=\"lang:batch decode:true\" title=\"Alterar MaxSYNRetransmission\">netsh interface tcp set global MaxSynRetransmissions=3<\/pre>\n<\/div>\n<p>Para n\u00f3s este comando n\u00e3o tem muita utilidade, uma vez que o menor \u00e9 2 (e \u00e9 justamente as duas tentativas que observamos nos exemplos acima). Vou ficar devendo um teste mais minuncioso, usando um debugger e outras ferramentas para ver se conseguimos alterar este valor apenas para fazer uma brincadeira e matar umas curiosidades, j\u00e1 que voc\u00ea n\u00e3o vai querer alterar essas configura\u00e7\u00f5es em produ\u00e7\u00e3o! Certo!?<\/p>\n[\/stextbox]\n<p>Ao relizar os testes, eu percebi que a ordem que estava no configuration Manager era: Shared Memory, TCP\/IP, Named Pipes. Eu tamb\u00e9m poderia ter contornado isto de v\u00e1rias formas, onde destaco:<\/p>\n<ul>\n<li>Ajustar a ordem dos protocolos<br \/>\nIsto\u00a0atenderia perfeitamente\u00a0este caso. Seu eu colocar o named pipes (sim, eu fiz este teste) antes do TCP\/IP, ent\u00e3o a conex\u00e3o seria feita de imediato no pipe padr\u00e3o (j\u00e1 que este eu n\u00e3o alterei l\u00e1 na instancia). Por\u00e9m, caso a inst\u00e2ncia\u00a0n\u00e3o aceite o outro protocolo, ent\u00e3o n\u00e3o vai adiantar muito. E tamb\u00e9m, pro caso do SqlClient do .NET, voc\u00ea n\u00e3o pode alterar a ordem padr\u00e3o. Ent\u00e3o, as tentativas no SSMS ainda continuariam com o delay.<\/li>\n<li>Alterar a porta default ou pipe padr\u00e3o<br \/>\nUsando o SQL Server Configuration Manager, poder\u00edamos alterar a porta default para 1436 (ou o pipe default, se foste o caso). Por\u00e9m isso faria com que as conex\u00f5es em outras inst\u00e2ncias DEFAULT , que estivessem rodando na 1433, falhassem.<\/li>\n<li>Configurar um Alias<br \/>\nEsta seria uma sa\u00edda\u00a0interessante, por\u00e9m voc\u00ea precisaria sair alterando em todas as m\u00e1quinas que possuem alguma aplica\u00e7\u00e3o que se conecta com a inst\u00e2ncia. Dependendo, poderia ser viavel.<\/li>\n<li><strong>[UPDATE 21\/12\/2012]<\/strong> Adicionar a\u00a0porta 1433<br \/>\nEsta \u00e9 uma sa\u00edda mais interessante ainda. Se estiver em um cen\u00e1rio onde mudar a porta atual n\u00e3o \u00e9 uma sa\u00edda (pelo fato de algumas aplica\u00e7\u00f5es estarem usando a mesma, por exemplo), voc\u00ea pode configurar o SQL Server para ouvir em mais de uma porta TCP. Basta separar portas por v\u00edrgula, no SQL Server Configuration Manager. Isso ir\u00e1 requerer um restart da inst\u00e2ncia! Os links a seguir fornecem mais detalhes:<\/p>\n<ul>\n<li><a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/294453\" target=\"_blank\">https:\/\/support.microsoft.com\/en-us\/kb\/294453<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms189310.aspx\" target=\"_blank\">https:\/\/msdn.microsoft.com\/en-us\/library\/ms189310.aspx<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Bom, por hoje \u00e9 s\u00f3. Nas pr\u00f3ximas 2 duas partes eu vou te mostrar o que acontece quando um firewall est\u00e1 no\u00a0meio, e tamb\u00e9m como voc\u00ea pode acabar se conectando na inst\u00e2ncia errada, mesmo tendo fornecido todas as informa\u00e7\u00f5es corretamente.<\/p>\n<p>At\u00e9 l\u00e1!<\/p>\n<p>UPDATE: O Link para a parte 2 <a href=\"http:\/\/thesqltimes.com\/blog\/2015\/10\/18\/instancia-default-e-conectividade-nao-default-parte-2\/\">est\u00e1 aqui<\/a>!<\/p>\n<p style=\"text-align: right;\">[]&#8217;s<br \/>\nRodrigo Ribeiro Gomes<\/p>\n<h2><\/h2>\n<p><strong>\u00a0Ops&#8230; N\u00e3o acabei ainda! J\u00e1 se inscreveu pro SQL Saturday 469? Se n\u00e3o, corre l\u00e1:<\/strong>\u00a0<a href=\"https:\/\/www.sqlsaturday.com\/469\/RegisterNow.aspx\" target=\"_blank\">https:\/\/www.sqlsaturday.com\/469\/RegisterNow.aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This entry is part 1 of 3 in the series <a href=\"https:\/\/thesqltimes.com\/blog\/series\/instancia-default-e-conectividade-nao-default\/\" class=\"series-152\" title=\"Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default\">Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default<\/a><\/div><p>Quanto tempo voc\u00ea acha que uma conex\u00e3o com o SQL Server deve levar para ser considerada como r\u00e1pida ou lenta? Esse \u00e9 aquele tipo de pergunta que n\u00e3o foge do famoso &#8220;depende&#8221;. Voc\u00ea j\u00e1 precisou ajustar as configura\u00e7\u00f5es de timeout de conex\u00e3o da sua aplica\u00e7\u00e3o? E voc\u00ea j\u00e1 conseguiu se conectar na inst\u00e2ncia errada, mesmo&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2015\/10\/14\/instancia-default-e-conectividade-nao-default-parte-1\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default &#8211; Parte 1<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":703,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[8,9,3,7,1],"tags":[160,162,153,159,158,161,154,156,157,73,163,155],"series":[152],"class_list":["post-702","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administracao","category-arquitetura","category-banco-de-dados-2","category-sql-server","category-uncategorized","tag-160","tag-client","tag-conectividade","tag-default-ports","tag-instancias-default","tag-named-pipes","tag-native-client","tag-odbc","tag-ole-db","tag-sql-server","tag-sqlclient","tag-tcp","series-instancia-default-e-conectividade-nao-default"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/comments?post=702"}],"version-history":[{"count":34,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/702\/revisions"}],"predecessor-version":[{"id":784,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/702\/revisions\/784"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media\/703"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=702"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}