URL monitor creates multiple ESTABLISHED (connection) entries in netstat

I wrote a URL monitoring program in Go, but after a while I found many ESTABLISHED entries in netstat -nao|grep 80 .

GetHttpStatusCode function:

  HttpClient = &http.Client{ Transport: &http.Transport{ Dial: func(netw, addr string) (net.Conn, error) { deadline := time.Now().Add(30 * time.Second) c, err := net.DialTimeout(netw, addr, 20*time.Second) if err != nil { return nil, err } c.SetDeadline(deadline) c.SetReadDeadline(deadline) c.SetWriteDeadline(deadline) return c, nil }, }, } // ... func getHttpStatusCode(url string) int { if url == "" { return 200 } req, err := http.NewRequest("GET", url, nil) if err != nil { return 0 } req.Close = true req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17") resp, err := HttpClient.Do(req) if err != nil { return 0 } defer resp.Body.Close() return resp.StatusCode } 

I checked the Go manual and did not find something like req.Close () and just put off resp.Body.Close ().

Here is the result of netstat -nao | grep 80 netstat -nao | grep 80 :

tcp 1343352 0 192.168.2.33:29581 220.181.155.19:80 ESTABLISHED off (0,00 / 0/0)

And the output of tcpdump tcp port 80 :

 14:32:54.085095 IP 113.12.80.13.http > wk_0_mysql.KIDC90805.zw.39174: Flags [.], seq 17376:18824, ack 1, win 42, options [nop,nop,TS val 4236145017 ecr 204896351], length 1448 14:32:54.109206 IP wk_0_mysql.KIDC90805.zw.25834 > 220.181.90.8.http: Flags [S], seq 714805337, win 14600, options [mss 1460,sackOK,TS val 204896416 ecr 0,nop,wscale 9], length 0 14:32:54.223349 IP 220.181.155.22.http > wk_0_mysql.KIDC90805.zw.19262: Flags [.], seq 864939135:864940583, ack 1630899997, win 42, options [nop,nop,TS val 1570834172 ecr 204896529], length 1448 14:32:54.223352 IP wk_0_mysql.KIDC90805.zw.19262 > 220.181.155.22.http: Flags [.], ack 1448, win 1301, options [nop,nop,TS val 204896530 ecr 1570834172], length 0 14:32:54.223432 IP 220.181.155.10.http > wk_0_mysql.KIDC90805.zw.27376: Flags [.], seq 3889371684:3889373132, ack 1106685068, win 42, options [nop,nop,TS val 3866364254 ecr 204896529], length 1448 14:32:54.223436 IP wk_0_mysql.KIDC90805.zw.27376 > 220.181.155.10.http: Flags [.], ack 1448, win 594, options [nop,nop,TS val 204896530 ecr 3866364254], length 0 14:32:54.275774 IP 121.12.101.130.http > wk_0_mysql.KIDC90805.zw.63329: Flags [.], seq 1314475629:1314477089, ack 642951590, win 54, length 1460 
+4
source share
1 answer

The HTTP client uses keep-alive connections by default, you can close them by calling transport.CloseIdleConnections (from docs ).

I'm not sure if req.Close does anything on client requests, it can only be for the server.

+8
source

All Articles