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/77a8961f-33da-48d3-9d19-371c21ff39e2n%40googlegroups.com.

Reply via email to