{"id":749,"date":"2015-10-18T18:31:10","date_gmt":"2015-10-18T21:31:10","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=749"},"modified":"2018-12-18T22:06:52","modified_gmt":"2018-12-19T01:06:52","slug":"instancia-default-e-conectividade-nao-default-parte-2","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2015\/10\/18\/instancia-default-e-conectividade-nao-default-parte-2\/","title":{"rendered":"Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default &#8211; Parte 2"},"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=\"749\" 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 2\/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\"> 4<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>Ol\u00e1! Tempos de calor, hor\u00e1rio de ver\u00e3o, e n\u00e3o podemos parar de estudar, aprender e compartilhar! Ent\u00e3o, aqui estamos, com a segunda, e pen\u00faltima, parte sobre conectividade no SQL Server. No <a href=\"http:\/\/thesqltimes.com\/blog\/2015\/10\/14\/instancia-default-e-conectividade-nao-default-parte-1\/\" target=\"_blank\">\u00faltimo post,<\/a> vimos que acontece quando voc\u00ea configura uma inst\u00e2ncia DEFAULT para aceitar conex\u00f5es em um porta que n\u00e3o seja a default. Para os exemplos, estou usando um SQL chamado SQL1, cujo o IP \u00e9 50.50.50.11, partindo de um client cujo IP \u00e9 50.50.50.10. Vamos ver agora, o que ocorre quando temos um firewall no meio de uma situa\u00e7\u00e3o destas!<\/p>\n<h2><strong>Cen\u00e1rio\u00a0Firewall no meio!<\/strong><\/h2>\n<p>Este \u00e9 outro caso que pode dar um pouco mais de dor de cabe\u00e7a. A maioria dos firewalls n\u00e3o s\u00e3o t\u00e3o amig\u00e1veis como o Sistema Operacional que apenas devolve um RESET na porta. Eles descartam o pacote e n\u00e3o respondem nada ao client. Isso faz com o que o pobre infeliz do client fique esperando uma resposta at\u00e9 que o timeout do TCP entre em a\u00e7\u00e3o. O efeito colateral aqui ser\u00e1 o mesmo cen\u00e1rio anterior, por\u00e9m o tempo de espera, somado \u00e0s retransmiss\u00f5es, ainda na camada do TCP, pode ocupar todo o precioso tempo de timeout pra conex\u00e3o (que \u00e9 uma coisa diferente do timeout do TCP), fazendo com que nem o pr\u00f3ximo protocolo tenha chance&#8230; E o que voc\u00ea tem neste caso? Aquele famoso erro de conex\u00e3o relacionado \u00e0 rede depois de uma longa espera!<\/p>\n<p>Pra ilustrar isso eu apenas liguei o firewall do Windows no servidor onde est\u00e1 a inst\u00e2ncia SQL1 e bloqueei a porta 1433. Os efeitos foram bem legais. O c\u00f3digo que executei foi este:<\/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<div style=\"text-align: justify;\">\u00a0E l\u00e1 vamos n\u00f3s:<\/div>\n<div style=\"text-align: justify;\"><\/div>\n<div style=\"text-align: justify;\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-DefaultTimeout.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-729\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-DefaultTimeout.png\" alt=\"Tempo de conex\u00e3o em inst\u00e2ncia default, com firewall na 1433\" width=\"1166\" height=\"136\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-DefaultTimeout.png 1166w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-DefaultTimeout-300x35.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-DefaultTimeout-1024x119.png 1024w\" sizes=\"auto, (max-width: 1166px) 100vw, 1166px\" \/><\/a><\/div>\n<div style=\"text-align: justify;\"><\/div>\n<p>Uau! Incr\u00edveis 21 segundos e o que temos na resposta? Um erro! O que ocorreu foi exatamente o que explicamos acima. Aqui est\u00e1 o trace que n\u00e3o me deixa mentir:<\/p>\n<p><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Defaulttimeout.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-730 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Defaulttimeout.png\" alt=\"Trace durante a tentativa de conex\u00e3o com firewall na 1433\" width=\"1330\" height=\"396\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Defaulttimeout.png 1330w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Defaulttimeout-300x89.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Defaulttimeout-1024x305.png 1024w\" sizes=\"auto, (max-width: 1330px) 100vw, 1330px\" \/><\/a><\/p>\n<p>Olha o que o trace no mostra:<\/p>\n<ol>\n<li>Linha 1: O Three Way Handshake come\u00e7a e um solicita\u00e7\u00e3o de conex\u00e3o na porta 1433 \u00e9 enviada (devido ao fato de estarmos usando uma inst\u00e2ncia DEFAULT)<\/li>\n<li>Linha 2: 3 segundos depois do in\u00edcio da captura \u00e9 feito um retransmission. Note que n\u00e3o houve um RESET por parte do servidor. O firewall simplesmente descartou o pacote e n\u00e3o enviou qualquer resposta.<\/li>\n<li>Linha 3: 9 segundos depois do in\u00edcio da captura (e 6 segundos depois do retransmission anterior) \u00e9 feito um novo retransmission. De novo o firewall eliminou o pacote sem qualquer considera\u00e7\u00e3o <strong>#Coitado<\/strong><\/li>\n<li>Linha 4: 21 segundos depois vemos um ind\u00edcio de uma outra tentativa de conex\u00e3o. Neste ponto j\u00e1 \u00e9 poss\u00edvel perceber o client tentando usar o pr\u00f3ximo protocolo.<\/li>\n<\/ol>\n<p>Note que o intervalo entre o RETRANSMISSION vai dobrando!\u00a0Primeiro, ele esperou 3 segundos para fazer um retranmission. Depois esperou 6. Pela l\u00f3gica, ele iria aguardar mais 12 para dar como encerrado. E podemos perceber que se voc\u00ea somar 9 + 12, temos exatamente os 21 segundos. Isto \u00e9 um comportamento do protocolo TCP e estes links te d\u00e3o mais detalhes sobre isto.<\/p>\n<ul>\n<li><a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/170359\" target=\"_blank\">https:\/\/support.microsoft.com\/en-us\/kb\/170359<\/a><\/li>\n<li><a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/2786464\" target=\"_blank\">https:\/\/support.microsoft.com\/en-us\/kb\/2786464<\/a><\/li>\n<\/ul>\n<p>Os 21 segundos iniciais desta tentativa est\u00e3o dedicados somente \u00e0 tentativa usando TCP. Quando ele retorna com o status definitivo de falha, depois das tentativas de retransmiss\u00f5es, o client prossegue com o pr\u00f3ximo protocolo. Por\u00e9m, neste ponto, o <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms162773.aspx\" target=\"_blank\">timeout default de 8 segundos \u00a0do sqlcmd <\/a>j\u00e1 bateu e por isso temos a mensagem de erro acima. Uma medida bem interessante, se voc\u00ea quer ver a conex\u00e3o funcionar neste exemplo, \u00e9 aumentar o tempo de timeout da conex\u00e3o usando o par\u00e2metro <strong>-l.\u00a0<\/strong>Como no meu teste eu gastei 21 segundos s\u00f3 pro TCP, eu coloquei um timeout de 25 que, teoricamente, \u00e9 mais do que suficiente.<\/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 -l 25 -U Rodrigo -P rrg -Q \"DECLARE @i int = 1;\"; #Conecta com o SQL1 e faz algo simples com um timeout de 25 segundos\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\/WireShark-TraceSQL1-ComFirewall-Customtimeout.png\"><br \/>\n<\/a><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-733\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout.png\" alt=\"Script1-Sqlcmd-Firewall-CustomTimeout\" width=\"1183\" height=\"124\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout.png 1183w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout-300x31.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout-1024x107.png 1024w\" sizes=\"auto, (max-width: 1183px) 100vw, 1183px\" \/><\/a><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/Script1-Sqlcmd-Firewall-CustomTimeout.png\"><br \/>\n<\/a><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Customtimeout.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-732\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Customtimeout.png\" alt=\"WireShark-TraceSQL1-ComFirewall-Customtimeout\" width=\"1297\" height=\"544\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Customtimeout.png 1297w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Customtimeout-300x126.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2015\/10\/WireShark-TraceSQL1-ComFirewall-Customtimeout-1024x429.png 1024w\" sizes=\"auto, (max-width: 1297px) 100vw, 1297px\" \/><\/a><\/p>\n<p>E <em>voil\u00e0<\/em>! Nenhuma mensagem de erro e a conex\u00e3o foi feita com sucesso! Claro que isso seria facilmente resolvido de outras maneiras, sem ter que gastart todo este tempo de conex\u00e3o.<\/p>\n<p>Bom, por hoje \u00e9 s\u00f3! No pr\u00f3ximo post vamos, enfim, ver como podemos se conectar na inst\u00e2ncia errada. Neste momento voc\u00ea j\u00e1 deve imaginar como!<\/p>\n<p>At\u00e9 l\u00e1!<\/p>\n<p>Rodrigo Ribeiro Gomes<br \/>\n[]&#8217;s<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;<br \/>\nBom&#8230; antes de ir&#8230; #SQLSaturdayBSB #SQLSaturday469 #SQLSaturday #SQLSaturday!!!!!<\/p>\n<p><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 2 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>Ol\u00e1! Tempos de calor, hor\u00e1rio de ver\u00e3o, e n\u00e3o podemos parar de estudar, aprender e compartilhar! Ent\u00e3o, aqui estamos, com a segunda, e pen\u00faltima, parte sobre conectividade no SQL Server. No \u00faltimo post, vimos que acontece quando voc\u00ea configura uma inst\u00e2ncia DEFAULT para aceitar conex\u00f5es em um porta que n\u00e3o seja a default. Para os&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2015\/10\/18\/instancia-default-e-conectividade-nao-default-parte-2\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">Inst\u00e2ncia DEFAULT e conectividade n\u00e3o default &#8211; Parte 2<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"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],"tags":[160,153,167,164,169,166,165,73,168,155],"series":[152],"class_list":["post-749","post","type-post","status-publish","format-standard","hentry","category-administracao","category-arquitetura","category-banco-de-dados-2","category-sql-server","tag-160","tag-conectividade","tag-firewall","tag-instancia-default","tag-login-timeout","tag-named-pipe","tag-porta","tag-sql-server","tag-sqlcmd","tag-tcp","series-instancia-default-e-conectividade-nao-default"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/749","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=749"}],"version-history":[{"count":2,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/749\/revisions"}],"predecessor-version":[{"id":762,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/749\/revisions\/762"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=749"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}