def validatePacket(packet):

    if not IP.validateChecksumZero(packet[0:20]):
        return False, "IP"
    else:
        print "IP VALIDATION: SUCCESS"

    ip_header = IP.unpackHeader(packet[0:20])
    #Get Length of IP header
    ip_ver = ip_header[0] >> 4
    ip_header_length = ip_header[0] & 0xF
    ip_length = ip_header_length * 4

    tcp_packet = packet[ip_length:]
    pseudo = pack('!4s4sBBH', ip_header[8], ip_header[9], 0, socket.IPPROTO_TCP, len(tcp_packet))

    if not TCP.validateChecksumZero(pseudo + tcp_packet):
        return False, "TCP"
    else:
        print "TCP VALIDATION: SUCCESS"

    return True, ""
sender_socket.sendto(syn_packet, (DESTINATION_IP, DESTINATION_PORT))
#Time when the packet was sent
packet_sent_time = time.time()

#WAIT FOR A SYN_ACK
while True:
    try:
        packet = receiver_socket.recvfrom(65565)
        packet = packet[0]
        #print packet

        validation_status, faulty_packet = validatePacket(packet)

        if validation_status:
            #IP header bytes
            ip_header = IP.unpackHeader(packet[0:20])
            if socket.inet_ntoa(ip_header[8]) == DESTINATION_IP and socket.inet_ntoa(ip_header[9]) == SOURCE_IP:
                #Get Length of IP header
                ip_ver = ip_header[0] >> 4
                ip_header_length = ip_header[0] & 0xF
                ip_length = ip_header_length * 4

                tcp_header = TCP.unpackHeader(packet[ip_length: ip_length + 20])
                ack = (tcp_header[5] & 0x10) >> 4
                syn = (tcp_header[5] & 0x02) >> 1

                if ack == 1 and syn == 1 and tcp_header[0] == DESTINATION_PORT and tcp_header[1] == SOURCE_PORT and tcp_header[3] == (ACK_NUM + 1):
                    #SYN-ACK received
                    SEQ_NUM = tcp_header[2] + 1
                    SEQ_START = tcp_header[2]
                    ACK_NUM = tcp_header[3]