I suppose in some situation the server will set SO_LINGER to zero before 
call Close(), but I have no evidence.

在2021年1月15日星期五 UTC+8 上午1:20:01<Eddix Chen> 写道:

> Recently I found my HTTP server close connection by RST/ACK instead of 
> FIN, I've searched for days but haven't find reason. I'm asking for advices 
> for solve this problem.
>
> 1. In which situations the HTTP server will use RST/ACK to close 
> connection instead of FIN in Go?
> 2. How can I force the server use FIN, not RST/ACK?
>
> *Appearance*
> I have a HTTP server running on a CentOS Linux server. Recently I found 
> sometimes the HTTP server close the connection with RST/ACK instead of 
> FIN/ACK, the client side didn't handle the RST/ACK packet in the right way, 
> it cause the whole service is not stable enough.
>
> *Information maybe important*
> Service logic: my service handler will check if there is new data for the 
> client request, if yes, it will return new data immediately, otherwise it 
> will sleep 5 seconds then respond a timestamp. I found that when the server 
> run into the sleep branch, sometimes it will sent RST/ACK instead of 
> FIN/ACK.
> Go version: 1.13
> Framework: gin (But I think this is not the reason 'cause gin is too high 
> level)
> Radio: About 15%, seems not relate to the QPS of server.
>
> *TCPDUMP*
> I use `gopacket` instead of `tcpdump -r` for better displaying and 
> understanding.
> I use 10.10.10.10 as the service side, and 192.168.123.123 as the client 
> side.
>
> [SYN]  PACKET: 74 bytes, wire length 74 cap length 74 @ 2020-12-29 
> 16:33:57.229551 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..60..] 
> SrcMAC=98:03:9b:84:17:8a DstMAC=7c:d3:0a:69:53:dd EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..40..] Version=4 
> IHL=5 TOS=64 Length=60 Id=16065 Flags=DF FragOffset=0 TTL=64 Protocol=TCP 
> Checksum=21831 SrcIP=192.168.123.123 DstIP=10.10.10.10 Options=[] 
> Padding=[]}
> - Layer 3 (40 bytes) = TCP {Contents=[..40..] Payload=[] SrcPort=19603 
> DstPort=8674 Seq=682579372 Ack=0 DataOffset=10 FIN=false SYN=true RST=false 
> PSH=false ACK=false URG=false ECE=false CWR=false NS=false Window=29200 
> Checksum=42658 Urgent=0 Options=[..5..] Padding=[]}
> [SYN,ACK]  PACKET: 74 bytes, wire length 74 cap length 74 @ 2020-12-29 
> 16:33:57.229609 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..60..] 
> SrcMAC=7c:d3:0a:69:53:dd DstMAC=98:03:9b:84:17:8a EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..40..] Version=4 
> IHL=5 TOS=64 Length=60 Id=0 Flags=DF FragOffset=0 TTL=55 Protocol=TCP 
> Checksum=40200 SrcIP=10.10.10.10 DstIP=192.168.123.123 Options=[] 
> Padding=[]}
> - Layer 3 (40 bytes) = TCP {Contents=[..40..] Payload=[] SrcPort=8674 
> DstPort=19603 Seq=2588707367 Ack=682579373 DataOffset=10 FIN=false SYN=true 
> RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false 
> Window=57920 Checksum=25750 Urgent=0 Options=[..5..] Padding=[]}
> [ACK]  PACKET: 66 bytes, wire length 66 cap length 66 @ 2020-12-29 
> 16:33:57.229621 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..52..] 
> SrcMAC=98:03:9b:84:17:8a DstMAC=7c:d3:0a:69:53:dd EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..32..] Version=4 
> IHL=5 TOS=64 Length=52 Id=16066 Flags=DF FragOffset=0 TTL=64 Protocol=TCP 
> Checksum=21838 SrcIP=192.168.123.123 DstIP=10.10.10.10 Options=[] 
> Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[] SrcPort=19603 
> DstPort=8674 Seq=682579373 Ack=2588707368 DataOffset=8 FIN=false SYN=false 
> RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false 
> Window=115 Checksum=42650 Urgent=0 Options=[TCPOption(NOP:), 
> TCPOption(NOP:), TCPOption(Timestamps:2729995117/397747075 
> 0xa2b86b6d17b52383)] Padding=[]}
> [PSH,ACK]  PACKET: 4344 bytes, wire length 4344 cap length 4344 @ 
> 2020-12-29 16:33:57.229631 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..4330..] 
> SrcMAC=98:03:9b:84:17:8a DstMAC=7c:d3:0a:69:53:dd EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..4310..] 
> Version=4 IHL=5 TOS=64 Length=4330 Id=16067 Flags=DF FragOffset=0 TTL=64 
> Protocol=TCP Checksum=17559 SrcIP=192.168.123.123 DstIP=10.10.10.10 
> Options=[] Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[..4278..] 
> SrcPort=19603 DstPort=8674 Seq=682579373 Ack=2588707368 DataOffset=8 
> FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false 
> CWR=false NS=false Window=115 Checksum=46928 Urgent=0 
> Options=[TCPOption(NOP:), TCPOption(NOP:), 
> TCPOption(Timestamps:2729995117/397747075 0xa2b86b6d17b52383)] Padding=[]}
> - Layer 4 (4278 bytes) = Payload 4278 byte(s)
> POST /xxxxxx
> Host: abc.com
> Connection: close
> Content-Length: 1169
> Accept: */*
> Accept-Encoding: deflate, gzip
> content-type: application/json; charset=utf-8
>
> [SOME JSON DATA]
>
> [ACK]  PACKET: 66 bytes, wire length 66 cap length 66 @ 2020-12-29 
> 16:33:57.229687 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..52..] 
> SrcMAC=7c:d3:0a:69:53:dd DstMAC=98:03:9b:84:17:8a EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..32..] Version=4 
> IHL=5 TOS=64 Length=52 Id=47331 Flags=DF FragOffset=0 TTL=55 Protocol=TCP 
> Checksum=58412 SrcIP=10.10.10.10 DstIP=192.168.123.123 Options=[] 
> Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[] SrcPort=8674 
> DstPort=19603 Seq=2588707368 Ack=682583651 DataOffset=8 FIN=false SYN=false 
> RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false 
> Window=260 Checksum=25578 Urgent=0 Options=[TCPOption(NOP:), 
> TCPOption(NOP:), TCPOption(Timestamps:397747075/2729995117 
> 0x17b52383a2b86b6d)] Padding=[]}
> [PSH,ACK]  PACKET: 324 bytes, wire length 324 cap length 324 @ 2020-12-29 
> 16:34:02.232296 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..310..] 
> SrcMAC=7c:d3:0a:69:53:dd DstMAC=98:03:9b:84:17:8a EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..290..] 
> Version=4 IHL=5 TOS=64 Length=310 Id=47332 Flags=DF FragOffset=0 TTL=55 
> Protocol=TCP Checksum=58153 SrcIP=10.10.10.10 DstIP=192.168.123.123 
> Options=[] Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[..258..] 
> SrcPort=8674 DstPort=19603 Seq=2588707368 Ack=682583651 DataOffset=8 
> FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false 
> CWR=false NS=false Window=260 Checksum=13502 Urgent=0 
> Options=[TCPOption(NOP:), TCPOption(NOP:), 
> TCPOption(Timestamps:397752076/2729995117 0x17b5370ca2b86b6d)] Padding=[]}
> - Layer 4 (258 bytes) = Payload 258 byte(s)
> HTTP/1.1 200 OK
> Content-Type: application/json; charset=utf-8
> Date: Tue, 29 Dec 2020 08:34:02 GMT
> Content-Length: 115
> Connection: close
>
>
> {"errno":0,"errmsg":"success","tipmsg":"OK","request_id":"12345678","data":{"lastsynctime":1609146356}}
>
> [ACK]  PACKET: 66 bytes, wire length 66 cap length 66 @ 2020-12-29 
> 16:34:02.232308 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..52..] 
> SrcMAC=98:03:9b:84:17:8a DstMAC=7c:d3:0a:69:53:dd EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..32..] Version=4 
> IHL=5 TOS=64 Length=52 Id=16070 Flags=DF FragOffset=0 TTL=64 Protocol=TCP 
> Checksum=21834 SrcIP=192.168.123.123 DstIP=10.10.10.10 Options=[] 
> Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[] SrcPort=19603 
> DstPort=8674 Seq=682583651 Ack=2588707626 DataOffset=8 FIN=false SYN=false 
> RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false 
> Window=119 Checksum=42650 Urgent=0 Options=[TCPOption(NOP:), 
> TCPOption(NOP:), TCPOption(Timestamps:2730000120/397752076 
> 0xa2b87ef817b5370c)] Padding=[]}
> [RST,ACK]  PACKET: 66 bytes, wire length 66 cap length 66 @ 2020-12-29 
> 16:34:02.23231 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..52..] 
> SrcMAC=7c:d3:0a:69:53:dd DstMAC=98:03:9b:84:17:8a EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..32..] Version=4 
> IHL=5 TOS=64 Length=52 Id=47333 Flags=DF FragOffset=0 TTL=55 Protocol=TCP 
> Checksum=58410 SrcIP=10.10.10.10 DstIP=192.168.123.123 Options=[] 
> Padding=[]}
> - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[] SrcPort=8674 
> DstPort=19603 Seq=2588707626 Ack=682583651 DataOffset=8 FIN=false SYN=false 
> RST=true PSH=false ACK=true URG=false ECE=false CWR=false NS=false 
> Window=260 Checksum=20315 Urgent=0 Options=[TCPOption(NOP:), 
> TCPOption(NOP:), TCPOption(Timestamps:397752076/2729995117 
> 0x17b5370ca2b86b6d)] Padding=[]}
> [RST]  PACKET: 60 bytes, wire length 60 cap length 60 @ 2020-12-29 
> 16:34:02.232429 +0800 CST
> - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..46..] 
> SrcMAC=7c:d3:0a:69:53:dd DstMAC=98:03:9b:84:17:8a EthernetType=IPv4 
> Length=0}
> - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..20..] Version=4 
> IHL=5 TOS=64 Length=40 Id=0 Flags=DF FragOffset=0 TTL=55 Protocol=TCP 
> Checksum=40220 SrcIP=10.10.10.10 DstIP=192.168.123.123 Options=[] 
> Padding=[]}
> - Layer 3 (20 bytes) = TCP {Contents=[..20..] Payload=[] SrcPort=8674 
> DstPort=19603 Seq=2588707626 Ack=0 DataOffset=5 FIN=false SYN=false 
> RST=true PSH=false ACK=false URG=false ECE=false CWR=false NS=false 
> Window=0 Checksum=30080 Urgent=0 Options=[] Padding=[]}
>
> Can anyone give me some guesses? Thanks!
>
> -- Eddix Chen
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/0506fd56-0bcc-4813-91bf-5d19b3b8ab48n%40googlegroups.com.

Reply via email to