简体   繁体   中英

why receiving duplicated frames using sockets in python?

I make a simple client/server code to send/receive frames using sockets, but at the reception, i receive duplicated packets like this

> num seq= 4751 num seq= 4751 num seq= 4752 num seq= 4752 num seq= 4753
> num seq= 4753 num seq= 4754 num seq= 4754 num seq= 4755 num seq= 4755
> num seq= 4756 num seq= 4756 num seq= 4757 num seq= 4757 num seq= 4758
> num seq= 4758 num seq= 4759 num seq= 4759 num seq= 4760 num seq= 4760
> num seq= 4761 num seq= 4761 num seq= 4762 num seq= 4762 num seq= 4763
> num seq= 4763 num seq= 4764 num seq= 4764 num seq= 4765 num seq= 4765
> num seq= 4766 num seq= 4766 num seq= 4767 num seq= 4767 num seq= 4768
> num seq= 4768 num seq= 4769 num seq= 4769 num seq= 4770 num seq= 4770
> num seq= 4771 num seq= 4771 num seq= 4772 num seq= 4772 num seq= 4773
> num seq= 4773 num seq= 4774 num seq= 4774 num seq= 4775 num seq= 4775
> num seq= 4776 num seq= 4776 num seq= 4777 num seq= 4777 num seq= 4778

I couldn't understand why the packets are duplicated at reception !!??

this is the client code:

from socket import *
import binascii

#creation of the RAW socket
s=socket(AF_PACKET, SOCK_RAW)

# bind the socket to the interface
s.bind(("eth0",0))

# Ethernet header
src="\x01\x01\x01\x01\x01\x01"
dst="\x02\x02\x02\x02\x02\x02"
ethertype="74"  #type or length

# generate an infinite traffic 

i=0       # frame number

while True :
        payload=("0"*(100-len(str(i))))+str(i)
        cr=binascii.crc32(dst+src+ethertype+payload)
        res=''
        for j in range(4): # calculate the crc
            t=cr & 0xFF
            cr >>= 8
            res='%02X%s' % (t, res)
        s.send(dst+src+ethertype+payload+res)    # send the frame
        i+=1

And the server code is:

from scapy.all import *

def traiter(p) :

    k=str(p) #transform the frame to a string

    print "num seq=",int(k[14:112]) # print the sequence number

def main():

# intercept packet and send it to traiter

    sniff(iface="lo", prn=lambda x: traiter(x))

if __name__ == "__main__":
   sys.exit(main())

That's a normal behaviour: if source and destination are in the same machine, when you sniff on loopback interface, you capture exiting and entering packets! So packets are not actually duplicated.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM