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)
}
}()

View File

@ -13,7 +13,6 @@ const (
var (
communicatePort int
// capturePacketRate float64
router = mux.NewRouter()
)
@ -21,15 +20,14 @@ var (
configMapLock sync.RWMutex
configMap map[string]configItem
catpurePacketRate *capturePacketRateConfig
catpurePacketRateVal float64
)
func init() {
catpurePacketRate = newCapturePacketRateConfig()
flag.IntVar(&communicatePort, "communicate_port", 8088, "http server port. Default is 8088")
var cpr float64
flag.Float64Var(&cpr, CAPTURE_PACKET_RATE, 0.01, "capture packet rate. Default is 0.01")
_ = catpurePacketRate.setVal(cpr)
flag.Float64Var(&catpurePacketRateVal, CAPTURE_PACKET_RATE, 0.01, "capture packet rate. Default is 0.01")
configMap = make(map[string]configItem)
}

View File

@ -11,6 +11,8 @@ import (
)
func Server() {
initConfig()
server := &http.Server{
Addr: "0.0.0.0:" + strconv.Itoa(communicatePort),
IdleTimeout: time.Second * 5,
@ -22,6 +24,10 @@ func Server() {
}
}
func initConfig() {
_ = catpurePacketRate.setVal(catpurePacketRateVal)
}
func outletCheckAlive(resp http.ResponseWriter, req *http.Request) {
mp := hu.NewMouthpiece(resp)
defer func() {