do not ignore FIN tcp packet

This commit is contained in:
hebo
2019-09-27 16:48:47 +08:00
parent e2a924c776
commit b79e9f6867
3 changed files with 35 additions and 17 deletions

View File

@@ -20,13 +20,13 @@ import (
var (
DeviceName string
snifferPort int
inParallel bool
// inParallel bool
)
func init() {
flag.StringVar(&DeviceName, "interface", "eth0", "network device name. Default is eth0")
flag.IntVar(&snifferPort, "port", 3306, "sniffer port. Default is 3306")
flag.BoolVar(&inParallel, "in_parallel", false, "if capture and deal package in parallel. Default is false")
// flag.BoolVar(&inParallel, "in_parallel", false, "if capture and deal package in parallel. Default is false")
}
// networkCard is network device
@@ -93,21 +93,27 @@ func initEthernetHandlerFromPacp() (handler *pcap.Handle) {
}
func (nc *networkCard) Listen() (receiver chan model.QueryPiece) {
if inParallel {
nc.listenInParallel()
} else {
nc.listenNormal()
}
// if inParallel {
// nc.listenInParallel()
//
// } else {
// nc.listenNormal()
// }
nc.listenNormal()
return nc.receiver
}
func isFINPacket(data []byte) (isFIN bool) {
return
}
// Listen get a connection.
func (nc *networkCard) listenNormal() {
go func() {
aliveCounter := 0
handler := initEthernetHandlerFromPacpgo()
handler := initEthernetHandlerFromPacp()
for {
var data []byte
var ci gopacket.CaptureInfo
@@ -120,6 +126,18 @@ func (nc *networkCard) listenNormal() {
continue
}
// packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy)
packet := gopacket.NewPacket(data, handler.LinkType(), gopacket.NoCopy)
m := packet.Metadata()
m.CaptureInfo = ci
// send FIN tcp packet to avoid not complete session cannot be released
tcpPkt := packet.TransportLayer().(*layers.TCP)
if tcpPkt.FIN {
nc.parseTCPPackage(packet)
continue
}
// capture packets according to a certain probability
tcpCapturePacketRate := communicator.GetTCPCapturePacketRate()
if tcpCapturePacketRate <= 0 {
@@ -140,10 +158,6 @@ func (nc *networkCard) listenNormal() {
}
aliveCounter = 0
packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy)
m := packet.Metadata()
m.CaptureInfo = ci
m.Truncated = m.Truncated || ci.CaptureLength < ci.Length
nc.parseTCPPackage(packet)
}
}()